Case study · v1.0 · published 2026-04-29
adacompliancedocs, the validation-gate axis.
Fifth internal audit under The Integrity Framework v1.0. ADAComplianceDocs introduced a structurally new Layer 2 shape: customer-attested status that cannot publish until a system-verified gate passes. The third C3 axis, codified in v1.9.0.
Source documents are public: adacompliancedocs' INTEGRITY.md and audits/tif-compliance.md.
What was audited
adacompliancedocs is a Startvest LLC product. ADA / WCAG compliance documentationtooling — not certifications. Court-ready good-faith effort record. Customer-published statements; customer-resolved audits. The platform never sells “your site is compliant.” Built on the inverse premise of overlay-vendor failures (accessiBe et al.).
ADA / WCAG is the most failure-prone trust category in the framework's design. That category pressure is also why ADAComplianceDocs has the strongest Layer 1 framing in the portfolio.
Headline result
20 dimensions · Layer 1 vetoes (6) + Layer 2 constraints (7) + Layer 3 guardrails (7)
14
Pass
5
Partial / Needs update
1
Out-of-segment
0
Fail
Mechanical: 14/14 integrity-cli rules passed after corrections (5 base-id collision renames, Outstanding Risks ticket-ref backfill, Recent Changes sidecar assertions for high-value claims). The most consequential structural element in the entire portfolio's compliance posture — the conformance-claim guard at src/lib/statements.ts — is mechanically validated.
The headline finding: customer-attestation-validation-gate
ADAComplianceDocs introduced a structurally new Layer 2 shape the framework hadn't previously modeled. The product's most consequential CI rule (CRIT-AD-CONFORMANCE-CLAIM-GUARD) blocks Platform_Statements.conformanceStatus = 'full' publishes when critical or serious axe-core findings remain open. Override permitted via an explicit acknowledgeOpenFindings=true parameter, but audit-logged.
Customer-attested status. But the publish path must reference a system-verified validation gate before it can persist.
This is structurally distinct from the existing two C3 axes:
v1.4.0
Output-attestation provenance
Says
this customer-facing attestation references customer-submitted evidence
Example
FieldLedger's RateSnapshotJson on persisted rate letters
v1.8.0
Input-data provenance
Says
this data is labeled as customer-attested vs system-derived
Example
Hireposture's customer_attested enum on Hireposture_AuditFindings.source
v1.9.0 (this audit)
Customer-attestation validation gate
Says
this customer-attested data cannot publish until system-verified evidence supports it
Example
adacompliancedocs's checkConformanceGuard at src/lib/statements.ts
Provenance markers say where customer-attested data came from. Validation gates say when it may publish. Different verbs, different runtime semantics. The principle is genuinely new, not a calibration of v1.8.0.
Framework revision: v1.9.0
Added CRIT-SV-CUSTOMER-ATTESTATION-VALIDATION-GATE to the base manifest. Co-occurrence rule:
- Trigger. Persisted entity carrying a customer-attested status field —
conformanceStatus,complianceStatus,attestationStatus,certificationStatus,wcagConformance, etc., declared on a Statement / Conformance / ComplianceClaim entity. - Required. A validation-gate function pattern (
checkConformance,conformanceGuard,validateBeforePublish,acknowledgeOpenFindings,ConformanceGuardBlockedError, etc.) anywhere in the corpus. - Vacuous-passwhen no trigger fires. Most products don't have customer-attestation publish flows. Only compliance-category products activate this rule.
Validated backwards-compatible against FL/CL/IL/HP: no trigger fires (none of them have customer-attested status fields). ADA: trigger fires + gate present + passes. Trigger pattern was tightened during validation when an FL Zod schema definition (certificationStatus = z.enum(...)) accidentally activated the rule despite FL having no customer-attestation flow. Calibration-fragility lesson: the trigger pattern list will need ongoing widening as future audits surface edge cases.
Open items at audit close
Seven remediation tickets opened on the adacompliancedocs repo:
Finalize MSA refund-on-failure clause and roll into standard template
Same shape as FL/CL/HP P0. Counsel-blocked.
UI badging for customer-attested vs system-verified
Schema-layer isolation passes. The conformance guard ships. UI-layer visual distinction is the remaining gap.
Statutory retention floor for audit/remediation evidence
Currently soft-delete + 30-day post-cancellation. No N-year retention floor for audit-trail records that a court inquiry might reach.
auditor_readonly role for external accessibility consultants / counsel
DSAR export covers self-export. External CPA / counsel needs scoped read-only mode.
integrity@startvest.ai mailbox + external counsel SLA
Same shared resolution as FL/CL/IL/HP.
Engage accountability community
Disability rights advocates, accessibility consultants, plaintiff attorneys representing accessibility complainants.
Rename CRIT-SV-CONFORMANCE-CLAIM-GUARD → CRIT-AD-CONFORMANCE-CLAIM-GUARD
Per CRIT-SV-NO-BASE-ID-OVERRIDE, the SV namespace is reserved for the base manifest. The rule was renamed during this audit; ticket closes the change.
What this teaches
- Layer 2 Constraint 3 has at least three distinct axes. Provenance (where data came from), provenance (whether data is labeled customer-attested), and validation gate (whether customer-attested data may publish when system-verified evidence is missing). All three serve the same goal of keeping customer-attested data isolated from system-derived. They operate at different layers with different runtime semantics.
- Promotions to base happen only when a per-product rule reflects a portable principle. The conformance-claim guard had been a per-product rule on adacompliancedocs. Promoting it to base required confirming the principle generalizes (a customer-attested status field SHOULD have a publish-time validation gate, not just on this one product).
- Trigger calibration is fragile and ongoing. The first-cut v1.9.0 trigger pattern false-positived on FL's Zod schema definition. The fix tightened to require Zod-object-field syntax. Future products will surface more edge cases. Calibration is iterative — that is how the framework evolves under reality, not a sign of brittleness.
Reproducibility
# from a clone of the integrity-cli repo node bin/integrity.mjs check ../adacompliancedocs --format=json \ > ../adacompliancedocs/audits/tif-compliance.cli-output.json
Changelog
- 2026-04-29 — v1.0. Initial publication. Drove base manifest v1.9.0 — third C3 axis added (
CRIT-SV-CUSTOMER-ATTESTATION-VALIDATION-GATE).