ci: new plans must carry D-ids — the gate, not the backfill - #1161
Conversation
A sibling session measured 53 of 208 plans carrying no D-id and proposed a CI gate so the number could not regrow. Re-measuring before building it gave a different answer twice: 53 by their sweep, 75 by the supersession generator's own pattern, 102 by a stricter one. Same tree, same hour, same population — the 3DGS family is 19 under all three. The census is a function of the regex, and none of the numbers is wrong; they answer slightly different questions. So the gate asserts what regex choice cannot move: a plan ADDED in this PR cites at least one D-id. That stops the backlog regrowing, which is the goal, without requiring the backlog to be agreed on, counted or backfilled — a cross-session scope call nobody has made. A gate asserting "no more than N untracked" would have been wrong on the day it landed. Added-only is deliberate. Gating modified plans would block whoever next edits a pre-existing untracked plan, punishing them for a debt they did not create, and a gate that fires on innocent work gets routed around. The pattern is read out of the generator's source rather than imported. Import was the obvious way and is wrong here: that module has no __main__ guard, so importing it runs the whole generator and prints the index to stdout — measured, the first version of the checker did exactly that. Adding a guard would refactor a CI-gated tool for one caller's convenience. If the definition is ever renamed this raises rather than falling back to a local copy, since a second copy is the drift the gate exists to prevent. Verified two-sided on real history rather than fixtures: the three plans actually added in the last thirty commits all pass, and the 3DGS family fails. The workflow's own diff-filter selector was run against that range and returns exactly those three. The backfill is not done and is not mine to do; the sibling session declined it as a cross-session call and their own untracked plan remains theirs to id. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QHVUi6Q9XtmKgxh6pDRayP
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Essentials Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughThe PR adds a validator and GitHub Actions workflow that require D-id citations in newly added Markdown plans. The validator extracts the source regex without importing the generator. Board records document the policy and verification. ChangesPlan D-id enforcement
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant PullRequest
participant GitHubActions
participant plan_dids.py
participant AddedPlans
PullRequest->>GitHubActions: Trigger workflow for relevant changes
GitHubActions->>AddedPlans: Identify plans added between base and head
GitHubActions->>plan_dids.py: Validate added plan paths
plan_dids.py-->>GitHubActions: Return validation status
Suggested reviewers: Poem
✨ Finishing Touches📝 Generate docstrings
Comment |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_614d144f-3de1-431c-a584-28d7fb5dc948) |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Builds the CI check the lance-graph-java session proposed off its untracked-plans census (#1156), which explicitly said the fix isn't the backfill — it's the CI check.
Re-measuring first changed the design
Their census reported 53 of 208 plans with no D-id. Before building a gate around that I re-measured, and got a different answer twice:
supersession_index.py's ownDIDSame tree, same hour, same population — the
3DGSfamily is 19 under every pattern, so nobody measured a different thing. The census is a function of the regex, and none of the three is wrong; they answer slightly different questions, and only one of them is the pattern the supersession index actually uses.So the gate asserts a property, not a count. A "no more than N untracked plans" check would have been wrong on the day it landed and would have frozen whichever regex its author happened to hold. This asserts what regex choice cannot move: a plan ADDED in this PR cites at least one D-id. That stops the backlog regrowing — the stated goal — without requiring it to be agreed on, counted, or backfilled.
Added-only, deliberately. Gating modified plans would block whoever next edits a pre-existing untracked plan, punishing them for a debt they did not create. A gate that fires on innocent work gets routed around, and a routed-around gate is worse than none.
A second finding, from building it
The obvious way to share the pattern —
from supersession_index import DID— is wrong here: that module has noif __name__ == "__main__"guard, so importing it runs the entire generator and prints the index to stdout. Measured; the first version of the checker did exactly that.Adding a guard would refactor a CI-gated tool for one caller's convenience, so the pattern is lifted from its source text, with a hard error if that definition is ever renamed or reshaped rather than a silent fallback to a local copy.
Worth contrasting with the gate merged an hour ago in #1160: there the copy was forced by a zero-dep crate boundary, so the remedy was an equivalence test. Here nothing forces it, so the remedy is to not copy at all.
Verified two-sided on real history, not fixtures
3DGSfamily fails → the gate has teeth on the largest untracked group.git diff --diff-filter=Aselector was run against that real range and returns exactly those three files.A gate that cannot fire and a gate that fires on everything carry the same information, so both halves were run.
Not done, deliberately
The backfill of the ~75 existing untracked plans. The sibling session declined it as a cross-session scope call, and their own
probe-r2il-live-regfile-v1remains theirs to id.Board:
E-A-CENSUS-IS-A-FUNCTION-OF-ITS-REGEX-SO-GATE-THE-PROPERTY-1,LATEST_STATEdelta.🤖 Generated with Claude Code
https://claude.ai/code/session_01QHVUi6Q9XtmKgxh6pDRayP
Generated by Claude Code
Summary by CodeRabbit
New Features
Documentation