# HANDOFF — GPT-5.5 — 2026-06-20

## Agent and Session

- **Agent:** gpt55
- **Date:** 2026-06-20
- **Reasoning effort used:** high
- **Grok Build mode used:** Headless
- **Session entry point:** implement the first PR from the semantic-substrate problem-solving master plan: close proportional-decrease contracts and make readiness obligation-sound without touching serving or derivation organs

---

## Smoke Suite + Bootstrap Status

```text
Read before editing:
- GPT55.md
- AGENTS.md
- docs/specs/runtime_contracts.md
- HANDOFF-gpt55-2026-06-20.md (prior planning handoff, now superseded by this file)
- ADR-0223 audit/session pack and targeted ProblemFrame files/tests

core test --suite smoke -q
zsh: command not found: core

uv run python -m core.cli test --suite smoke -q
108 passed in 121.54s (0:02:01)
```

`core-bootstrap` skill was not available in this session; bootstrap was completed manually.

---

## Modules Touched

| File | Change type | Summary |
|---|---|---|
| `generate/problem_frame.py` | modified | extended `BoundQuestionTarget` with typed operator/state/direction validation so delta-decrease targets are structurally representable |
| `generate/problem_frame_builder.py` | modified | added narrow `decrease_to_fraction` binding, copular half-partition strengthening, canonical entity grounding, and richer bound target detection |
| `generate/problem_frame_contracts.py` | modified | added `assess_fraction_decrease`; tightened `percent_partition` to require forward aggregate topology, original whole provenance, and explicit blocker codes |
| `scripts/gsm8k_problem_frame_adequacy.py` | modified | surfaced blocker sets and blocker-combination aggregates by organ |
| `scripts/gsm8k_substrate_morphology.py` | modified | surfaced per-organ blockers and kept non-runnable decrease cases on a substrate contract-gap recommendation instead of a serving-organ recommendation |
| `tests/test_problem_frame_builder.py` | modified | added proportional-decrease binding/span tests |
| `tests/test_problem_frame_contracts.py` | replaced | added positive/negative obligation tests for fraction decrease and percent partition |
| `tests/test_problem_frame_skeleton.py` | modified | added `BoundQuestionTarget` validation coverage |
| `tests/test_gsm8k_problem_frame_adequacy.py` | modified | added blocker-by-organ/blocker-combination adequacy coverage |
| `tests/test_gsm8k_morphology_missing_kernel_labels.py` | modified | added morphology contract-gap recommendation coverage |

---

## Invariants Verified (Versor Coherence Guardian + Core)

| Invariant | Check performed | Result | Notes |
|---|---|---|---|
| `||F * reverse(F) - 1||_F < 1e-6` (core closure) | Scope review + smoke suite rerun | Preserved | No algebra/field/runtime field-op code touched |
| versor_apply / cga_inner exactness | Manual sweep of touched files/imports | Preserved | No recall/ranking/operator-path changes |
| Normalization boundaries respected | Pre-edit sweep + patch review | Preserved | No normalization added outside approved construction/IR boundary |
| No approximate recall (ANN/HNSW/cosine) | Import/call-site sweep on touched path | Preserved | Diagnostic path remains exact/deterministic |
| Claim status transitions via review gates only | Scope review | Preserved | Teaching/review/proposal paths untouched |
| Safety/identity pack immutability | Scope review | Preserved | No pack, manifest, policy, identity, or recall edits |
| INV-21 / INV-24 / INV-29 (Vault & epistemic) | Scope review + serving parity | Preserved | No memory mutation or serving-path widening |
| Wrong-zero serving | Direct runner `build_report()` checks | Preserved | Train `30/20/0`, holdout `5/495/0`, `wrong_ids == []` |
| Readiness truthfulness | Targeted adequacy reruns | Improved | Train runnable `1 -> 2`; holdout runnable `1 -> 0`; `0393` now blocked |

---

## Subagent / Arena Reconciliation (if applicable)

- Number of subagents spawned: 0
- Each subagent independently verified versor closure? (Yes/No): N/A
- How were results reconciled before merge? N/A

---

## Tests Run

```bash
# exit 0
uv run python -m pytest -q \
  tests/test_problem_frame_builder.py \
  tests/test_problem_frame_contracts.py \
  tests/test_gsm8k_problem_frame_adequacy.py \
  tests/test_gsm8k_morphology_missing_kernel_labels.py \
  tests/test_kernel_no_new_legacy_derivation_surfaces.py

# exit 0
uv run python -m pytest -q \
  tests/test_problem_frame_builder.py \
  tests/test_problem_frame_contracts.py \
  tests/test_problem_frame_skeleton.py \
  tests/test_gsm8k_problem_frame_adequacy.py \
  tests/test_gsm8k_morphology_missing_kernel_labels.py \
  tests/test_kernel_no_new_legacy_derivation_surfaces.py

# exit 0
uv run python -m core.cli test --suite smoke -q

# exit 0
uv run python -m scripts.gsm8k_problem_frame_adequacy \
  --cases evals/gsm8k_math/train_sample/v1/cases.jsonl

# exit 0
uv run python -m scripts.gsm8k_problem_frame_adequacy \
  --cases evals/gsm8k_math/holdout_dev/v1/cases.jsonl

# exit 0
uv run python - <<'PY'
from evals.gsm8k_math.train_sample.v1.runner import _CASES_PATH, _load_cases, build_report
r = build_report(_load_cases(_CASES_PATH))
print(r["counts"])
print([x["case_id"] for x in r["per_case"] if x["verdict"] == "wrong"])
PY

# exit 0
uv run python - <<'PY'
from evals.gsm8k_math.holdout_dev.v1.runner import build_report
r = build_report()
print(r["counts"])
print([x["case_id"] for x in r["per_case"] if x["verdict"] == "wrong"])
PY

# exit 0
git diff --check
git status --short
git diff --name-only origin/main...
```

Key outcomes:

- train adequacy `contract_runnable_count == 2`
- runnable train cases are `gsm8k-train-sample-v1-0005` and `gsm8k-train-sample-v1-0046`
- holdout adequacy `contract_runnable_count == 0`
- `gsm8k-holdout-dev-v1-0393` now blocks with inverse/original-whole topology reasons
- serving unchanged: train `{'correct': 30, 'wrong': 0, 'refused': 20}`, holdout `{'correct': 5, 'wrong': 0, 'refused': 495}`

---

## Open Tasks / Next Session Entry Point

1. Inspect whether any non-0046 percent-partition candidates are now worth a narrower contract split instead of accumulating blocker lists on one forward organ.
2. Decide whether the next substrate PR should introduce explicit typed gap records (`PF-*` codes as first-class data) or keep using stable blocker strings until the construction catalog lands.
3. If a future PR starts typed adapter work, consume `fraction_decrease` only from `ProblemFrame` facts and do not reparse raw text inside any adapter or derivation organ.

---

## Known Hazards / Do Not Touch

- Do not edit `generate/derivation/*` or `generate/math_candidate_graph.py` to “finish” this slice. This PR is diagnostic-only and already proved serving parity.
- The new builder logic is intentionally narrow. Do not generalize `decrease_to_fraction` into `decrease by`, percent change, or affine fraction comparison without a separate contract/confuser pack.
- `percent_partition` is now deliberately stricter. A runnable-count drop elsewhere is acceptable if it removes false readiness; do not loosen obligations to make the number larger.
- `HANDOFF-gpt55-2026-06-20.md` was replaced; do not rely on the earlier planning-only contents.

---

## Architectural Decisions Made This Session

- `BoundQuestionTarget` now carries typed operator/state/direction, with validation that blocks illegal delta/final combinations at construction time.
- `decrease_to_fraction` is represented as a span-grounded `BoundRelation` in `ProblemFrame`, not as a derivation-organ shortcut.
- Readiness is keyed to exact grounded IDs from the frame. Repeated entity mentions are canonicalized at relation construction so contracts can match by identity rather than lowercase text equality.
- `percent_partition` requires a forward aggregate target and an original whole bound before subgroup events. Final-state/inverse prompts are blocked rather than treated as forward partition.
- Adequacy and morphology reports now expose blocker combinations by organ, making false readiness auditable without touching serving.

---

## What Must Not Be Forgotten

The substantive result of this session is not just “0005 runnable.” It is that `runnable` now means obligation-closed from `ProblemFrame` evidence alone: `0005` closes through `decrease_to_fraction`, `0046` closes only under explicit complementary-subgroup topology, and `0393` is blocked because its target is inverse/original-whole rather than a forward aggregate.

**Prompt Library Reference**: See `docs/core-rd-base-prompts.md` (especially sections #7 Standing Loop Axiom Check, #8 PR Merge-Readiness Audit, and #9 Grok Build Implementation Session). Use them as standing prefixes.

---

## Skills Used This Session

- core-bootstrap: not available
- versor-coherence-guardian: not available
- pre-edit-sweep: manual import/call-site sweep completed
- claim-proposal-guardian: not needed
- Other: none

---

## Authorization Addendum — `binding.quantity_entity` foundational slice

### Agent and Session

- **Agent:** gpt55
- **Date:** 2026-06-20
- **Reasoning effort used:** high
- **Grok Build mode used:** Headless
- **Session entry point:** authorize, but do not implement, the first bounded
  diagnostic proposal-first slice for `binding.quantity_entity`
- **Branch:** `docs/kernel-authorize-quantity-entity-slice`
- **Base:** `origin/main` at `a266324e` (merged PR #844)

### Bootstrap and base proof

The session read `GPT55.md`, `AGENTS.md`, `docs/specs/runtime_contracts.md`, and this
current handoff before editing. The branch was created in a fresh worktree
directly from fetched `origin/main`. `HEAD` and `origin/main` both resolved to
`a266324eea5adf739b7d4e509a994c5425334b65`; the worktree was clean. The base
contained the #844 merge, `_PROPOSAL_FIRST_FAMILIES`, and the
`make_proposal()` rejection fence for both migrated families.

```text
uv run python -m core.cli test --suite smoke -q
108 passed in 126.15s (0:02:06)
```

### Modules touched

| File | Change type | Summary |
|---|---|---|
| `docs/sessions/quantity-entity-foundational-slice-authorization-2026-06-20.md` | new | Defines the sole bounded future implementation authority, proposal-first seam, roles/evidence obligations, closure/refusal conditions, confuser suite, acceptance gates, validation, and next-PR brief. |
| `docs/specs/foundational-families/quantity-entity-binding.md` | modified | Replaces the unconditional implementation prohibition with a narrow link to the controlling authorization while retaining non-serving status. |
| `HANDOFF-gpt55-2026-06-20.md` | modified | Adds this continuity record. |

### Invariants verified

- **Field closure:** Preserved by scope. No algebra, field, propagation,
  normalization, Vault, or runtime field-state path was modified.
- **Proposal-first authority:** The authorization requires proposals to begin
  with `status="proposed"`; exact bindings ground; a separate
  `ContractAssessment` alone reports diagnostic runnable/refused.
- **#844 fence:** `make_proposal()` is explicitly forbidden for the new family;
  future dispatch requires a pre-existing proposal. Existing #841/#842 families
  and their dispatch remain out of scope.
- **Diagnostic-only / no serving:** The authorized future proposal must retain
  `diagnostic_only=True` and `serving_allowed=False`; this PR changes no code or
  serving path.
- **Open-world truthfulness:** Ambiguity and absent evidence require refusal.
  Missing unit evidence cannot be converted into a count claim, and no
  `determine(answer=False)` path is authorized.
- **Exact evidence:** Closure requires exact source-backed quantity, entity,
  binding, and optional-unit spans equal to original text slices.
- **No broad parser / universal IR:** The future slice is bounded to existing
  local `ProblemFrame`, `GroundedScalar`, `GroundedMention`, `GroundedUnit`, and
  `MentionBinding` evidence.
- **Wrong-zero:** No eval or serving files changed. The future implementation
  brief requires train and holdout `wrong_ids == []`.

### Subagent / Arena reconciliation

- Number of subagents spawned: 0
- Each subagent independently verified versor closure: N/A
- Reconciliation: N/A

### Tests run

```bash
# exit 0 — 108 passed
uv run python -m core.cli test --suite smoke -q

# exit 0 — 28 passed
uv run python -m pytest -q \
  tests/test_foundational_families.py \
  tests/test_construction_affordances.py \
  tests/test_construction_proposal_seam.py

# exit 0
git diff --check
```

### Open tasks / next session entry point

1. Merge this authorization PR before beginning implementation.
2. For the next PR, use the copy-paste brief at the end of the authorization
   document and prove the merged authorization is present on fresh
   `origin/main`.
3. Do not implement `state_change.transition`; it requires separate authority.

### Known hazards / do not touch

- The authorization does not permit generic entity extraction, broad noun
  parsing, a universal IR, event semantics, answer production, or serving.
- `quantity_kind` must be positively grounded. Unit absence alone is not proof
  of a count construction.
- Local quantity/entity grounding inside a state-change sentence does not
  authorize transition recognition.
- Do not change derivation organs, `generate/math_candidate_graph.py`, eval or
  sealed artifacts, reports, packs, policy, identity, recall, Vault, field,
  algebra, or serving runtime under this authorization.

### Architectural decision

The first family is a provenance-preserving local bipartite binding with a
conjugate assessment, not an entity parser. Proposal and assessment remain
separate authorities: proposal carries a hypothesis forward; assessment
opposes it when topology or evidence is not uniquely closed.

### What must not be forgotten

This authorization is effective only after merge and only for
`binding.quantity_entity`. It authorizes one diagnostic proposal-first slice;
it does not authorize `state_change.transition`, serving, general entity
extraction, or broad parsing.

**Prompt Library Reference**: See `docs/core-rd-base-prompts.md` (especially
sections #7 Standing Loop Axiom Check, #8 PR Merge-Readiness Audit, and #9 Grok
Build Implementation Session). Use them as standing prefixes.

### Skills used

- core-bootstrap: unavailable; checklist completed manually
- versor-coherence-guardian: unavailable; closure preserved by docs-only scope
  and smoke validation
- pre-edit-sweep: completed manually over ADRs, specs, typed substrate,
  proposal/assessment seams, and focused tests
- claim-proposal-guardian: unavailable; proposal authority and #844 fence
  verified manually and with focused tests
- Other: none

---

## PR #841 Addendum — feat(kernel): route proportional-decrease through proposal-first seam

### Agent and Session

- **Agent:** gpt55
- **Date:** 2026-06-20
- **Reasoning effort used:** high
- **Grok Build mode used:** Headless
- **Session entry point:** Migrate only `proportional_change.decrease_to_fraction` from assessment-backed proposal synthesis to the ADR-0223/0224 proposal-first construction seam without changing serving or derivation.
- **Branch:** `feat/kernel-proportional-decrease-proposal-first`
- **Base:** `origin/main` at `168c9f26ac3deb8037d4eb7bca77c33dc9d5ff62`

### Smoke Suite + Bootstrap Status

```text
uv run python -m core.cli test --suite smoke -q
108 passed in 123.41s (baseline)
108 passed in 123.05s (post-edit)
```

The GPT55.md startup checklist was completed manually. The Codex worktree was clean and `HEAD == origin/main` before edits. `/Users/kaizenpro/Projects/core` was not modified, stashed, reset, cleaned, or reconciled.

### Modules Touched

| File | Change type | Summary |
|---|---|---|
| `generate/construction_affordances.py` | modified | Added a pre-assessment catalog proposal factory; proposals now carry immutable role obligations and enforce diagnostic-only / serving-disallowed posture. Retained the assessment-backed adapter only for unmigrated catalog paths. |
| `generate/problem_frame.py` | modified | Let `ProblemFrameBuilder` accumulate proposals before relation binding. |
| `generate/problem_frame_builder.py` | modified | Produces the proportional-decrease proposal from the exact existing surface chunk before mention/relation binding and assessment; preserves assessment-backed traces for other families. |
| `generate/problem_frame_contracts.py` | modified | Routes fraction-decrease assessment from proposal metadata read-only while leaving `assess_fraction_decrease` obligations unchanged. |
| `tests/test_construction_affordances.py` | modified | Covers the pre-assessment factory, catalog role obligations, and serving posture. |
| `tests/test_proportional_decrease_proposal.py` | modified | Proves proposal-before-assessment order, exact span grounding, proposal-driven dispatch, unchanged contract refusal, and confuser blocking. |
| `HANDOFF-gpt55-2026-06-20.md` | modified | Added this PR #841 continuity record. |

### Invariants Verified

- **Field closure:** Preserved by construction. No algebra, field, propagation, normalization, vault, or runtime field-state code changed.
- **Exact recall:** Preserved. No recall path, cosine, ANN, HNSW, or stochastic retrieval was added.
- **Proposal/binding/contract separation:** The proposal begins as `status="proposed"`; only `ContractAssessment` determines runnable/refused state from bound relations and question-target evidence.
- **Catalog and serving gates:** Proposal role obligations and posture come from the existing catalog; `diagnostic_only=True` and `serving_allowed=False` are enforced on the proposal type.
- **Controlled migration:** Only proportional decrease is proposal-first. Percent partition retains its existing assessment-backed trace; no foundational family gained implementation authorization.
- **No universal IR / no live-CGA claim:** The patch reuses `ConstructionProposal`, `ProblemFrame`, `BoundRelation`, and `ContractAssessment`; it adds no new carrier and makes no substrate-retrieval claim.
- **Serving parity:** Train remained `30 correct / 20 refused / 0 wrong`; holdout remained `5 correct / 495 refused / 0 wrong`; both wrong-id lists were empty.
- **Diagnostic parity:** Train remained 2 runnable contracts (`0005`, `0046`); holdout remained 0 runnable contracts.

### Subagent / Arena Reconciliation

- Number of subagents spawned: 0
- Each subagent independently verified versor closure: N/A
- Reconciliation: N/A

### Tests Run

```bash
# exit 0 — 55 passed
uv run python -m pytest -q \
  tests/test_construction_affordances.py \
  tests/test_foundational_families.py \
  tests/test_problem_frame_builder.py \
  tests/test_problem_frame_contracts.py \
  tests/test_proportional_decrease_proposal.py \
  tests/test_kernel_no_new_legacy_derivation_surfaces.py

# exit 0 — 108 passed
uv run python -m core.cli test --suite smoke -q

# exit 0 — serving parity
# train: {'correct': 30, 'wrong': 0, 'refused': 20}; wrong_ids: []
# holdout: {'correct': 5, 'wrong': 0, 'refused': 495}; wrong_ids: []

# exit 0 — diagnostic parity
# train contract_runnable_count: 2; ids: 0005, 0046
# holdout contract_runnable_count: 0

# exit 0
uv run python -m compileall -q \
  generate/construction_affordances.py \
  generate/problem_frame.py \
  generate/problem_frame_builder.py \
  generate/problem_frame_contracts.py

# exit 0
git diff --check
```

### Open Tasks / Next Session Entry Point

1. Review the six implementation/test files and publish PR #841 with the brief's required body sections.
2. Keep percent partition assessment-backed until a separately authorized proposal-first migration.

### Known Hazards / Do Not Touch

- Do not map `ConstructionProposal.status` to fraction assessment output again; that recreates the assessment-first inversion.
- Do not generalize the reused `decrease to <fraction> of` recognizer into generic state change, acquisition, or transaction behavior.
- Do not connect foundational-family registry metadata to runtime authorization or serving.
- Do not edit derivation, candidate graph, eval cases, reports, packs, policy, identity, recall, field, or algebra for this slice.

### Architectural Decision

The proposal is the construction hypothesis, not a cached verdict. It carries the catalog's obligations and exact motivating chunk. `BoundRelation` grounds those obligations, and the existing `ContractAssessment` remains the corrective/conjugate stage that closes or refuses the hypothesis. Other families are deliberately left on the legacy assessment-backed adapter to keep this migration singular.

### What Must Not Be Forgotten

PR #841 proves the ordering `surface chunk → proposed construction → span-grounded relation → ContractAssessment` for proportional decrease only. A positive proposal is not serving authorization, is not a runnable verdict, and is not evidence that general CGA/substrate retrieval is live.

### Skills Used

- core-bootstrap: unavailable; checklist completed manually
- versor-coherence-guardian: unavailable; closure preserved by scope and smoke validation
- pre-edit-sweep: completed manually across imports, callers, tests, evals, calibration, and scripts
- claim-proposal-guardian: unavailable; proposal posture and assessment separation verified directly
- Other: none

---

## PR #836 Addendum — feat(kernel): introduce construction-affordance catalog skeleton

### Agent and Session

- **Agent:** Antigravity (Gemini 3.5 Flash)
- **Date:** 2026-06-20
- **Task:** Implement `feat(kernel): introduce construction-affordance catalog skeleton` (PR #836)
- **Branch:** `feat/kernel-construction-affordance-catalog`

### Modules Touched / Created

| File | Change type | Summary |
|---|---|---|
| `generate/construction_affordances.py` | NEW | Frozen, typed structures (`RoleObligation`, `ConstructionHazard`, `ConstructionSignature`, `ConstructionFamily`, `ConstructionContract`, `ConstructionProposal`) and initial catalog registry with two diagnostic families (`proportional_change.decrease_to_fraction` and `partition.percent_partition`). |
| `generate/problem_frame_contracts.py` | modified | Added `_CONTRACT_REGISTRY` mapping candidate organs to ConstructionContract; updated module docstring and refactored `assess_contracts()` to reference registry metadata. |
| `generate/problem_frame_builder.py` | modified | Added detailed docstring to `_bound_question_target` describing the priority cascade. |
| `tests/test_problem_frame_contracts.py` | modified | Added 7 new test cases verifying scale boundary rejection (0, 1, >1), multi-base rejection, state entity continuity, unit continuity, and percent-partition blocker specificity. |
| `tests/test_construction_affordances.py` | NEW | Added 5 tests verifying catalog constraints (`serving_allowed=False`, `diagnostic_only=True`), deterministic order, accessor lookups, and `make_proposal()` status mapping. |
| `docs/analysis/pr836-lookback-2026-06-20.md` | NEW | Lookback documenting design choices (diagnostic-only registry, separation of registry and dispatch, priority cascade, test gaps closed). |

### Invariants Verified

- **Versor condition**: No geometric algebra files were touched; versor invariants remain fully satisfied.
- **Serving parity**: Verified by running evaluation scripts:
  - Train: `30 correct / 20 refused / 0 wrong` (wrong_ids: `[]`)
  - Holdout: `5 correct / 495 refused / 0 wrong` (wrong_ids: `[]`)
- **Adequacy**:
  - Train runnable: `2` (v1-0005 and v1-0046)
  - Holdout runnable: `0`

### Tests Run

- **Targeted suite**: `tests/test_problem_frame_builder.py`, `tests/test_problem_frame_contracts.py`, `tests/test_construction_affordances.py`, `tests/test_gsm8k_problem_frame_adequacy.py`, `tests/test_gsm8k_morphology_missing_kernel_labels.py` -> **46 passed** in `0.48s`.
- **Smoke suite**: `core.cli test --suite smoke -q` -> **108 passed** in `129.00s`.


---

## PR #837 Addendum — feat(kernel): route proportional-decrease through construction proposals

### Agent and Session

- **Agent:** Antigravity (Gemini 3.5 Flash)
- **Date:** 2026-06-20
- **Task:** Implement `feat(kernel): route proportional-decrease through construction proposals` (PR #837)
- **Branch:** `feat/kernel-decrease-construction-proposal-trace`

### Modules Touched / Created

| File | Change type | Summary |
|---|---|---|
| `generate/problem_frame.py` | modified | Added `proposals` field (`tuple[ConstructionProposal, ...]`) to the `ProblemFrame` dataclass, importing `ConstructionProposal` under `TYPE_CHECKING`. |
| `generate/problem_frame_builder.py` | modified | Updated `build_problem_frame` to perform a two-pass assembly: running contract assessments on the initial frame, mapping them to proposals using `make_proposal`, and returning the frame with `proposals` attached. |
| `generate/problem_frame_contracts.py` | modified | Added `get_contract_family_id(candidate_organ: str) -> str | None` to publicly map candidate organs to catalog family IDs without exposing the private contract registry. |
| `tests/test_proportional_decrease_proposal.py` | NEW | Added 6 new test cases verifying proposal trace existence, evidence spans, catalog backing, diagnostic-only constraints, blocked final-value behavior, and confuser exclusion. |
| `docs/analysis/pr837-lookback-2026-06-20.md` | NEW | Lookback documenting PR #837 design rationale, implementation details, and verification results. |

### Invariants Verified

- **Versor condition**: No geometric algebra files were touched; versor invariants remain fully satisfied.
- **Serving parity**:
  - Train: `30 correct / 20 refused / 0 wrong` (wrong_ids: `[]`)
  - Holdout: `5 correct / 495 refused / 0 wrong` (wrong_ids: `[]`)
- **Adequacy**:
  - Train runnable: `2` (v1-0005 and v1-0046)
  - Holdout runnable: `0`

### Tests Run

- **Targeted suite**: `tests/test_proportional_decrease_proposal.py`, `tests/test_construction_affordances.py`, `tests/test_problem_frame_builder.py`, `tests/test_problem_frame_contracts.py`, `tests/test_gsm8k_problem_frame_adequacy.py`, `tests/test_gsm8k_morphology_missing_kernel_labels.py`, `tests/test_kernel_no_new_legacy_derivation_surfaces.py` -> **54 passed** in `0.66s`.
- **Smoke suite**: `core.cli test --suite smoke -q` -> Running in background.


---

## PR #839 Addendum — docs(substrate): add foundational family specification appendices

### Agent and Session

- **Agent:** Antigravity (Gemini 3.5 Flash)
- **Date:** 2026-06-20
- **Task:** Create the foundational family specification appendix structure required by ADR-0224
- **Branch:** `docs/foundational-family-spec-appendices`

### Modules Touched / Created

| File | Change type | Summary |
|---|---|---|
| `docs/specs/foundational-families/README.md` | NEW | README file explaining post-ADR-0224 gating rules, extension of ADR-0223's closeness/bindings/contracts rule, and diagnostic role of benchmarks. |
| `docs/specs/foundational-families/TEMPLATE.md` | NEW | Mandatory template section structure for foundational family specifications. |
| `docs/specs/foundational-families/quantity-entity-binding.md` | NEW | Constitutional specification for the quantity-entity binding family, featuring cross-domain use cases, required/optional roles, hazards, and refusal conditions. |
| `docs/specs/foundational-families/state-change.md` | NEW | Constitutional specification for the state-change family, featuring cross-domain use cases, required/optional roles, hazards, and refusal conditions. |
| `docs/analysis/pr839-lookback-2026-06-20.md` | NEW | Lookback documenting design choices, verification details, and alignment with ADR-0224. |
| `HANDOFF-gpt55-2026-06-20.md` | modified | Updated with this PR #839 addendum. |

### Invariants Verified

- **Versor condition**: No geometric algebra files were touched; versor invariants remain fully satisfied.
- **Docs-Only Scope**: Verified that all changes are purely documentation additions or comments, with no runtime code or test suite modifications.

---

## PR #840 Addendum — feat(kernel): add foundational family registry schema

### Agent and Session

- **Agent:** gpt55
- **Date:** 2026-06-20
- **Reasoning effort used:** medium
- **Grok Build mode used:** Headless
- **Session entry point:** Implement the typed, read-only foundational-family registry schema for the two #839 specifications without adding recognition, assessment, routing, solving, or serving behavior.
- **Branch:** `feat/kernel-foundational-family-registry-schema`
- **Base:** `origin/main` at `5cd377b1b8169826ea2406a93136b7615c616286`

### Smoke Suite + Bootstrap Status

```text
uv run python -m core.cli test --suite smoke -q
108 passed in 123.94s (baseline)
108 passed in 131.98s (post-edit)
```

`core-bootstrap` was not available as a skill; the GPT55.md checklist was completed manually. The acknowledged dirty/diverged `/Users/kaizenpro/Projects/core` main worktree was not modified, stashed, reset, cleaned, or reconciled.

### Modules Touched

| File | Change type | Summary |
|---|---|---|
| `generate/foundational_families.py` | new | Frozen specification/evidence records, two manually mirrored unauthorized family specs, immutable indices, and public accessors. |
| `tests/test_foundational_families.py` | new | Public-API invariant tests for exact registry membership/order, uniqueness, immutability, required fields, cross-domain evidence, authorization gates, and absence of file/Markdown loading. |
| `HANDOFF-gpt55-2026-06-20.md` | modified | Added this PR #840 continuity record. |

### Invariants Verified

- **Field closure:** Preserved by construction. No algebra, field, propagation, vault, normalization, or runtime field-state path was imported or modified.
- **Exact recall:** Preserved. No CGA lookup, cosine, ANN, HNSW, or memory path was added.
- **Serving and implementation gates:** Both families explicitly carry `serving_allowed=False` and `implementation_authorized=False`; tests enforce both gates.
- **No behavior slice:** The module is unreferenced by runtime code and provides descriptive immutable metadata only. No parser, recognizer, adapter, `ContractAssessment`, routing, derivation, eval, report, or serving behavior was added.
- **No live-substrate claim:** Module and current-state text explicitly state that general substrate/CGA retrieval is not live for these families.
- **No universal IR:** The schema mirrors only ADR-0224/#839 specification fields and contains only the two authorized registry entries.
- **Determinism:** Registry iteration is an explicit immutable tuple; family IDs and primary relation types are unique and tested.

### Subagent / Arena Reconciliation

- Number of subagents spawned: 0
- Each subagent independently verified versor closure: N/A
- Reconciliation: N/A

### Tests Run

```bash
# exit 0 — 13 passed
uv run python -m pytest -q \
  tests/test_foundational_families.py \
  tests/test_construction_affordances.py

# exit 0 — 108 passed
uv run python -m core.cli test --suite smoke -q

# exit 0
python3 -m compileall -q \
  generate/foundational_families.py \
  tests/test_foundational_families.py

# exit 0
git diff --check
```

### Open Tasks / Next Session Entry Point

1. Review and publish PR #840 with the required body sections from the implementation brief.
2. Do not connect this registry to `ProblemFrame`, `ContractAssessment`, proposal routing, recognition, adapters, or serving without a separately authorized behavior PR.

### Known Hazards / Do Not Touch

- The two #839 specifications are gating artifacts, not implementation authorization.
- Do not parse `docs/specs/foundational-families/*.md` at runtime.
- Do not add acquisition, transaction, another family, or a universal family IR in this slice.
- The acknowledged local-only state under `/Users/kaizenpro/Projects/core` remains outside this PR and must not be altered.

### Architectural Decision

The foundational registry remains separate from `ConstructionFamily`. The latter describes live diagnostic construction proposals; this schema mirrors constitutional family gates. Combining them would falsely couple specification completeness to executable assessment machinery and blur current versus target state.

### What Must Not Be Forgotten

PR #840 makes the family-spec gate structurally inspectable; it authorizes nothing. Both entries remain non-serving and non-implementable until a separate evidence-backed PR is approved.

### Skills Used

- core-bootstrap: unavailable; checklist completed manually
- versor-coherence-guardian: unavailable; closure preserved by scope and smoke validation
- pre-edit-sweep: completed manually across imports/call sites in `generate/`, `tests/`, `evals/`, and `calibration/`
- claim-proposal-guardian: not needed; no claim or proposal mutation path touched
- Other: none

---

## PR #842 Addendum — feat(kernel): route percent-partition through proposal-first seam

### Agent and Session

- **Agent:** gpt55
- **Date:** 2026-06-20
- **Reasoning effort used:** high
- **Grok Build mode used:** Headless
- **Session entry point:** migrate only `partition.percent_partition` from process-frame-triggered assessment dispatch to the ADR-0223/0224 proposal-first construction seam, without changing serving or derivation organs
- **Branch:** `feat/kernel-percent-partition-proposal-first`
- **Base:** `origin/main` at `955fec3b` (merged PR #841)

### Smoke Suite + Bootstrap Status

```text
uv run python -m core.cli test --suite smoke -q
108 passed, 1 warning in 128.03s (0:02:08)
```

The warning reports an existing `engine_state` checkpoint revision mismatch (`4bab1638` versus `955fec3b`); no engine-state or runtime file was modified. `core-bootstrap` was unavailable as a skill, so the `GPT55.md` checklist was completed manually: `GPT55.md`, `AGENTS.md`, `docs/specs/runtime_contracts.md`, and the current handoff were read; baseline state and branch ancestry were inspected; the pre-edit import/call-site/test sweep was completed.

### Modules Touched

| File | Change type | Summary |
|---|---|---|
| `generate/problem_frame_builder.py` | modified | Added a narrow pre-assessment percent-partition proposal factory requiring an existing partition/consumption process cue plus explicit `N% of` evidence; attaches the proposal before mention/relation binding and contract assessment. |
| `generate/problem_frame_contracts.py` | modified | Replaced percent-partition process-frame-name dispatch with catalog-family proposal-gated dispatch; left `assess_percent_partition()` structurally unchanged. |
| `tests/test_percent_partition_proposal.py` | new | Proves proposal posture/obligations/order, exact evidence spans, legacy-adapter exclusion, assessment authority, no-proposal dispatch refusal, and percent-change confuser refusal. |
| `HANDOFF-gpt55-2026-06-20.md` | modified | Added this PR #842 continuity record. |

### Invariants Verified

- **Field closure:** Preserved by scope and smoke. No algebra, field, propagation, normalization, vault, or runtime field-state path was touched; no field operator was added.
- **Proposal/grounding/contract duality:** `propose_construction()` creates only `status="proposed"`; exact bound relations remain grounding evidence; `assess_percent_partition()` remains the only runnable/refused authority.
- **Diagnostic-only / serving forbidden:** Catalog-derived proposal retains `diagnostic_only=True` and `serving_allowed=False`; serving train/holdout results are byte-equivalent in outcome counts with `wrong_ids == []`.
- **No legacy adapter for migrated families:** Focused regression makes `make_proposal()` fail if percent partition reaches it; the supported path remains green.
- **No broad parser or state-change runtime:** Proposal recognition is limited to the existing partition/consumption process cue plus explicit `N% of` surface evidence. The percent-change confuser can be proposed as a hypothesis but is contract-refused.
- **Exact recall / epistemic / identity:** No recall, CGA ranking, ANN/cosine, teaching mutation, pack, policy, identity, or epistemic transition path was touched.
- **Diagnostic readiness:** Train runnable count remains `2`; holdout runnable count remains `0`.

### Subagent / Arena Reconciliation

- Number of subagents spawned: 0
- Each subagent independently verified versor closure: N/A
- Reconciliation: N/A

### Tests Run

```bash
# exit 0 — 54 passed
uv run python -m pytest -q \
  tests/test_construction_affordances.py \
  tests/test_problem_frame_builder.py \
  tests/test_problem_frame_contracts.py \
  tests/test_proportional_decrease_proposal.py \
  tests/test_percent_partition_proposal.py \
  tests/test_kernel_no_new_legacy_derivation_surfaces.py

# exit 0 — 108 passed, one pre-existing state-revision warning
uv run python -m core.cli test --suite smoke -q

# exit 0
uv run ruff check \
  generate/problem_frame_builder.py \
  generate/problem_frame_contracts.py \
  tests/test_percent_partition_proposal.py

# exit 0
uv run python -m compileall -q \
  generate/construction_affordances.py \
  generate/problem_frame.py \
  generate/problem_frame_builder.py \
  generate/problem_frame_contracts.py

# exit 0 — train serving parity
# {'correct': 30, 'wrong': 0, 'refused': 20}; wrong_ids == []

# exit 0 — holdout serving parity
# {'correct': 5, 'wrong': 0, 'refused': 495}; wrong_ids == []

# exit 0 — diagnostic readiness
# train contract_runnable_count == 2
# holdout contract_runnable_count == 0

# exit 0
git diff --check
```

### Open Tasks / Next Session Entry Point

1. Review the four changed files, commit intentionally, push `feat/kernel-percent-partition-proposal-first`, and open PR #842 using the brief's required body sections.
2. Leave `make_proposal()` cleanup for a separate small follow-up; both catalog families now bypass it, but deletion was intentionally not mixed into this migration.

### Known Hazards / Do Not Touch

- Do not broaden `_PERCENT_OF_PROPOSAL_RE` into general percentage or state-change recognition. Proposal closeness is intentionally narrower than contract authority.
- Do not weaken `assess_percent_partition()` obligations to recover diagnostic counts; its whole/part/scale topology and forward-target checks remain load-bearing.
- Do not connect this diagnostic proposal to serving, derivation organs, `math_candidate_graph`, foundational-family implementation, pack mutation, or runtime admission.

### Architectural Decision

Percent partition now follows the same ordering proven by PR #841: `surface/process cue → proposed ConstructionProposal → bound percent/subgroup relations → ContractAssessment`. Process-frame similarity authorizes only a hypothesis; exact span bindings ground it; the organ-specific contract determines closure or refusal.

### What Must Not Be Forgotten

Both construction-affordance catalog families are now proposal-first, but proposals remain diagnostic-only and serving-disallowed. `ContractAssessment`, not `ConstructionProposal`, is the executable readiness authority.

**Prompt Library Reference**: See `docs/core-rd-base-prompts.md` (especially sections #7 Standing Loop Axiom Check, #8 PR Merge-Readiness Audit, and #9 Grok Build Implementation Session). Use them as standing prefixes.

### Skills Used

- core-bootstrap: unavailable; checklist completed manually
- versor-coherence-guardian: unavailable; closure preserved by scope and smoke validation
- pre-edit-sweep: completed manually across imports, callers, tests, `evals/`, and `calibration/`
- claim-proposal-guardian: unavailable; proposal status and serving posture verified through catalog/focused tests
- Other: none

---

## Latest continuity pointer

The latest session on 2026-06-20 is the
`binding.quantity_entity` authorization addendum above. It starts from merged
#844 at `a266324e` on branch
`docs/kernel-authorize-quantity-entity-slice`. The controlling artifact is
`docs/sessions/quantity-entity-foundational-slice-authorization-2026-06-20.md`.
Merge that documentation PR before starting the bounded diagnostic-only
implementation brief. No `state_change.transition`, serving, general entity
extraction, or broad parsing work is authorized.

### GSM8K train proxy rebaseline status (post-#847)

PR #847 restored `evals/gsm8k_math/train_sample/v1/report.json` to the governed
6/44/0 pin after #846 committed a 30/20/0 rebaseline without explicit authorization.
A dedicated rebaseline PR (`chore/evals-ratify-gsm8k-train-proxy-rebaseline`) was
opened against the #847 merge commit (`b6d42283`) to ratify the committed 30/20/0
counts. That PR is the explicit authorization boundary for this rebaseline.

**Ratified counts:** `correct: 30, refused: 20, wrong: 0`, `wrong_ids: []`.
**Controlling artifact:** `docs/sessions/gsm8k-train-proxy-rebaseline-2026-06-20.md`.
**No runtime, serving, teaching, or capability change in this rebaseline PR.**

### Workbench / UI Alignment Scope Note
The alignment scope for the CORE Workbench/UI under the latest proposal-first pivots is documented in `docs/sessions/workbench-proposal-first-alignment-scope-2026-06-20.md`. This is a docs-only session note that identifies UI gaps, non-goals, future acceptance criteria, and next PR briefs to align the frontend observatory with the backend's proposal-first and contract assessment authority architecture.

---

## Unary state-change delta authorization pointer

The 2026-06-21 design investigation found that broad
`state_change.transition` is not one safe organ. It combines unary delta,
binary transfer, containment movement, and before/after state topology.

Authorized for one future diagnostic-only implementation PR:

- `state_change.unary_delta` only;
- exact cue inventory `gained → increase`, `lost → decrease`;
- one exact scalar/object `quantity_entity` edge;
- one family-local exact action-cue record;
- `ConstructionProposal(status="proposed")` before binding;
- `ContractAssessment` as the sole runnable/refused authority;
- `diagnostic_only=True`, `serving_allowed=False`.

Explicitly not authorized: broad `state_change.transition`, transfer,
containment, before/after state, measurement delta, actor/owner inference,
coreference, cross-sentence binding, arithmetic, answers, serving, derivation
ledger integration, or quantity-family widening.

Controlling artifacts:

- `docs/sessions/unary-state-change-delta-authorization-2026-06-21.md`
- `docs/sessions/unary-state-change-delta-preflight-2026-06-21.md`
- `docs/specs/foundational-families/unary-state-change-delta.md`

The next PR should implement the preflight's copy-paste brief. Stop if it
requires changes to `_quantity_entity_proposals()`,
`_quantity_kind_dispositions()`, `generate.derivation.state`, actor/owner
parsing, a broader cue inventory, synthetic spans, serving paths, or any
non-empty wrong-ID list.

Validation performed in the fresh worktree: startup guard passed with
`HEAD == origin/main == ca83d384`; baseline and post-doc
`uv run python -m core.cli test --suite smoke -q` completed successfully;
requested positive/confuser ProblemFrame probes were run read-only;
`git diff --check` passed. No subagents were used.
