Skip to content

ci: new plans must carry D-ids — the gate, not the backfill - #1161

Merged
AdaWorldAPI merged 1 commit into
mainfrom
claude/adaworld-substrate-harvest-pvfbs9
Sep 3, 2026
Merged

ci: new plans must carry D-ids — the gate, not the backfill#1161
AdaWorldAPI merged 1 commit into
mainfrom
claude/adaworld-substrate-harvest-pvfbs9

Conversation

@AdaWorldAPI

@AdaWorldAPI AdaWorldAPI commented Sep 3, 2026

Copy link
Copy Markdown
Owner

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:

pattern untracked / 208
the sibling session's sweep 53
supersession_index.py's own DID 75
a stricter form requiring a trailing number 102

Same tree, same hour, same population — the 3DGS family 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 no if __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

  • The three plans actually added in the last 30 commits all pass → the gate does not block recent legitimate work.
  • The 3DGS family fails → the gate has teeth on the largest untracked group.
  • The workflow's own git diff --diff-filter=A selector 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-v1 remains theirs to id.

Board: E-A-CENSUS-IS-A-FUNCTION-OF-ITS-REGEX-SO-GATE-THE-PROPERTY-1, LATEST_STATE delta.

🤖 Generated with Claude Code

https://claude.ai/code/session_01QHVUi6Q9XtmKgxh6pDRayP


Generated by Claude Code

Summary by CodeRabbit

  • New Features

    • Added an automated pull request check that validates newly added plans include at least one D-id citation.
    • Reports validation status for each added plan and blocks changes when required citations are missing.
    • Skips pull requests that do not add plans.
  • Documentation

    • Documented the citation requirement, validation behavior, and verification results for recent plan history.

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
@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Essentials

Run ID: 01904384-be95-4673-a3cd-662ea5a849fa

📥 Commits

Reviewing files that changed from the base of the PR and between 53e5784 and 67e5a97.

📒 Files selected for processing (4)
  • .claude/board/EPIPHANIES.md
  • .claude/board/LATEST_STATE.md
  • .claude/tools/plan_dids.py
  • .github/workflows/plan-dids.yml

📝 Walkthrough

Walkthrough

The 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.

Changes

Plan D-id enforcement

Layer / File(s) Summary
D-id validator
.claude/tools/plan_dids.py
The validator extracts the D-id regex from supersession_index.py, checks added Markdown plans, reports each result, and exits nonzero when a plan lacks a D-id.
Pull-request workflow wiring
.github/workflows/plan-dids.yml
The workflow compares pull-request base and head commits, selects newly added plans, and runs the validator with read-only contents access.
Decision and state records
.claude/board/EPIPHANIES.md, .claude/board/LATEST_STATE.md
The board records the added-only policy, regex-dependent measurements, verification results, and deferred backfill.

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
Loading

Suggested reviewers: claude

Poem

A rabbit checks each plan at night
For D-id marks, both neat and bright
The workflow hops from base to head
Missing tags turn the check to red
New plans now carry proof in sight

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands.

@cursor

cursor Bot commented Sep 3, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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)

@AdaWorldAPI
AdaWorldAPI marked this pull request as ready for review September 3, 2026 12:16
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@AdaWorldAPI
AdaWorldAPI merged commit 1a430a6 into main Sep 3, 2026
3 of 4 checks passed
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.

2 participants