Repository navigation
fix(roadmap): umbrella states, Plan-ID line, rule-6 seams, unresolved deps (PLAN-AUTO-1b) - #1598
Conversation
…ate-row fixes Five failing regression tests for the open #1580 review findings R1580-B1..B4 and REFS-07, through the public buildRoadmap interface with literal inputs. Existing merged-PR fixtures now carry a done PLAN row, as the new contract requires; their assertions are unchanged. Plan-ID: PLAN-AUTO-1b Test-First: scripts/lib/roadmap-data.test.mjs::a merged sub-PR does not finish a package whose PLAN row is not done Test-First: scripts/lib/roadmap-data.test.mjs::a Plan-ID marker does not borrow the next line Test-First: scripts/lib/roadmap-data.test.mjs::only the four rule-6 seams count as seams Test-First: scripts/lib/roadmap-data.test.mjs::unresolved dependency IDs are exposed additively Test-First: scripts/lib/roadmap-data.test.mjs::description tables never override the defining PLAN row Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… expose unresolved deps R1580-B1: a merged PR finishes a package only when its PLAN row is done or dropped; the forecast counts finished packages only. R1580-B2: the Plan-ID value must start on the marker's own line. R1580-B3: only the four rule-6 seam paths mark a package as seam. R1580-B4: additive package field unresolvedDeps lists dependency IDs without a visible row; deps stays unchanged. REFS-07: description-only rows no longer override or outlive the defining row; among defining rows the last still wins. Plan-ID: PLAN-AUTO-1b Regression-For: e61519f Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
R1580-C1: run the real write path in a throwaway repository, then check the tracked, unignored and symlinked refusals. Each guard was removed once to confirm that the matching case fails. Plan-ID: PLAN-AUTO-1b Test-First: scripts/lib/roadmap-data.test.mjs::CLI writes the ignored output file and prints only the head Test-First: scripts/lib/roadmap-data.test.mjs::CLI refuses tracked or unignored or symlinked output paths without writing Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…names still count Live check against origin/main showed two over-corrections. Description-only rows without any status (ARCH-02, P0 ...) would turn pending after their PR merged, although PLAN makes no claim about them; only planned, in-progress, in-review and blocked rows now keep a merged package open. The strict full-path seam pattern missed real hits such as "aus api.rs"; bare seam names count again, but a directory in front (tools/x/store/, queue/main.rs) does not. Plan-ID: PLAN-AUTO-1b Regression-For: e61519f Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…in, R1598-P1) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…extensions R1598-B1: a parked PLAN row with remaining work must not turn Erledigt when a sub-PR merged. R1598-B2: api.rs.bak, main.rs.old, store.rs.md and similar are not the rule-6 seams. Test-First: scripts/lib/roadmap-data.test.mjs::a parked umbrella with a merged sub-PR stays unfinished Test-First: scripts/lib/roadmap-data.test.mjs::appended extensions or name parts after a seam file are not seams Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…pended extensions
R1598-B1: a parked PLAN row ("Verschoben: Rest nach v2.0; Teil A erledigt")
is unfinished work, so a merged sub-PR no longer turns it Erledigt.
R1598-B2: api.rs.bak, main.rs.old, store.rs.md and api.rs-style are not the
rule-6 seams; sentence punctuation after the file name still matches.
Plan-ID: PLAN-AUTO-1b-c
Regression-For: b517141
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The package now has its own PLAN row, In Prüfung: #1598; the alias part (#1594, PLAN-AUTO-1b-a) stays separate. plan:check reports no finding for the new row. Plan-ID: PLAN-AUTO-1b-c No-Test: documentation-only plan row; plan:check shows no finding mentioning the row or PR Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…m (R1598-B2) api.rs-Routen names the seam file; only an extension or path part after .rs (api.rs.bak, api.rs/x) makes it another file. A missed seam is the unsafe side for the forecast, so the lookahead no longer rejects "-". Plan-ID: PLAN-AUTO-1b-c Regression-For: b517141 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…erge (R1598-P1, R1598-P2) PLAN-AUTO-1b-c now reads 'Erledigt mit Merge von PR #1598' instead of 'In Pruefung'. The umbrella row PLAN-AUTO-1b becomes 'Teilweise': alias part (#1594) done, roadmap findings B1-B4/C1 and REFS-07 done with #1598, open rest is the limits from #1564 (PLAN-AUTO-1b-b). No-Test: plan status row Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…d on main, R1598-P2) # Conflicts: # docs/PLAN.md
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3811dd2ea8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const version = (s) => /^v?\d+\.\d+\.\d+$/.test(s || "") ? `v${s.replace(/^v/, "")}` : null; | ||
| const compareVersions = (a, b) => a.localeCompare(b, "en", { numeric: true }); | ||
| const label = (pr, name) => pr?.labels?.some(l => (l.name || l) === name); | ||
| const claimsOpen = (p) => ["planned", "in_progress", "in_review", "blocked", "parked"].includes(p.status); |
There was a problem hiding this comment.
Keep unrecognized nonempty statuses open
When a defining row has a nonempty status that normalizeStatus cannot parse—for example, the current Z2-RECHTE-P1 row says “Geschnitten, noch nicht gestartet…”—claimsOpen returns false. Any merged sub-PR matched to that row is therefore reported as Erledigt and finished, recreating the umbrella-state regression even though the PLAN still describes open work. Treat a nonempty statusRaw with status unknown as open/fail-closed, and reserve the merged fallback for description rows whose statusRaw is empty.
AGENTS.md reference: AGENTS.md:L121-L121
Useful? React with 👍 / 👎.
| // A description-only row never replaces (or outlives) the row that defines the package; the last defining row wins. | ||
| if (!/historisch|erledigt/i.test(p.section || "") && (defining(p) || !defined.has(p.id))) byId.set(p.id, p); | ||
| } | ||
| const rows = [...byId.values()], known = new Set(byId.keys()); |
There was a problem hiding this comment.
Resolve dependencies against historical definitions
When a live package depends on an ID whose defining row is in a historisch or erledigt section, that row is intentionally omitted from byId, so building known from byId.keys() makes the new unresolvedDeps field report a valid PLAN ID as unresolved. parsePlan and checkPlan still treat such historical definitions as known, so the roadmap contradicts the validator and would surface a false missing-dependency warning. Build the resolution set from all defining model packages while continuing to omit historical packages from the displayed rows.
Useful? React with 👍 / 👎.
|
Root: head 3811dd2 accepted (Codex + Kimi K3 APPROVE on this head), required checks pass. @Mergifyio queue |
Merge Queue Status
This pull request spent 13 minutes 15 seconds in the queue, including 12 minutes 33 seconds running CI. Required conditions to merge
|
Die Roadmap-Daten zeigen jetzt zuverlässiger, welche Pakete wirklich fertig sind: Ein einzelner gemergter Teil-PR schließt ein Paket nicht mehr ab, solange der PLAN es noch als offen führt. Außerdem sind nicht auflösbare Abhängigkeiten im Ergebnis sichtbar (neues Feld
unresolvedDeps), Beschreibungstabellen überschreiben die definierende Planzeile nicht mehr, und die Naht-Erkennung meldet nur noch die vier Nähte aus Regel 6. Du musst dafür nichts tun; der PR ist ein Entwurf und wartet auf die unabhängige Prüfung.Report
Plan-ID: PLAN-AUTO-1b-c
Package: PLAN-AUTO-1b (Nachläufer aus #1580) · Operator: UMSETZEN · Tier: B · Base:
main@c7a43fbdScope:
scripts/lib/roadmap-data.mjs,scripts/lib/roadmap-data.test.mjsonly. Noplan-model.mjs, no PLAN/docs, no renderer, noscripts/ci/, no dependency, no seam. 114 diff lines (104 added, 10 deleted) against the 300-line cap.Finding table
4243a75a, refined in70f04d4e: a merged PR finishes a package unless the PLAN row claims open work (planned, in progress, in review, blocked). The forecast counts finished packages only.\s*afterPlan-ID:spans a newline4243a75a:[ \t]*, the value must start on the marker's own line.4243a75a,70f04d4e: onlyapi.rs,main.rs,store.rs,store/,bin/pa.rs(bare or undersrc-tauri/src/) count; words like "Naht"/"seam" and other directories in front (queue/main.rs,tools/x/store/) do not.4243a75a: additive package fieldunresolvedDeps;depsunchanged.scripts/roadmap-data.mjsuntested7eacc844(test only): writes and refuses tracked, unignored and symlinked output paths in a throwaway repository.4243a75a: a row without status never replaces or outlives a defining row (also not when the defining row sits in a historical section); among defining rows the last still wins.No finding is open.
Evidence
node --test scripts/lib/roadmap-data.test.mjswith the baseroadmap-data.mjsand the tests ofe61519fa(red)node --test scripts/lib/roadmap-data.test.mjs scripts/lib/plan-model.test.mjsat head70f04d4ebash scripts/ci/red-first.shbash scripts/ci/gates.sh lane prepushin this worktree,HEAD 70f04d4ebash scripts/ci/secret-scan.shbefore each commitgit push -u origin claude/plan-auto-1b-c, thengit ls-remote70f04d4ep.finishedin the forecast turns the B1 test rednode scripts/roadmap-data.mjs --stdoutold vs new code, sameorigin/main23d0c91e, 2026-10-15 ~23:55ZunresolvedDepsadded;headidentical.Live comparison (old → new): finished 236 → 224, "Erledigt" 163 → 151, seam 19 → 15,
unresolvedDepsnon-empty 0 (the unknown IDs seen earlier on the previousmainare gone).tools/…/store/delivery.mjs) and DF-05/DF-10/DF-16 (lane labels such as CORE/SEAM). 15 real seams stay.Decisions and judgment calls (for the reviewer)
donePLAN row in their merged-PR fixtures (merged wins over error and human signals,identity matching is exact and explicit Plan-ID takes priority,forecast needs ten distinct recent merges and excludes seam paths). Their assertions are unchanged; the old fixtures wereplannedrows with a merged PR, which the new contract no longer calls finished.e61519faand7eacc844carry oneTest-First:line per new test. The fix commits carryRegression-For:pointing ate61519fa. A test name with a comma is rejected by the hook, so the C1 test has none.NICHT ABGEDECKT
#[cfg(windows)]tests or the Windows clippy arms; the Windows lane runs in the merge queue.docs/PLAN.mdwas not edited in the first version (superseded: the PLAN rowsPLAN-AUTO-1b-candPLAN-AUTO-1bare edited in this PR, see fix rounds 1 and 2).origin/maincommit, no repeat). The renderer job (roadmap-page*) was not run against the new output.ghbehaviour is covered with fake runners only; the C1 tests use real git in a temporary repository, no network.Review
Review: ausstehend (Stufe B). Root commissions the independent non-Anthropic reviewer; this worker does not review or approve itself. Author family: Anthropic.
Fix round 1 (NACHBESSERN)
Source: independent review of head
70f04d4eby Codex gpt-6.1-sol (OpenAI), verdict REQUEST CHANGES. Plan-ID is nowPLAN-AUTO-1b-c(see R1598-P1). This round supersedes two statements above: the scope line (now alsodocs/PLAN.md, one row) and the NICHT-ABGEDECKT note thatdocs/PLAN.mdwas not edited.New head:
f206ba0e0d7b0bab0efcc0a0683f6e1c49a92c80(verified withgit ls-remote). Size againstmain: 117 added, 10 deleted = 127 lines, under the 300-line cap; no overrun.Disposition table
claimsOpenomittedparkedb517141c(a parked umbrella with a merged sub-PR stays unfinished, via Markdown input, asserts state, finished, parked, PR and that the package sits in an open lane). Fixed in68e71cb7:parkedis an open claim. The documented exception for status-less description rows is unchanged.origin/mainmerged first (ee80dc68, no conflict;mainnow carries thePLAN-AUTO-1bumbrella row). RowPLAN-AUTO-1b-cadded in9695e478as proposed, first with statusIn Prüfung: #1598; the alias part #1594 (PLAN-AUTO-1b-a) stays separate. PR text Plan-ID line changed toPLAN-AUTO-1b-c. The first version left the umbrella rowPLAN-AUTO-1band the post-merge status to a later change; the reviewer rejected that (partial fix), see R1598-P1 and R1598-P2 in fix round 2.api.rs.bak,src-tauri/src/main.rs.old,store.rs.mdresolve to seam=trueb517141c(appended extensions or name parts after a seam file are not seams, 4 negative and 4 positive titles). Fixed in68e71cb7, refined inf206ba0e: after.rsneither a word character nor.x//xmay follow; sentence punctuation,:12,)and a hyphen (api.rs-Routen) still match, because missing a real seam is the unsafe side of the forecast. No live PLAN title is affected (grep ofdocs/PLAN.mdfor seam names followed by-,.xor/x: no hit).Evidence
npm run dev:start-checknode --test scripts/lib/roadmap-data.test.mjswith the two new tests on the unfixed code (before68e71cb7)['Erledigt', true, true, 1]instead of[null, false, true, 1]; five extension titles matched as seams)node --test scripts/lib/roadmap-data.test.mjs scripts/lib/plan-model.test.mjsatf206ba0enpm run plan:checkat9695e478main(duplicate IDs, v2 aliases, PLAN-CLEAN rows vs merged #1591/#1592); none mentionsPLAN-AUTO-1b-cor #1598bash scripts/ci/red-first.shatf206ba0eRegression-Forreferences resolve to ancestorsbash scripts/ci/secret-scan.shbefore each commitbash scripts/ci/gates.sh lane prepushin this worktree,HEAD f206ba0e9695e478: 0; 462 s)git push -u origin claude/plan-auto-1b-c, thengit ls-remotef206ba0e0d7b0bab0efcc0a0683f6e1c49a92c80Observation: the first precommit run for
b517141cfailed in an unrelated gate (tools/denkraum/server-security.test.mjs,read ECONNRESET, while many workers shared the server). The same file alone: exit 0, 7 of 7 pass. The retry of the same commit (hooks active, no bypass) passed.NICHT ABGEDECKT (additions)
#[cfg(windows)]tests or the Windows clippy arms; the Windows lane runs in the merge queue.ghdata was not repeated for this round; the reviewer found no parked package in real data that hits B1, so the effect is covered by the input case only.roadmap-page*) was not run against the output.Review
Review: ausstehend (Stufe B), Root commissions the delta review (one outside reviewer, not Anthropic). This worker does not review, label, mark ready or merge.
Fix round 2 (NACHBESSERN)
Source: independent delta review of head
f206ba0eby Codex gpt-6.1-sol (OpenAI), verdict APPROVE WITH CONDITIONS (conditions: R1598-P1 and R1598-P2 fixed in this PR beforereview-ok, report aligned). Both findings are docs-only (docs/PLAN.md, two table cells); no code and no test changed in this round.New head:
3811dd2ea8163ceb70587d342fe93564f4fc48e7(verified withgit ls-remote): fix commit18b0ab58, then the merge oforigin/maine21710de(merge commit3811dd2e). Size againstmain: 118 added, 11 deleted = 129 lines in 3 files, under the 300-line cap; no overrun. The fix round itself changes two lines ofdocs/PLAN.md.Disposition table
PLAN-AUTO-1b-creadIn Prüfung: #1598; AGENTS.md:121 wants the state after merge18b0ab58: the status cell now readsErledigt mit Merge von PR #1598; Alias-Teil #1594 (PLAN-AUTO-1b-a) bleibt separat. No merge SHA is anticipated. The statements in this report that moved the status update to a later change are corrected above.PLAN-AUTO-1bstayedGeplant: nicht disponiertalthough this PR does B1–B4/C1 and REFS-07; #1594 has since merged18b0ab58and3811dd2e: status cell isTeilweise: Alias-Auflösung (PLAN-AUTO-1b-a, #1594) erledigt; Roadmap-Befunde B1–B4/C1 und REFS-07 (PLAN-AUTO-1b-c) erledigt mit Merge von #1598; Rest offen: Grenzen aus #1564 (PLAN-AUTO-1b-b). Main's merged alias part is kept.Merge of
origin/main: my row edit and main's rewrite of thePLAN-AUTO-1bcell (from #1594) touch the same line, so git reported a real conflict (git merge-tree, exit 1, onlydocs/PLAN.md). Merge commit, no rebase, no force-push. Resolution keeps main's alias text inside the new cell;git diff origin/main -- docs/PLAN.mdshows exactly the two rows above. No other row, the user section or the decision inbox mentions #1598 orPLAN-AUTO-1b-c(grep); the rows that only referencePLAN-AUTO-1b(PLAN-AUTO-1,PLAN-GATE) stay correct because its rest (PLAN-AUTO-1b-b) is still open.Evidence
git rev-parse HEADat startf206ba0e0d7b0bab0efcc0a0683f6e1c49a92c80, tree cleannode --test scripts/lib/roadmap-data.test.mjs scripts/lib/plan-model.test.mjsat3811dd2enpm run plan:checkatf206ba0e(before)mainnpm run plan:checkat3811dd2e(after)docs/PLAN.md:1500 status-contradicts-github PLAN-AUTO-1b-c #1598: done / GitHub OPEN. It is the direct result of writing the post-merge state (AGENTS.md:121) and disappears when #1598 merges. The other 12 are not caused by these rows.npm run dev:start-checkbash scripts/ci/secret-scan.shbefore each commitbash scripts/ci/gates.sh lane prepushin this worktree,HEAD 3811dd2elintgreen, thenfe-testred on one test,src/screens/leitstand/perf/renderBudget.test.tsx("Test timed out in 5000ms", 190 files, 1457 of 1458 tests passed, server under load). That test alone:npx vitest run …exit 0 (6.7 s). Resumed with--from fe-test: exit 0 (fe-test, hq-test, denkraum, clippy, rust-suite green, 392 s).git push -u origin claude/plan-auto-1b-c(pre-push hook runs the full prepush lane again, hooks active, no bypass)git ls-remote=3811dd2ea8163ceb70587d342fe93564f4fc48e7The
renderBudgettimeout is unrelated to this PR (no frontend file changed) and was not masked: it was rerun alone, the lane was resumed at that gate, and the push hook then ran the whole lane green.NICHT ABGEDECKT (additions)
#[cfg(windows)]tests or the Windows clippy arms; the Windows lane runs in the merge queue.bash scripts/ci/red-first.shwas not run on its own in this round (delta isNo-Test: plan status row, docs only; thered-first-plangate inside prepush is green).buildRoadmap(stateErledigt, finished true once fix(roadmap): umbrella states, Plan-ID line, rule-6 seams, unresolved deps (PLAN-AUTO-1b) #1598 is merged) was not simulated here; the reviewer's simulation showed the old text gavestate=null,finished=false.roadmap-page*) was not run against the output.Review
Review: ausstehend. The delta is docs-only (tier C); per Root's order Root verifies it, because the outside reviewer is blocked until 22.10. Root commissions; this worker does not review, label, mark ready or merge. Author family: Anthropic.
🤖 Generated with Claude Code on the ProjectA server worker
Second review (Root acceptance, 16.10.2026 ~04:05 MESZ)
/i": rejected — rule-6 seams are exact lowercase paths; the old case-insensitive word match (Naht,seam) was the false-positive source this PR removesroadmap-data.mjs:77mergedAtset for unfinished umbrellas): follow-up. R1598-K2 (medium, historisch-only IDs could show as unresolved deps): not reproduced —buildRoadmapon the realdocs/PLAN.mdgives 0 packages with unresolved deps on main and on this head; follow-up guard only. R1598-K3 (low, two extra umbrella test cases): follow-up.