12 KiB
Post-#856 Unary-Delta Conformance Decision
Status: Proposed decision / review required
Date: 2026-06-21
Scope: state_change.unary_delta
Depends on: PR #855, PR #856
Decision type: post-merge conformance lookback
1. Purpose
This document records a precise post-merge conformance lookback following the implementation of the diagnostic state_change.unary_delta seam in PR #855 and its subsequent isolation hardening in PR #856. The purpose of this lookback is to identify and document divergences between the merged codebase and the controlling specification, authorization, and preflight documents.
This record enables the project to make an explicit choice between:
- Ratifying the merged implementation shape as the new controlling decision, or
- Authorizing a narrow future correction PR to restore the original spec/preflight shape.
Recording this decision prevents residual taxonomy, SearchGate, ComputeBudgetPolicy, Workbench trace, or search work from building on top of unresolved architecture drift.
2. Current merged state
The diagnostic seam for state_change.unary_delta was introduced in PR #855 and hardened in PR #856. The current codebase successfully isolates this event type through:
- Cataloging the family under
state_change.unary_deltaingenerate/foundational_families.py. - Generating
ConstructionProposalrecords with a static status of"proposed". - Creating a
BoundRelationrepresenting the unary delta (attaching action cue, delta quantity, changed object, and direction). - Assessing the relation in
assess_unary_deltato yield aContractAssessment. - Verifying extensive negative controls (such as transfers, containment, and comparisons) in
tests/test_unary_delta_proposal.py.
However, the merged code deviates from the preflight design in key syntactic areas, such as the candidate organ naming, typed cue structures, quantity disposition boundaries, and proposal generation thresholds.
3. Controlling specification and preflight requirements
The design is governed by three controlling documents:
- Specification:
docs/specs/foundational-families/unary-state-change-delta.md - Authorization:
docs/sessions/unary-state-change-delta-authorization-2026-06-21.md - Preflight:
docs/sessions/unary-state-change-delta-preflight-2026-06-21.md
These documents specify that:
- The candidate organ name must be
"unary_delta_transition". - A family-local, typed
GroundedUnaryDeltaCueand aProblemFrame.unary_delta_cuesfield must be implemented. - The trigger condition of
QuantityKindDispositionmust remain strictly confined tobinding.quantity_entityto preserve the isolation boundary established in PR #853. - Recognition must be a closed lexical scan over exact cues (
gained/lost), producing a proposal even if downstream quantity or object mentions are missing, leaving the incompleteness to refuse downstream during contract assessment.
4. Conformance matrix
| Area | Controlling requirement | Merged implementation | Conformance status | Notes |
|---|---|---|---|---|
| Candidate organ name | candidate_organ = "unary_delta_transition" |
candidate_organ = "unary_delta" in generate/construction_affordances.py and generate/problem_frame_contracts.py |
divergent_requires_decision |
The merged codebase uses the shortened organ name. |
| Cue representation | Family-local typed GroundedUnaryDeltaCue class and ProblemFrame.unary_delta_cues field. |
Stored as generic BoundRole slots in the relation instead of a dedicated typed cue record. |
divergent_requires_decision |
The typed cue record class and field were bypassed. |
| QuantityKindDisposition boundary | Do not widen the trigger of QuantityKindDisposition beyond the binding.quantity_entity proposal. |
Modified _quantity_kind_dispositions in generate/problem_frame_builder.py to trigger from both binding.quantity_entity and state_change.unary_delta proposals. |
divergent_requires_decision |
Widened the trigger condition, encroaching on the PR #853 isolation boundary. |
| Recognition strategy | Closed lexical recognizer over cue inventory (gained/lost) that proposes even on missing quantity/object. |
Uses _UNARY_DELTA_RE in _unary_delta_proposals in generate/problem_frame_builder.py which requires subject, cue, quantity, and object. Does not propose if any of these are missing. |
divergent_requires_decision |
Missing roles cause proposal omission (no proposal is generated) rather than assessment refusal. |
| Proposal/assessment authority | ConstructionProposal remains status "proposed". ContractAssessment is the sole runnable authority. No serving/teaching path changes. |
Status is strictly "proposed". No serving, runtime, vault, recall, or teaching mutation paths were added. |
conformant |
Safety boundary of proposal-first structure is fully preserved. |
5. Safety baseline preserved by #855/#856
Despite the syntactic divergences, PR #855 and PR #856 successfully maintained the project's security and architecture safety baselines:
- No serving impact:
diagnostic_only=Trueandserving_allowed=Falseare enforced on the family registry and catalog entries. - Proposal-first discipline: Proposals carry no runnable authority. The status remains
"proposed". - No authority leak: No legacy math, semantic-state ledger, or derivation graph is imported. This is locked by a static AST import guard in
tests/test_unary_delta_proposal.py. - Strong test-hardened isolation: PR #856 added comprehensive tests proving that the unary-delta path refuses or avoids proposing for transfers, containment movement, comparative phrasing, lists, passive voice, percent/rate context, and negation.
6. Divergences requiring decision
The project must reconcile the following points of unratified conformance drift:
- Organ naming: The short name
"unary_delta"diverges from"unary_delta_transition". - Missing GroundedUnaryDeltaCue: The lack of a typed cue record deviates from the structural representation intended in the specs, leaving event attributes embedded within generic bound roles.
- QuantityKindDisposition trigger widening: By allowing
state_change.unary_deltaproposals to triggerQuantityKindDispositiongeneration, the boundary established in PR #853 is no longer strictly isolated tobinding.quantity_entityproposals. - Regex-driven proposal gating: Rather than proposing immediately upon detecting the cue word and letting downstream missing details fail-closed at assessment, proposal creation itself is gated on the full regex match. Consequently, sentences like
"Tom gained 3."or"Tom gained apples."fail to generate a proposal, bypassing contract assessment instead of yielding a refused assessment.
7. Decision options
Option A — Ratify merged implementation shape
Meaning: The project explicitly accepts the merged representation:
- Shortened candidate organ name (
"unary_delta"). - Omission of the typed
GroundedUnaryDeltaCue(relying on generic roles). - The widened triggering boundary for
QuantityKindDisposition. - The regex-gated proposal logic that suppresses proposal emission for incomplete inputs.
- Relying on PR #856 tests as the effective guardrail.
Consequences:
- The spec and preflight documents must be updated in a future docs-only PR or ADR amendment to match the merged code.
- Residual taxonomy and downstream work will target the merged implementation.
- No code correction PR is required.
Risks:
- The original specifications become stale unless actively amended.
- Future agents may consult the older documents and construct conflicting code.
- Candidate organ naming remains less semantically precise.
Option B — Authorize narrow correction PR
Meaning: The project holds the original spec, authorization, and preflight documents as controlling. It authorizes a narrow, future implementation correction PR to align the code with the spec:
- Rename
candidate_organto"unary_delta_transition". - Implement
GroundedUnaryDeltaCueandProblemFrame.unary_delta_cues. - Restore the strict
QuantityKindDispositionboundary (triggering only onbinding.quantity_entityproposals). - Transition to a closed lexical cue recognizer that creates a proposal upon detecting
"gained"or"lost"regardless of missing quantity/object details, shifting the completeness checks entirely toassess_unary_delta.
Consequences:
- Residual taxonomy and downstream integration wait until the correction PR lands.
- The correction PR must preserve all PR #856 isolation tests.
- No behavior widening is permitted.
Risks:
- Potential code churn after achieving a stable, green, and test-hardened state.
- Care must be taken to prevent the correction PR from drifting into a broader feature rewrite.
Option C — Defer residual/search work until decision
Meaning: The project explicitly records the unresolved drift and suspends all downstream work (e.g., residual taxonomy, SearchGate, ComputeBudgetPolicy, or Workbench traces) until a formal decision between Option A and Option B is ratified.
Consequences:
- Safest posture from a governance perspective.
- Temporarily slows down the development roadmap.
- Prevents building new architecture on top of an ambiguous contract.
8. Recommendation
We recommend Option B (Authorize narrow correction PR) or Option C (Defer decision).
Reasoning:
The controlling specification and preflight documents were explicit, and downstream structures like ContractResidual will lock these labels and types into a long-term contract. Reconciling the implementation to match the spec before establishing the contract is safer than ratifying the drift. Widening the QuantityKindDisposition trigger also represents unresolved boundary drift from the #853 isolation posture and should be resolved before residual contracts depend on it.
9. Required follow-up depending on decision
- If Option A is selected:
- Amend
docs/specs/foundational-families/unary-state-change-delta.mdanddocs/sessions/unary-state-change-delta-preflight-2026-06-21.mdto reflect the current implementation.
- Amend
- If Option B is selected:
- Open a ticket authorizing a narrow correction PR.
- Implement the correction under a fresh branch, keeping all isolation tests intact.
- If Option C is selected:
- Retain this document in a pending state and do not merge downstream integrations.
10. Residual/SearchGate/Workbench freeze
Until this conformance decision is resolved and explicitly ratified:
- Do not implement
ContractResidual. - Do not implement SearchGate.
- Do not implement ComputeBudgetPolicy.
- Do not implement GeometricSearchRun.
- Do not implement Workbench
ProblemFrame/ContractAssessmenttraces. - Do not define residual taxonomy over unary-delta labels.
- Do not treat the current implementation's drift as tacit ratification.
This is a sequencing guard to ensure architectural consistency.
11. Non-goals
This lookback PR does not include or permit:
- Modifying any source code files under
generate/or elsewhere. - Modifying or adding unit tests under
tests/. - Correcting any implementation drift within this PR.
- Implementing
ContractResidualor defining residual taxonomy. - Implementing SearchGate, ComputeBudgetPolicy, or GeometricSearchRun.
- Modifying or touching the Workbench UI or server logic.
- Altering serving paths or allowing serving for this family.
- Mutating teaching, proposal, evaluation, or report artifacts.
- Changing any package, policy, identity, recall, vault, field, or algebra files.
12. Validation
Validation of this docs-only PR consists of verifying workspace integrity:
- Verify that no code or test files are modified:
git diff --name-only origin/main...HEAD - Ensure HEAD matches origin/main except for this new document.
- Verify the git workspace contains no uncommitted files:
git status --short