Skip to content

S-21 and S-24: pin the upstream decisions at v5.15.2 with a derived standing (DDD-dec-112) - #56

Open
Hafeok wants to merge 4 commits into
mainfrom
claude/nifty-carson-e3x9t2
Open

Hafeok wants to merge 4 commits into
mainfrom
claude/nifty-carson-e3x9t2

Conversation

@Hafeok

@Hafeok Hafeok commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator

Session 2026-11-02-canon-cli, issue #46, S-21 and S-24. S-20 landed as #55 (1554509). Ratification is Emil's landing by fast-forward after CI is green.

What this changes, and why

Emil, Round 5 (S-21): "Pin them at v5.15.2 (Recommended)". Round 6 (S-24): "Derived standing + hash (Recommended)". Both are verbatim in meta/sessions/2026-11-02-canon-cli/rulings.md.

  • DDD-dec-112 (basedOn DDD-dec-111, DDD-dec-84), covering S-21 and S-24.
  • scripts/validate-core-order.py:
    • load_upstream_graph reads upstream core/decisions/ at the ref.
    • A decision's standing is superseded when an upstream decision at the ref lists it in supersedes: (string or list), else in-force. As a pin it is status_at_pin, and W5 fires on a change.
    • The content_hash is the existing digest, over the statement. E12 and E13 work as for claims.
  • Fixtures (scripts/ci.py, upstream-pins/*): four scenarios against a local upstream with a tag, each failing before the change:
    • a decision pin that resolves;
    • a missing one (one E12, on that id only);
    • two superseded at the ref, by string and by list (W5 on each);
    • a statement drift (one W6).
  • graph/upstream.yaml: seven pins at v5.15.2, with no ref change. DDD-dec-09, -15, -17, -26, -37 and -39 are at in-force, and term:presumed-discharge at draft, each with its hash read from the tag.
  • graph/unresolved-basis.yaml: emptied. It stays, with no entries, because DDD-dec-111 names it. The rule now has no exceptions.

What was measured

  • Ids: upstream holds up to DDD-dec-39, main up to -111, and agent review up to -110. This PR takes DDD-dec-112.
  • Without the change, all four scenarios fail, each decision pin an E12. With it, all four pass.
  • validate-core-order.py core/: "81 pins resolved against the pinned ref, 0 basis-loss, 0 content-drift, 1 shadowed id(s)".
  • Unresolved entries, 0 in both validators: validate-claims.py --decisions is valid at 88 decisions with no warning, and canon check has no DEC-BASEDON-UNRESOLVED finding of either class.
  • canon check --compare: 49 cases, every case agrees. The live decisions go from 14 / 14 to 0 / 0.
  • scripts/ci.py: all gates pass. canon: 37 tests and changelog --check pass.

What was found

  • Two facts made S-24 necessary (P-22): the checker did not index upstream decisions, and upstream decisions have no status.
  • The refuse fixture basedon-unpinned-upstream named DDD-dec-39. This change pins that id, so both implementations stopped refusing it, together. It now names DDD-dec-12, which is upstream only and unpinned.
  • canon has no pin checker (canon pins, S-19). The new rule therefore has no canon counterpart and no first agreement yet. The ledger records this.

What is left

  • S-19: port the pin checker to canon pins, including this rule.
  • S-23: the agent-review branch merges main after this lands.

  • Issue referenced: Refs #46 on every commit
  • Decisions cited: Basis: on every canon commit; no filed decision edited
  • Ids checked on every branch of both repositories
  • A new gate's failure path was proven by running it: all four scenarios fail on the unchanged checker
  • Signed
  • main merged last (unchanged at 1554509)
  • CI green on the head

Generated by Claude Code

Hafeok and others added 2 commits November 3, 2026 10:27
…the pin file stands (P-22, S-24)

All 14 entries exist upstream at v5.15.2. term:presumed-discharge pins
cleanly (status draft; 75 pins, 0 basis-loss in a scratch copy). The 13
decision entries cannot: validate-core-order.py indexes upstream claims and
terms only, so a decision pin fires E12, and upstream decisions carry no
status for status_at_pin. Nothing committed to graph/ or core/; DDD-dec-112
taken, not filed. Options recorded for Emil (S-24).

Basis: DDD-dec-111
Refs #46

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NbWSYPXwaETPuPCWwCGmpg
…2 with a derived standing

validate-core-order.py reads upstream core/decisions/ at the ref; a
decision's standing is superseded when an upstream decision lists it in
supersedes: (string or list), else in-force; pinned, the standing is
status_at_pin (W5 on change) and the content_hash is over the statement.
Four fixture scenarios in ci.py, each failing before the change. Seven pins
added at v5.15.2, no ref change: DDD-dec-09, -15, -17, -26, -37, -39 at
in-force, term:presumed-discharge at draft. graph/unresolved-basis.yaml
emptied. 81 pins, 0 basis-loss, 0 content-drift; 0 unresolved in both
validators; canon check --compare agrees on every case. The pin rule has no
canon counterpart yet (no canon pins), recorded in the ledger.

Basis: DDD-dec-112; DDD-dec-111; DDD-dec-84
Refs #46

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NbWSYPXwaETPuPCWwCGmpg
@Hafeok
Hafeok marked this pull request as ready for review November 3, 2026 11:37
@Hafeok

Hafeok commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator Author

approve 05a05fc

main carries the agent-review round (DDD-dec-109, DDD-dec-110; PR #51),
which landed before S-21 as ruled (S-23).

Refs #46

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NbWSYPXwaETPuPCWwCGmpg

Hafeok commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator Author

agent review was red on a07629d because the approval on this PR named the head from before main (bf4af9c, #51) was merged in. That is not a defect in the change, and no push can clear it: the check needs a fresh approval, written by hand by Emil, naming the current head.

(Edited by Claude: this comment first quoted the approval phrase verbatim. It was posted through Emil's account, so agent review read it as an approval by Hafeok (skipped only because it named an old head). It is edited so that it can never count. An approval must come from Emil.)


Generated by Claude Code

@Hafeok

Hafeok commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator Author

approve a07629d

One editorial commit (the product-cli definition), after Emil's approval of
a07629d; landing is by fast-forward only, so the head follows main.

Refs #46

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NbWSYPXwaETPuPCWwCGmpg

This branch was successfully deployed

1 active deployment
gates — ca232413 Deployed Nov 3, 2026 by Hafeok via agent review (judge) #11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant