core/docs/sessions/pr846-reconciliation-audit-2026-06-20.md
Shay b6d422834b
reconcile: restore eval proxy and remove unauthorized teaching proposal from #846 (#847)
- Restore evals/gsm8k_math/train_sample/v1/report.json to pre-#846 pin (6/44/0)
  The 30/20/0 committed in #846 was generated eval output, not a ratified rebaseline.
  Historical pin is required until a dedicated rebaseline PR is explicitly authorized.

- Delete teaching/proposals/comprehension_failures/34ce9254...json
  Newly added in #846 without authorization. File did not exist in first parent.
  HANDOFF claimed teaching paths were untouched — contradicted by the actual diff.
  Proposal must go through the reviewed teaching lifecycle, not committed PRs.

- Add docs/sessions/pr846-reconciliation-audit-2026-06-20.md
  Full audit note: what #846 was expected vs. what merged, authorization analysis,
  restoration rationale, what was preserved, remaining risk, next correct step.

Tests kept from #846:
- tests/test_problem_frame_builder.py (lint fix: _frame_names -> direct accessor)
- tests/test_problem_frame_skeleton.py (unused ProblemFrame import removed)
Both are valid narrow fixes unrelated to the unauthorized artifacts.

Forbidden paths not touched: algebra, field, vault, recall, identity, policy,
packs, generate/derivation, generate/math_candidate_graph.py, runtime/serving.
2026-06-20 19:40:12 -07:00

10 KiB

PR #846 Reconciliation Audit — 2026-06-20

Reconciliation PR: reconcile/audit-pr846-artifact-merge Audit date: 2026-06-20 (merged 2026-06-21T02:19:07Z; reconciliation opened same session) Auditor: Sonnet 4.6 (reconciliation/audit role)


1. What #846 Was Expected to Be

According to the task brief, PR #846 was expected to be:

feat(kernel): introduce diagnostic quantity-entity proposal seam

This is a diagnostic/seam-only PR for quantity-entity capability work, not a proportional-change closure or eval report rebaseline.


2. What #846 Actually Merged

PR #846 title: feat(kernel): implement ProblemFrame proportional-change closure Merge commit: a145b7c3d62ab97726f87c4a711b4b4dafe9f2b6 Merged at: 2026-06-21T02:19:07Z (Sat Jun 20 19:19:07 -0700) Author: Shay assetoverflow@icloud.com

The PR body is the full HANDOFF-gpt55-2026-06-20.md content describing:

  • BoundQuestionTarget typed validation in generate/problem_frame.py
  • decrease_to_fraction binding in generate/problem_frame_builder.py
  • assess_fraction_decrease + tightened percent_partition in generate/problem_frame_contracts.py
  • Scripts, tests, and adequacy coverage

Note: The substantive kernel code changes above arrived through squash commits within the PR's feature branch (feat/problem-frame-proportional-change-closure). The only delta exposed by git show --name-status a145b7c3 vs its first parent is the 4 files listed below.


3. Exact Changed Files in Merge Commit vs First Parent

File Status Category
evals/gsm8k_math/train_sample/v1/report.json MODIFIED Generated eval report
teaching/proposals/comprehension_failures/34ce9254657be27b95c6330c8fe2dd731b762d8b4af9e075de838fa0c6b36750.json ADDED Generated teaching proposal
tests/test_problem_frame_builder.py MODIFIED Test code
tests/test_problem_frame_skeleton.py MODIFIED Test code

4. Which Files Were Unauthorized Artifact/Report/Proposal Paths

evals/gsm8k_math/train_sample/v1/report.json — UNAUTHORIZED REBASELINE

Before merge (first parent ad0bae29):

{"correct": 6, "refused": 44, "wrong": 0}
"exit_criterion": {"correct_min": 10, "passed": false, "wrong_max": 0}

After merge (a145b7c3):

{"correct": 30, "refused": 20, "wrong": 0}
"exit_criterion": {"correct_min": 10, "passed": true, "wrong_max": 0}

Why unauthorized:

  • Governance doctrine: report.json is the committed proxy baseline. Rebaseline requires a dedicated, explicitly ratified PR. Multiple prior analysis docs state this explicitly:
    • gsm8k-workstream-a-gate-a1-comparative-multiplicative-lookback-2026-06-17.md: "No report.json rebaseline" / "report.json rebaseline only via separate ratified PR"
    • gsm8k-workstream-a-increment-3-rate-followup-ratification-2026-06-17.md: "No write of updated report.json in this increment"
    • gsm8k-capability-paradigm-sprint11-lookback-2026-06-17.md: "report.json untouched"
    • gsm8k-capability-paradigm-sprint12-lookback-2026-06-17.md: "report.json untouched"
  • The PR body mentions "serving unchanged: train {'correct': 30, 'wrong': 0, 'refused': 20}" — this describes ephemeral live runner output observed during the session, not an authorized committed rebaseline.
  • No ADR, session note, or explicit PR section authorizes committing the new counts.
  • ADR-0224: "GSM8K is diagnostic pressure only, not a benchmark-shaped substrate."

teaching/proposals/comprehension_failures/34ce9254657be27b95c6330c8fe2dd731b762d8b4af9e075de838fa0c6b36750.json — UNAUTHORIZED NEW FILE

Before merge (first parent): File did not exist.

After merge: 42-line JSON proposal with failure_family: missing_total_count, mounted: false, requires_review: true, status: proposal_only.

Why unauthorized:

  • File did not exist in any prior commit reachable from first parent.
  • Committed via chore(kernel): update adequacy report, fix lint warnings, and record failure proposal — a chore commit message does not constitute explicit authorization under governance doctrine.
  • No ADR, session note, or explicit PR section authorizes adding this proposal artifact.
  • The HANDOFF/PR body explicitly claims "Claim status transitions via review gates only | Preserved | Teaching/review/proposal paths untouched" — this claim is directly contradicted by the actual diff and constitutes a reporting error.
  • Governance: teaching proposals must go through the reviewed teaching lifecycle; committed proposal artifacts without review-gate passage violate the teaching/memory safety rules (AGENTS.md: "Reviewed memory must go through the teaching loop. Pack mutation is proposal-only until reviewed.").

5. What Was Restored/Deleted and Why

Restored: evals/gsm8k_math/train_sample/v1/report.json

Action: git show a145b7c3^1:evals/gsm8k_math/train_sample/v1/report.json > evals/gsm8k_math/train_sample/v1/report.json

Result: Counts return to {correct: 6, refused: 44, wrong: 0}, passed: false.

Rationale:

  • The historical 6/44/0 pin is the committed proxy baseline used by downstream analysis docs.
  • Live runner output (30/20/0) is correct and the kernel code that produces it is preserved — only the committed artifact is restored to the governed pin.
  • A dedicated rebaseline PR should be opened by Josh or the next agent session, explicitly citing which sprint/PR ratification authorizes the 30/20/0 commit.

Deleted: teaching/proposals/comprehension_failures/34ce9254657be27b95c6330c8fe2dd731b762d8b4af9e075de838fa0c6b36750.json

Action: git rm teaching/proposals/comprehension_failures/34ce9254...json

Rationale:

  • Newly added without authorization.
  • mounted: false / status: proposal_only — the proposal has never passed review.
  • The missing_total_count failure family it describes may be real, but the path for capturing it is through the teaching review loop, not via committed proposal artifacts in PRs not authorized to touch teaching paths.
  • Deletion does not lose the underlying diagnostic insight — it only removes the unauthorized persisted artifact.

6. Test Changes Preserved and Why

tests/test_problem_frame_builder.py — KEPT

Change: Line 49: assert "travel" in _frame_names(text)assert "travel" in tuple(f.name for f in frame.process_frames)

Why kept: This is a narrow correctness/lint fix that replaces a private test helper (_frame_names()) with a direct accessor on the canonical ProblemFrame.process_frames attribute. The assertion logic is identical; only the access path is improved. This change is valid regardless of the authorized scope of #846.

tests/test_problem_frame_skeleton.py — KEPT

Change: Import line: removes ProblemFrame from the import (it was unused after the BoundQuestionTarget validation work moved frame construction into the builder).

Why kept: Removing an unused import is a correctness fix. The change does not alter test semantics, add assertions about artifact state, or encode any assumption about report.json or teaching proposal content.


7. Validation Results

Scope verification

git diff --name-only origin/main...HEAD
evals/gsm8k_math/train_sample/v1/report.json
docs/sessions/pr846-reconciliation-audit-2026-06-20.md
teaching/proposals/comprehension_failures/34ce9254657be27b95c6330c8fe2dd731b762d8b4af9e075de838fa0c6b36750.json

Exactly the 3 authorized files (2 repairs + 1 audit note). No test files modified. No runtime/serving/algebra/field/vault/recall paths touched.

Automated test results

Run from the fresh worktree core-pr846-reconcile at HEAD after repairs:

uv run python -m pytest -q \
  tests/test_problem_frame_builder.py \
  tests/test_problem_frame_skeleton.py \
  tests/test_kernel_no_new_legacy_derivation_surfaces.py
# [results recorded in PR body]

uv run python -m core.cli test --suite smoke -q
# [results recorded in PR body]

8. Remaining Risk

  1. Live runner vs committed pin divergence: After this reconciliation, the committed report.json shows {correct: 6, refused: 44, wrong: 0} while the live runner produces {correct: 30, wrong: 0, refused: 20}. Any CI or test that reads the committed report.json and expects correct == 30 will fail. This is the correct governance state — the divergence should be resolved by a dedicated rebaseline PR, not by re-committing the live output.

  2. Teaching proposal insight lost: The missing_total_count failure family documented in the deleted proposal is real diagnostic pressure. It should be re-captured through the proper teaching review lifecycle if it is to be persisted.

  3. PR #846 substantive changes are preserved: The kernel code changes (ProblemFrame builder, contracts, BoundQuestionTarget validation, scripts, tests) remain in main and are not reverted by this reconciliation. Only the two unauthorized artifacts are removed.

  4. HANDOFF consistency: HANDOFF-gpt55-2026-06-20.md contains the claim "Teaching/ review/proposal paths untouched" which is now historically inaccurate. A future handoff should document the correction. This reconciliation PR does not modify the handoff file (only docs/sessions/ and the two artifact paths are in scope).


9. Next Correct Step After Reconciliation

  1. Merge this reconciliation PR after review by Josh.
  2. Open a dedicated rebaseline PR for evals/gsm8k_math/train_sample/v1/report.json — explicitly referencing which sprint/PR series authorized the 30/20/0 counts and satisfying the ratified-rebaseline governance requirement.
  3. Proceed with quantity-entity implementation only after this reconciliation is merged or explicitly waived by Josh (per task brief).
  4. Re-capture the missing_total_count diagnostic through the proper teaching review lifecycle if it is considered important enough to persist.

Appendix: Forbidden-Path Audit

This reconciliation PR does not touch:

Path Status
generate/derivation/* Not touched
generate/math_candidate_graph.py Not touched
packs/* Not touched
policy/* Not touched
identity/* Not touched
recall/* Not touched
vault/* Not touched
field/* Not touched
algebra/* Not touched
Any new eval artifact Not created
Any new teaching proposal artifact Not created (one deleted)
Runtime/serving paths Not touched