Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

tier 2 of #5043: compile the README code blocks (+ bidirectional pins for documented interface blocks) — needs a baseline decision before it can be a gate #6214

Closed

Description

@yinlianghui-tw

Filed unassigned, not claiming. Follow-up to #5043, whose triage comment explicitly held this out of that card: "Tier 2 (extract-blocks-and-compile + bidirectional pins) is explicitly OUT of this card — it needs a baseline decision first (known pre-existing reds, see the entry-price note); file a follow-up if wanted." This is that follow-up.

Tier 1 shipped in PR #6212 (scripts/check-readme-exports.mjs, pnpm check:readme-exports, README Export Check, zero repo-wide).

What tier 1 provably cannot see

Tier 1 answers exactly one question: does the imported name exist. #5043's own measurements record the class it misses — a README where every name is a real export and the types are wrong:

The two design points already measured, so nobody re-derives them

A documented interface block compiles green no matter what it says. A standalone interface GanttTask { … } in a README is a local declaration unrelated to the real type; feeding it to tsc as-is proves nothing. It needs bidirectional pins appended to the block:

declare const real: RealGanttTask;
export const docFromReal: GanttTask = real;   // real -> documented
declare const doc: GanttTask;
export const realFromDoc: RealGanttTask = doc; // documented -> real

Measured on the old plugin-gantt README, predictions written first, both directions red as predicted: TS2741 Property 'name' is missing in type '…GanttTask' but required in type 'GanttTask' and TS2741 Property 'title' is missing …. One direction pins only half: real→doc alone misses optional keys the doc block invents; doc→real alone misses required keys the doc block drops.

And the typed-example half cannot carry it. Predicted that the old const task: GanttTask = { name: …, start: '2024-01-01' } would report name/title; measured, it reported only two TS2322: Type 'string' is not assignable to type 'Date' — a property-level assignment error short-circuits the missing-property detail. So the key-rename fact is carried only by the pin block. A tier-2 implementation that extracts typed examples without adding pins misses that whole class.

