You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Introduce the first deterministic ADR enforcement layer in Project Standards 5.17.0 without turning the ADR authoring package into a semantic policy engine.
The proposed release boundary is:
package-declared provider input capture;
one generic read-only repository check command;
a new opt-in adr-conformance@1.0 package;
mechanical rule-scope containment;
three static checker kinds; and
one independently tested dogfood decision.
This is the foundation only. Applicability resolution, plan binding, behavioral evidence, waivers, authorization, rule lifecycle, and dual-baseline policy transitions remain later work.
Fresh repository context
Project Standards 5.16.0 is published. The ADR-related 5.17.0 train is already defined:
adr@1.5 must remain non-breaking so it can become the ordinary Catalog 5 default.
ADR 1.4 deliberately remains guidance-first. Its provider checks only the three required MADR headings and explicitly does not infer semantic scope from prose. The corpus assessment in docs/reviews/adr-conformance/2026-08-05-1941-adr-1-4-conformance-assessment.md demonstrates the resulting enforcement gap.
The control plane also still owns provider input selection in src/project_standards/control_plane/provider_inputs.py. That module states that its retirement path is payload-declared input shapes. A new adr-conformance package must not add another package-ID branch there.
Problem
Agents can read a correctly bounded ADR and still:
apply its rule to the wrong repository population;
target paths the ADR explicitly excluded;
miss an exact dependency, import, or path obligation;
treat an out-of-scope case as an exception;
produce a mechanical rule that governs more than the ADR; or
report conformance without evaluating every active static rule.
The platform can answer these questions mechanically, but it currently lacks a package-declared way to capture provider inputs and a generic local/CI command equivalent to MCP's aggregate read-provider behavior.
Proposed architecture
1. Keep ADR authoring and enforcement separate
Create a new consumer package rather than expanding adr@1.5 into an enforcement engine:
It is selected through a closed package option and declared as a referenced extension. The central lock records its path and digest without claiming or rewriting it.
The explicit capture section gives the control plane a fixed, generic location from which to derive the immutable snapshot before provider execution. The provider must verify that capture is no broader than the union of the decision boundaries and that every rule target is captured.
4. Add package-declared provider input capture
Add a generic capture declaration to a Standard Bundle Authoring successor and to executable provider declarations.
The exact names require specification, but the contract must provide deterministic expansion, root containment, symlink safety, regular-file checks, size limits, extension bytes and digest, and fail-closed findings.
Compatibility requirement:
New declarations take precedence.
Existing released payloads continue through the concentrated compatibility seam.
No new package-ID branch is permitted.
Full retirement of provider_inputs.py is deferred until supported families migrate through successors.
The authoritative default runs all applicable enabled validate, verify, and lint providers. drift-check remains explicit.
The command must:
use the same selected-package resolver, capture authority, and dispatcher as reconciliation and MCP;
aggregate findings deterministically;
support human and versioned JSON output;
be read-only;
provide distinct clean/findings/invocation exit categories; and
allow standard narrowing only for diagnostics, not the protected all-package CI invocation.
This is aggregate checking, not arbitrary provider dispatch, and remains compatible with ADR 0026's MCP surface.
6. Initial closed rule registry
Limit v1 to:
toml-value
toml-array-member
python-import-boundary
No rule may name shell commands, executables, Python symbols, plugins, policy expressions, or network resources.
7. Make scope containment the first guardrail
Before rule evaluation, prove:
the ADR document exists and its id/doc_type match;
the decision is active;
each rule ID is unique and ADR-scoped;
each rule target is contained by governed_paths;
no target intersects excluded_paths;
each target is included in the captured corpus;
capture is no broader than required decision scope; and
malformed, unsupported, or indeterminate contracts fail closed.
The provider does not infer scope from prose. Human review confirms the projection matches the ADR; the mechanical layer prevents the projection from silently governing more than it declares.
The first release protects ordinary implementation changes against an accepted candidate contract. It does not prove that a branch modifying the ADR, contract, package, and lock is semantically non-weakening.
For 5.17.0, those remain explicitly reviewed policy surfaces and the dogfood retains independent tests. A later release should add base/candidate policy evaluation, semantic rule digests, transition classification, and authorization-backed changes. This limitation must be documented rather than hidden.
Decisions required before specification
Separate adr-conformance package versus expanding adr.
extends = ["adr"] and the owning project ADR.
One fixed consumer-owned TOML contract for v1.
The initial referenced-extension-globs capture kind.
The three checker kinds.
ADR 0025 dogfood and retention of independent tests.
Final spelling of the aggregate CLI command.
Managed CI workflow versus command/composition only.
Acceptance of the v1 same-change policy limitation.
Confirmation that scaffold refresh stays a separate control-plane decision.
Summary
Introduce the first deterministic ADR enforcement layer in Project Standards 5.17.0 without turning the ADR authoring package into a semantic policy engine.
The proposed release boundary is:
adr-conformance@1.0package;This is the foundation only. Applicability resolution, plan binding, behavioral evidence, waivers, authorization, rule lifecycle, and dual-baseline policy transitions remain later work.
Fresh repository context
Project Standards 5.16.0 is published. The ADR-related 5.17.0 train is already defined:
adr@1.5.adr@1.5must remain non-breaking so it can become the ordinary Catalog 5 default.ADR 1.4 deliberately remains guidance-first. Its provider checks only the three required MADR headings and explicitly does not infer semantic scope from prose. The corpus assessment in
docs/reviews/adr-conformance/2026-08-05-1941-adr-1-4-conformance-assessment.mddemonstrates the resulting enforcement gap.The control plane also still owns provider input selection in
src/project_standards/control_plane/provider_inputs.py. That module states that its retirement path is payload-declared input shapes. A newadr-conformancepackage must not add another package-ID branch there.Problem
Agents can read a correctly bounded ADR and still:
The platform can answer these questions mechanically, but it currently lacks a package-declared way to capture provider inputs and a generic local/CI command equivalent to MCP's aggregate read-provider behavior.
Proposed architecture
1. Keep ADR authoring and enforcement separate
Create a new consumer package rather than expanding
adr@1.5into an enforcement engine:The
extendsedge requires its own project ADR and immutable decision evidence. Enablingadrmust not enable conformance automatically.2. Preserve the authority split
adr-conformancepayloadThe contract is a projection of an accepted decision, never a second or broader decision authority.
3. Use one consumer-owned contract in v1
Initial path:
It is selected through a closed package option and declared as a referenced extension. The central lock records its path and digest without claiming or rewriting it.
Recommended shape:
The explicit
capturesection gives the control plane a fixed, generic location from which to derive the immutable snapshot before provider execution. The provider must verify that capture is no broader than the union of the decision boundaries and that every rule target is captured.4. Add package-declared provider input capture
Add a generic capture declaration to a Standard Bundle Authoring successor and to executable provider declarations.
Candidate form:
The exact names require specification, but the contract must provide deterministic expansion, root containment, symlink safety, regular-file checks, size limits, extension bytes and digest, and fail-closed findings.
Compatibility requirement:
provider_inputs.pyis deferred until supported families migrate through successors.5. Add a generic repository check command
Recommended working surface:
The authoritative default runs all applicable enabled
validate,verify, andlintproviders.drift-checkremains explicit.The command must:
This is aggregate checking, not arbitrary provider dispatch, and remains compatible with ADR 0026's MCP surface.
6. Initial closed rule registry
Limit v1 to:
toml-valuetoml-array-memberpython-import-boundaryNo rule may name shell commands, executables, Python symbols, plugins, policy expressions, or network resources.
7. Make scope containment the first guardrail
Before rule evaluation, prove:
id/doc_typematch;governed_paths;excluded_paths;The provider does not infer scope from prose. Human review confirms the projection matches the ADR; the mechanical layer prevents the projection from silently governing more than it declares.
Invariants
Interaction with #127 and #128
Recommended sequencing:
adr@1.5.adr-conformance@1.0.The scaffold refresh decision remains separate. Conformance must not grant overwrite authority over create-only consumer files.
Dogfood
Use ADR 0025 because it already freezes deterministic obligations and has independent conventional tests:
mcp==2.0.0dependency pin;mcp_servermay importmcp;mcp_servicesimports neithermcpnormcp_server.Required negative controls:
mcpfrom a forbidden service path;Existing handwritten tests remain in 5.17.0 as independent evidence.
Acceptance criteria
Package and graph
adr-conformance@1.0is a complete immutable consumer payload.extends = ["adr"]relationship has accepted decision evidence.adralone changes nothing.Provider input authority
Contract and rules
Integration
validate_repoproduce equivalent findings.Release
adr@1.5,adr-conformance@1.0, and any internal authoring successor are advertised without altering released bytes.Explicit 5.17.0 exclusions
Known v1 limitation
The first release protects ordinary implementation changes against an accepted candidate contract. It does not prove that a branch modifying the ADR, contract, package, and lock is semantically non-weakening.
For 5.17.0, those remain explicitly reviewed policy surfaces and the dogfood retains independent tests. A later release should add base/candidate policy evaluation, semantic rule digests, transition classification, and authorization-backed changes. This limitation must be documented rather than hidden.
Decisions required before specification
adr-conformancepackage versus expandingadr.extends = ["adr"]and the owning project ADR.referenced-extension-globscapture kind.provider_inputs.py.Suggested implementation decomposition
adr-conformance@1.0package.References
standards/adr/versions/1.4/README.mddocs/reviews/adr-conformance/2026-08-05-1941-adr-1-4-conformance-assessment.mddocs/TODO.mdsrc/project_standards/control_plane/provider_inputs.pysrc/project_standards/package_contract/payload.pydocs/usage.md