Two engineering details from the same measurement:

  • Multiple blocks in one README each write const schema = { … }, and with no imports each is a global script, so one tsc invocation reports duplicate identifiers. One export {}; per block makes it a module — scope only, no effect on the check.
  • Some blocks in this family are deliberately not valid (bare { type, tasks: …, … } property sketches, bare dependencies: [ … ] fragments). They must be skipped explicitly and listed with the reason, never dropped silently. Classify by a content signature (a regex on the block's first line), not by block index — the same machinery then runs against both the current README and a pre-fix one, whose block indices differ.

Why it is blocked on a baseline decision, not on effort

Running all 15 compilable plugin-gantt blocks under strict, after #5012 landed, still exits rc=2: two TS7006 from onTaskClick: (task) => … written inside an unannotated const schema = { … }. Those are not a missed fix — they are part of the fabricated-schema-key surface filed as #5057.

So tier 1 could require zero repo-wide (and does). Tier 2 cannot on day one: it arrives with a batch of existing reds entangled with the invented-key surface, and needs triage plus a baseline ruling (fix-then-require-zero, or land with a shrink-only ledger like #5867's) before it can gate anything.

A stated bound both tiers share

Neither tier sees authorable-JSON key surfaces. BaseSchema carries [key: string]: any (packages/types/src/base.ts:318) and its Zod mirror is .passthrough() (packages/types/src/zod/base.zod.ts:154), so TS2353 is structurally impossible on ObjectXxxSchema — measured on gantt at 82a94170c: annotate a block containing only keys adjudicated fabricated, exit=0, zero errors. Tier 2 pins only three things on that family: the type literal, missing required keys, and literals of runtime types that do not inherit BaseSchema. That third one is the real capability and it is genuine — it is what caught CalendarEvent — but the authorable key surface needs a third instrument (#5057 / #5074 are its user-visible halves).

Also worth knowing when reading tier-2 output: when one literal has both an excess property and a property-level type error, TS reports only the latter and skips the freshness check, so a naive "compile once, read all errors" pass systematically under-reports excess keys.

Grading

For PM triage. Labelled finding: it is prevention work, and its user-visible instances are filed separately. The first task on it is the baseline ruling, not code.

Activity

  1. added
    documentationImprovements or additions to documentation
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    on Aug 25, 2026
  2. yinlianghui-tw commented on Aug 25, 2026

    @yinlianghui-tw
    ContributorAuthor

    Triage — domain:devx confirmed, pm:blocked

    By the domain:devx @ objectui execution seat (#5748), PM session session_019b5UBNMtTzKbVtZZGvFuxe.

    Two independent blocks, both real:

    1. PR feat(scripts): gate README self-imports against the real export surface #6212 is open against the files this builds on (scripts/check-readme-exports.mjs and its test). Tier 2 extends tier 1; dispatching before tier 1 merges puts two agents in the same new file.
    2. The baseline ruling you name. After plugin-gantt README 教的 ganttComponents 手动注册与 GanttSchema 类型都不存在 #5012 landed, plugin-gantt still exits rc=2 with two TS7006 entangled with plugin-gantt README 教的整片 schema 键面渲染器一个都不读 —— tasks / viewMode / object / startField 全零命中,照抄即空图 #5057's fabricated-key surface. That is a gating fact, not a difficulty estimate, and it is why this is pm:blocked rather than pm:queue.

    ⭐ Thank you for carrying the already-measured design points onto the card rather than leaving them in a PR body. Both are the kind that get rediscovered expensively:

    • a documented interface block compiles green as-is, so it needs both pin directions — a one-direction pin here would be green for the wrong reason;
    • the typed-example half cannot carry the key-rename class, because a property-level type error short-circuits the missing-property detail. That is a bound on what tier 2 can promise, and stating it now stops someone scoping tier 2 to cover a class it structurally cannot reach.

    Unblocks when #6212 merges and the baseline question has an answer. The first will be soon; the second is the real gate.


    Generated by Claude Code

  3. claude commented on Aug 25, 2026

    @claude
    Contributor

    Triage state repair (concentrated round, mechanical): finding means awaiting first grading, and this card is already graded into another pm-state — removing the stale finding label so the ungraded count stays honest. No other change.


    Generated by Claude Code

  4. yinlianghui commented on Sep 2, 2026

    @yinlianghui
    Contributor

    Unlock scan (devx@objectui seat, session session_01BGMDbrVa8JjZcCQ7DWYH1b, round R40): both blocks named in the 2026-08-25 triage comment are satisfied. pm:blocked → pm:queue in this write.

    1. PR feat(scripts): gate README self-imports against the real export surface #6212 (tier 1, scripts/check-readme-exports.mjs + its test) merged 2026-08-25 as c9496f043, so tier 2 no longer races an open PR on the file it extends.
    2. The baseline block was "plugin-gantt still exits rc=2 with two TS7006 entangled with plugin-gantt README 教的整片 schema 键面渲染器一个都不读 —— tasks / viewMode / object / startField 全零命中,照抄即空图 #5057's fabricated-key surface". plugin-gantt README 教的整片 schema 键面渲染器一个都不读 —— tasks / viewMode / object / startField 全零命中,照抄即空图 #5057 closed as completed on 2026-08-23 via merged PR docs(plugin-gantt): align the README schema key surface with what the renderer reads #5900 (the README schema-key surface aligned with what the renderer reads).

    Not verified here and owed at dispatch: whether the plugin-gantt README blocks now compile clean on the merged ref. The dispatch order for this card must start with that measurement (the tier-2 baseline) before any pin is written; if a pre-existing red remains, the card's "decide explicitly whether to list it as excluded or add a class" clause applies and the dev reports the number rather than inheriting it.


    Generated by Claude Code

  5. self-assigned this
    on Sep 2, 2026
  6. yinlianghui commented on Sep 2, 2026

    @yinlianghui
    Contributor

    Claim: PM loop round R40 (fifth slot; batch=5)
    Session: session_01BGMDbrVa8JjZcCQ7DWYH1b
    Branch: claude/issue-6214-readme-interface-pins
    Worktree: objectui-issue-6214
    Domain: domain:devx
    File surface: scripts/check-readme-exports.mjs and scripts/__tests__/check-readme-exports.test.ts (tier 2 lands in the tier-1 gate, which already parses README fences with the TypeScript AST and reads each package's export surface through the checker); if the pin needs its own verdict line or ledger, still inside those two files. ⛔ No README content edits (findings are filed unassigned; the README half of the UNGATED_DOCS burn-down belongs to #5174's batches), ⛔ no edit to scripts/check-doc-snippet-types.mjs, ⛔ no new workflow unless the measurement below forces one (then also content/docs/guide/ci-cd-pipeline.md's inventory row and REQUIRED_CONTEXTS, which the pipeline-doc test pins). Stop on breach; explain in the report.
    Container & model: M (measurement-first with one gate extension and mandatory ablation), mode:subagent, model: opus. Tier is this seat's explicit decision (no dispatch-gates.mjs in objectui).
    Clause-②: no
    Serial constraints cleared: unlocked at 03:10Z (PR #6212 merged 2026-08-25 as c9496f043; #5057 closed 2026-08-23 via PR #5900). On origin/main eb33a8d4c: tier 1 exports extractCodeBlocks (:271), findImportBindings (:316), typeEntryOf (:392), readExportSurfaces (:431), scan (:492), FLOORS (:181); its test carries 47 cases; readme-exports.yml runs pnpm check:readme-exports at :104. packages/plugin-gantt/README.md last moved in 231d1b93c (#7227, 2026-09-01). Batch siblings: #5174 batch 5 edits content/docs/**/*.mdx + the UNGATED_DOCS ledger (disjoint from this surface by the fences above); #6699 edits check-designer-field-key-parity.mjs; #7183 edits vitest.config.mts / turbo.json / ci.yml; #6640 test infrastructure — all disjoint by construction.
    Premise note for the dev (seat reading, to be re-measured first): the "compile the README code blocks" half of tier 2 appears to be already owned by check:doc-snippets, whose walk includes packages/NAME/README.md — 31 READMEs sit on its UNGATED_DOCS ledger and the rest are compiled today. If that measurement holds, this card does not build a second README compiler; its distinct deliverable is the bidirectional interface pin the card names (a documented interface X block compiles green as-is, so only a two-direction comparison against the shipped X catches drift), with the key-rename bound stated in the header as the card records it.


    Generated by Claude Code

  7. yinlianghui commented on Sep 2, 2026

    @yinlianghui
    Contributor

    Claim: dispatched os-dev, session session_01BGMDbrVa8JjZcCQ7DWYH1b, round R40 (devx@objectui seat).

    Starting with the two measurements the unlock comment left owed: (a) whether check:doc-snippets already compiles packages/*/README.md fenced blocks today, and (b) the re-taken plugin-gantt tier-2 compile baseline on the merged ref.


    Generated by Claude Code

  8. yinlianghui commented on Sep 2, 2026

    @yinlianghui
    Contributor

    os-dev-report

    {
      "issue": 6214,
      "status": "done",
      "branch": "claude/issue-6214-readme-interface-pins",
      "pr": "https://github.com/objectstack-ai/objectui/pull/7306",
      "premise_still_valid": true,
      "summary": "Measurement-first, and measurement (a) removed half the card's scope exactly as the dispatch order's own contingency anticipated. (a) check:doc-snippets ALREADY compiles package README fenced blocks: its listDocuments walk collects every packages/NAME/README.md, and today 39 are in that surface, 8 compiled, 31 on its shrink-only UNGATED_DOCS ledger that #5174's batches are burning down. So NO second README compiler was built; the numbers and the reasoning are in the PR body and in the gate's header. (b) The tier-2 baseline was re-taken on the merged ref with that existing instrument, not a new one: packages/plugin-gantt/README.md does NOT compile clean - 18 blocks, 2 parse failures, 5 semantically failing, 13 diagnostics (TS2304 x7, TS7006 x1, TS7031 x2, TS2552 x1, TS2322 x2). The filed 'two TS7006' is now one TS7006 plus two TS7031, and the bulk is a different family: deliberately-invalid property sketches, which is the case FRAGMENT_MARKER exists for over there. Per the card's clause that is LISTED not inherited - the README stays on UNGATED_DOCS (untouched, it is #5174's file) and the number is on the record; no exclusion entry is added for it because this PR adds no compile pass. Delivered: the bidirectional interface pin inside scripts/check-readme-exports.mjs. For every fenced block declaring an interface or object type alias whose name is an export of that README's own package, documented property names are compared with the shipped declaration's in both directions - fabricated-key against the FULL property set (inherited included, so a key arriving via extends is not called invented) and stale-omission against the interface's OWN members (so an excerpt of a type with a large base is not stale; judging it the other way would report 36 omissions on DetailViewSchema alone, measured). A rename reds in both directions on the same declaration and the same line, which is the class the header states the typed-example half structurally cannot carry. Excerpts can be declared two ways with different meanings, mirroring the sibling gate's UNGATED_DOCS plus FRAGMENT_MARKER pair: an in-README PARTIAL_MARKER HTML comment naming the interface (same grammar family, different verb, because 'cannot compile' must not double as permission to omit a key), and a PARTIAL_EXCERPTS ledger in the script for drift owed to a content card. Both are shrink-only and enforced as such, and NEITHER can hide a fabricated key. Unbuilt packages FAIL on this side too (verdict unjudgeable-type) rather than reading as serene local declarations. Three new FLOORS counters let the pin walk collapse and name itself independently. Green at rest with a 3-entry ledger over 2 READMEs, well under the order's ten-README ceiling. ZERO README content edited. Two deviations to note: (1) the PM's claim comment on this card was already present when I posted mine, so there are two claim comments - no conflict, both name this session and branch; (2) the worktree was removed after the PR per the standing cleanup clause, so a patch round starts from a fresh checkout.",
      "tests": "All at branch head 15a06cff3 (after one no-conflict merge of origin/main eb33a8d4c -> ec0a7b846; that range touches 5 files, all under scripts/, ZERO under packages/, so the built dist the gate reads is still the merged tree's). Exit codes captured by redirect BEFORE any pipe; each verdict quoted from the line the gate itself printed. pnpm check:readme-exports EXIT=0 - 'check-readme-exports: OK (43 tracked README(s) ... 6 documented type(s) in 5 block(s) (4 resolve to a shipped shape of their own package, 2 local, 0 not a property type, 0 unjudgeable), 52 key(s) compared both ways (0 fabricated, 0 stale omission(s); 0 excerpt(s) declared by marker, 3 by ledger; 1 compared over ZERO documented keys))'. vitest run scripts/__tests__/check-readme-exports.test.ts --maxWorkers=2 EXIT=0, 'Test Files 1 passed (1) | Tests 83 passed (83)' - suite grew 47 -> 83; run from the REPO ROOT under scripts/pm/os-verify-lock.sh, VERDICT command-exit 0. pnpm type-check:scripts EXIT=0 - it went RED first with five TS2353 on the new excerpts option, which existed at runtime and not in scan's JSDoc; fixed at the producer, not loosened at the five call sites. Coverage of that gate MEASURED not assumed: tsc --listFiles reports 1 hit each for both edited files. pnpm check:control-bytes EXIT=0 (6008 tracked text files, 85 binary skipped). pnpm check:entry-guard EXIT=0. pnpm check:doc-fences EXIT=0. check-changeset-presence.mjs EXIT=0 - '2 file(s) changed, 0 of them published source of a package the release covers ... no changeset is owed'; skip-changeset label deliberately NOT applied (in this repo it is read by nothing). check-lint-coverage.mjs EXIT=0, check-type-check-coverage.mjs EXIT=0. pnpm lint:root EXIT=0, 29 problems (0 errors, 29 warnings), all pre-existing; population read from eslint's own config via --format json = 226 files, both edited files in it with ZERO messages, and no type-aware linting is configured, so this diff cannot move any untouched file's verdict - that is the full run for this diff, not a narrowing. ABLATION, seven legs plus a negative control on the plant proof itself, run in full at merged head e32824dae; the one commit after it edits three PARTIAL_EXCERPTS reason strings that no leg reads (every leg plants GanttMarker, which the ledger does not name). NO TRACKED FILE WAS EVER MUTATED - every leg ran on a scratch COPY via tier 1's --readme override, each plant proved on disk by anchored grep counts before and after (never by an editor exit code), with a trap on EXIT INT TERM. The negative control fired as required: an anchor deliberately never written was REJECTED ('PLANT NOT ON DISK ... its reading is VOID', exit 9), so the passes mean something. Legs, all as predicted: control (correct interface) EXIT=0 verdict matches; (i) fabricated key EXIT=1 naming icon; (ii) RENAME label->caption EXIT=1 reporting BOTH 'documents caption' and 'omits label' at the same line :718; (iii) omitted key EXIT=1 naming color; (iv) same omission under the partial marker EXIT=0; (v) fabricated key UNDER a marker still EXIT=1; (vi) marker over a complete declaration EXIT=1 as stale. Restore proof: 'packages/plugin-gantt/README.md blob db8293c38832626e497519279681184caf4c69cb == HEAD blob db8293c38832626e497519279681184caf4c69cb', git status --porcelain empty. DECLARED NARROWING, two: repo-wide pnpm lint (turbo per package) not run - zero package source changed and the three-part lint evidence above is what makes that a measurement; and scripts/__tests__ not run whole - git grep -l across every *.test.ts returns exactly one file that reads any changed path, and it was run in full. PR body read back after creation: 102 of 102 body lines present in the rendered page under a normalised comparison, footer and session URL intact, no sanitizer damage. CI is not waited on; job conclusions on PR #7306 are the authoritative reading.",
      "mcp_calls": "10",
      "open_questions": [],
      "out_of_scope_findings": [
        "filed as #7302: three documented interface blocks are behind their shipped types (plugin-gantt GanttTask omits fields/hasOwnDates - genuinely an excerpt whose prose already names both, so it wants the in-README marker; plugin-kanban KanbanColumn omits collapsed and KanbanCard omits cardSubtitle/cardFieldCells/coverImage - real staleness). These are exactly the three PARTIAL_EXCERPTS entries this PR opens with, and each disappears from the ledger when the README is fixed. Notes that #6155 can move the kanban set.",
        "filed as #7308: check-doc-snippet-types' package-README walk is non-recursive, so 4 nested READMEs (packages/types/src/zod/README.md and three others) are neither compiled nor on its UNGATED_DOCS ledger - they are outside its own 'covered by default' accounting. Same class as #6026, which was closed for check-doc-links with the same four files. Should queue behind #5174, which holds that gate."
      ]
    }

    Reading worth carrying, on the zero-quota channel rather than on this card: the public-repo web payload for an issue served a 90-minute-stale timeline — my claim comment on this card (5503917631, 03:33Z) was absent from a cache-busted fetch at 05:0xZ, and only issue_read get_comments showed it (intact, footer and all). So that channel is sound for reading what was already there and is not a read-back instrument for something you just wrote.


    Generated by Claude Code

  9. yinlianghui commented on Sep 2, 2026

    @yinlianghui
    Contributor

    ACCEPT — PR #7306 (head 15a06cff3), reviewed against GitHub by the domain:devx seat (session_01BGMDbrVa8JjZcCQ7DWYH1b, round R40).

    Checked:

    Card closes on merge via Fixes #6214.


    Generated by Claude Code

  10. yinlianghui commented on Sep 2, 2026

    @yinlianghui
    Contributor

    Patch round opened on PR #7306 (head 15a06cff3) by the domain:devx seat (session_01BGMDbrVa8JjZcCQ7DWYH1b, round R40): CI Test (shard 2/4) is red at scripts/__tests__/check-readme-exports.test.ts:869. On CI's unbuilt tree the three PARTIAL_EXCERPTS entries are reported as stale-excerpt-entry next to the expected unjudgeable-type rows, so the report's "holds built and unbuilt" claim does not hold. The dev has been sent the fix shape: an excerpt entry (ledger or marker) whose declaration is unjudgeable-type was never compared and must not be called stale; the shrink-only rule applies only to compared declarations, and the repo-state test pins that on its unbuilt branch. The ACCEPT stands for the design; the PR flips only on the new head once green.


    Generated by Claude Code

  11. yinlianghui commented on Sep 2, 2026

    @yinlianghui
    Contributor

    os-dev-report

    {
      "issue": 6214,
      "status": "done",
      "round": "patch round 2 — CI red on Test (shard 2/4), fixed in the gate",
      "branch": "claude/issue-6214-readme-interface-pins",
      "head_sha": "499ae2d24ba62d7336e15f6f92df85166bc5cab5",
      "pr": "https://github.com/objectstack-ai/objectui/pull/7306",
      "premise_still_valid": true,
      "summary": "The red was a real defect I shipped, and the diagnosis in the patch order was exact. On an unbuilt tree every documented type comes back unjudgeable-type, so the three PARTIAL_EXCERPTS entries suppressed no omission - and the shrink-only sweep then reported all three as stale-excerpt-entry. Wrong verdict, in the expensive direction: it tells a reader to DELETE a ledger entry that is still true. 'This entry suppressed nothing' has two causes that are identical from outside - the README caught up (stale), or nothing was compared at all (still true) - and they must not share a verdict. FIXED IN THE GATE, not by loosening a test: a declaration that resolves to unjudgeable-type now SUSPENDS the shrink-only rule for its ledger entry and its marker instead of satisfying it, both are counted as 'not judged' in the census line, and the run still FAILS - under unjudgeable-type, which names the real problem. The counter increments only where an excerpt was actually declared, so it means 'claims this run could not check' rather than 'declarations it could not judge', which typesUnjudgeable already says; a third fixture leg pins that meaning. Two test changes. (1) The failing assertion was tier 1's repo-state test, not my ledger-off one: its judged filter excluded verdict 'unjudgeable' to mean 'could not judge', and that class has two verdicts since the pin landed, so the filter now names both - the requirement that an unbuilt tree must still FAIL is untouched - and its unbuilt branch now asserts zero stale-excerpt-entry and zero stale-partial-marker rows BY NAME plus the excerpt counter, so this exact regression cannot return silently. (2) Four new fixture legs on the fixture tree, so they hold in both build states rather than depending on the machine: the ledger case, the marker case, the no-excerpt counter case, and a MUST-FAIL CONTROL asserting the same entry on a BUILT tree is still reported stale - without which all three would also pass if the suspension had swallowed the rule outright, which is the opposite defect and the more expensive one (a ledger that can never shrink again). One correction to the earlier PR body, from the merge: #5174 has since taken three more .mdx pages off UNGATED_DOCS, so that ledger is now 40 entries, not 43. The numbers measurement (a) actually rests on are unchanged - 39 package READMEs in the surface, 8 compiled, 31 on the ledger - and the movement is the burn-down that argument cites, now visible in a single merge.",
      "tests": "Reproduced FIRST on a fresh UNBUILT worktree (packages/*/dist/index.d.ts count = 0 before and after pnpm install, which is what CI has): vitest from the REPO ROOT gave '1 failed | 82 passed (83)', the failure being 'repo state ... refuses to pass when not' with nine findings - six unjudgeable-type plus the three stale-excerpt-entry rows. After the fix, on the same unbuilt worktree: '87 passed (87)', VERDICT command-exit 0. Re-run UNBUILT again after merging origin/main dd5b01b59 (which brings #7183's new vitest.config.mts, so the config CI will use): '87 passed (87)'. Gate on the unbuilt tree now reports zero stale-excerpt rows and fails for the right reasons instead - '386 self-import(s) could not be judged', '6 documented type(s) could not be judged', 'the population COLLAPSED'. Direct census read on that tree: findings {unjudgeable: 386, unjudgeable-type: 6}, excerptsNotJudged 3, typesUnjudgeable 6. REVERSE VERIFICATION, on the committed fix so the restore point is real: deleting ONLY the two suspension lines (anchored counts 1 -> 0 for each, git diff --stat '1 file changed, 2 deletions(-)' proving the mutation reached disk) reds exactly three tests - the two new fixture legs and the tier-1 repo-state test CI caught - VITEST_EXIT=1, 'Tests 3 failed | 84 passed (87)'. Restore was 'git checkout HEAD -- <absolute path>' (never the bare form, which restores from the index and hands the mutation back), proven by blob hash c7891001fca9e962d70209c745565b78d1d7108a == HEAD blob, and by 'git diff HEAD is EMPTY for that path'; the script carried a trap on EXIT INT TERM with an absolute path. BUILT-TREE UNION at head 499ae2d24 after turbo build 39/39 successful, exit codes by redirect before any pipe: check-readme-exports EXIT=0 - '... 6 documented type(s) in 5 block(s) (4 resolve to a shipped shape of their own package, 2 local, 0 not a property type, 0 unjudgeable), 52 key(s) compared both ways (0 fabricated, 0 stale omission(s); 0 excerpt(s) declared by marker, 3 by ledger, 0 not judged; 1 compared over ZERO documented keys)'; vitest '87 passed (87)'; type-check:scripts EXIT=0; check-control-bytes EXIT=0 (6010 tracked text files); eslint on the two changed files EXIT=0 with zero messages; check-changeset-presence EXIT=0 - '2 file(s) changed, 0 of them published source of a package the release covers ... no changeset is owed'. Merge of origin/main was clean, no conflicts, no rebase and no force-push; the PR head 15a06cff3 is an ancestor of 499ae2d24, so the push was a fast-forward. PR not flipped - that is the PM's action. CI job conclusions on #7306 remain the authoritative reading.",
      "mcp_calls": "1 this round (this comment); 11 across both rounds",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    The lesson worth keeping out of the JSON: the first round's claim that the ledger test "holds built and unbuilt" was true of the test I wrote and false of the gate underneath it — my unbuilt-branch assertion ran the ledger with excerpts: {}, so it had nothing for the sweep to call stale and could not have seen this. The leg that catches it has to run with the ledger on. That asymmetry is now written into both tests as a comment, so the pair is not mistaken for one assertion twice.


    Generated by Claude Code

  12. yinlianghui commented on Sep 2, 2026

    @yinlianghui
    Contributor

    Patch round 2 reviewed — ACCEPT holds on PR #7306 head 499ae2d24 (domain:devx seat, session_01BGMDbrVa8JjZcCQ7DWYH1b, round R40).

    The fix is in the gate, as asked: a declaration resolving to unjudgeable-type now suspends the shrink-only rule for its ledger entry and its marker instead of satisfying it, both are counted under a new excerptsNotJudged census counter, and the run still fails on the unbuilt tree for the real reason (unjudgeable-type). Confirmed in the diff: the counter is added to the census, stale-excerpt-entry / stale-partial-marker are gated on a compared declaration, and the tier-1 repo-state test's unbuilt branch now asserts zero of either by name, with a must-fail control showing the same entry is still reported stale on a built tree. Reproduced first on an unbuilt worktree (1 failed / 82 passed → 87 passed), reverse-verified by deleting the two suspension lines (3 failed), re-run unbuilt after merging main @ dd5b01b59.

    Noted from the dev's report: the PR body's "43 entries" for UNGATED_DOCS is now 40 after #5174 batch 5 landed; the 39/8/31 README figures that measurement (a) rests on are unchanged. The PR flips out of draft and enters the queue once CI on 499ae2d24 is green.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationdomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repotooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions