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.

finding(gate): the baseline-prose pin generalises to scripts/vite-declared-lazy-views.ts, but only its VALUE half — that file cites five commits with nothing live to check them against #7289

Closed

Description

@yinlianghui

Filed unassigned as an out-of-scope observation returned by #7046's implementation (PR #7286). Recording only — deliberately not fixed there; the dispatch for #7046 fenced scripts/vite-declared-lazy-views.ts explicitly and said to file rather than ride it along. Generated by Claude Code, dev session session_01BGMDbrVa8JjZcCQ7DWYH1b.

What #7046 built

PR #7286 adds a structural helper to scripts/__tests__/check-eager-closure-budget.test.ts:

attachedDocs(source, exportName) returns the documentation attached to one exported constant — the JSDoc block ending immediately before the export const NAME declaration, plus every comment lexically inside the declaration, with the code stripped out. It walks the initializer skipping comments and string literals, so it uses no line numbers and no per-file knowledge. On top of it sit three positive pins: every commit a constant carries as data must appear in its own attached prose; every BASELINE's `HASH` claim must name the live BASELINE.commit; every key the constant carries must appear in its per-key provenance list.

None of that is specific to check-eager-closure-budget.mjs.

Why this file is the obvious second customer

#6785 (closed) recorded the same failure mode one file over, and #7046's body makes the argument directly: "Two files, same week, same defect — which is the argument that this wants a mechanism rather than another hand fix." #6785 was repaired by hand, so nothing stops the next paragraph there from going stale.

⚠️ Measured before filing — only half of the mechanism transfers

Read on main at 64d624ded:

  • scripts/vite-declared-lazy-views.ts carries five 9-hex commit citations in prose (around lines 100, 225, 280, 338 and one inside a runtime message string near line 545).
  • It exports no constant carrying a commit string as data. The exports in that area are APP_CONTENT_PATH, EAGER_WALK_CONTROL (both path strings) and DECLARED_LAZY_VIEWS_STILL_EAGER (a frozen array of paths).

⇒ The commit half of the pin cannot transfer: there is nothing live to check those five hashes against, which is the same wall #7046 hit on PER_CHUNK_BASELINE and the reason its blanket negative pin was not shipped. Copying the commit pin over would produce a vacuously green test, which is #7046's own defect one layer up.

⇒ The value half transfers directly and non-vacuously: every path in DECLARED_LAZY_VIEWS_STILL_EAGER, and the values of APP_CONTENT_PATH and EAGER_WALK_CONTROL, can be required to appear in their own attached prose. An entry added, removed or re-pathed without touching the paragraph explaining it then reds a unit test instead of drifting — and per #6785 that file's entries carry hand-written counts in prose alongside them.

Suggested shape, if this is picked up

  1. Lift attachedDocs out of scripts/__tests__/check-eager-closure-budget.test.ts into a shared test helper under scripts/__tests__/ rather than copying it — two copies of a structural parser is the drift this whole class is about.
  2. Apply the value pin to the three exports above in scripts/__tests__/vite-declared-lazy-views.test.ts.
  3. Ablation is not optional here either: the same fence finding(gate): check-eager-closure-budget.mjs guards the numbers and not the prose explaining them — one paragraph went three re-baselines stale, with its conclusion reversed against the gate's own live verdict #7046 carried (mutate the real file, prove the mutation on disk, show red, restore under blob-hash proof).
  4. ⚠️ Whether the five prose commits should get any guard is a separate question with no cheap answer, and this card does not assume one. finding(gate): check-eager-closure-budget.mjs guards the numbers and not the prose explaining them — one paragraph went three re-baselines stale, with its conclusion reversed against the gate's own live verdict #7046 measured that a negative "no other hash in this block" pin is red on honest history, and no marker made it legal without rewriting narrative comments.

⚠️ Not addressed here, and left open on purpose: #6631, and #6785 stays closed — this is about the mechanism, not about re-opening either.

Activity

  1. added
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    on Sep 2, 2026
  2. claude commented on Sep 6, 2026

    @claude
    Contributor

    Claim: PM loop round R44
    Session: session_013uAaxiwgYDybsTNV9xwa1M
    Branch: claude/issue-7289-attached-docs-shared-helper-lazy-views-pin
    Worktree: objectui-issue-7289
    Domain: domain:devx
    File surface: scripts/__tests__/check-eager-closure-budget.test.ts (the attachedDocs region only — the helper leaves, an import arrives, the three pins keep asserting exactly what they assert), one NEW shared helper module under scripts/__tests__/ (or the repo's existing test-helper location if one exists — measure), scripts/__tests__/vite-declared-lazy-views.test.ts (the value-half pin); ⛔ no edit to scripts/vite-declared-lazy-views.ts or scripts/check-eager-closure-budget.mjs beyond a prose paragraph a pin proves missing, ⛔ no commit-half pin (measured vacuous on this file) (stop on breach; explain in the report)
    Container & model: M, not mechanical (a structural parser is lifted into a shared test helper without changing what its first customer asserts, and a value-half pin is applied to three exports; the commit half is measured non-transferable and stays out), mode:subagent, model: opus — objectstack's node scripts/pm/dispatch-gates.mjs --tier REFUSES --repo objectstack-ai/objectui (measured this round: gate families are a property of the tree it runs in), so the tier is the PM's per-card judgment under the script's declared policy floor sonnet · default opus · ceiling fable; no path-derived mandate applies to this surface.
    Clause-②: no
    Serial constraints cleared: draft PR #7685 (#7122, spec seat, held on a maintainer decision) carries two hunks on scripts/__tests__/check-eager-closure-budget.test.ts at old lines :611 (10 lines) and :795 (7 lines); attachedDocs and its three pins live at :1419–:1570 — disjoint, and the lift only deletes/re-imports in that region; not serialised behind #7685, overlap to be named in the PR body; no open PR touches scripts/vite-declared-lazy-views.ts or scripts/__tests__/vite-declared-lazy-views.test.ts (file lists of the 4 open non-dependabot draft PRs read at 05:16Z)


    Generated by Claude Code

  3. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    os-dev-report

    {
      "issue": 7289,
      "status": "done",
      "branch": "claude/issue-7289-attached-docs-shared-helper-lazy-views-pin",
      "pr": "https://github.com/objectstack-ai/objectui/pull/7982",
      "premise_still_valid": true,
      "summary": "attachedDocs was lifted verbatim out of scripts/__tests__/check-eager-closure-budget.test.ts into scripts/__tests__/helpers/attached-docs.ts — the directory's EXISTING shared test-plumbing location (six sibling helpers already live there and are imported as ./helpers/NAME), which the unit project's *.test.ts include never collects as a suite. The budget test imports it and its three pins assert exactly what they asserted before (101 passed before the lift, 101 passed after). The VALUE half of the pin is applied in scripts/__tests__/vite-declared-lazy-views.test.ts to all three exports. Two card premises re-measured: the commit half is still non-transferable (five 9-hex citations in prose at lines 100/227/282/340/547, which are TWO distinct commits — b98352a15 four times and fab4802e3 once, so the card's 'five commits' reads more precisely as five citations of two — against ZERO exported constants carrying a commit as data), and the value pin was NOT green on arrival: all three constants failed it. The ledger's bullet said RecordDetailView and the two control constants' blocks named no path at all, so three sentences in scripts/vite-declared-lazy-views.ts now name the path their constant carries. That prose is the only edit to that file; scripts/check-eager-closure-budget.mjs is untouched, no commit-half pin and no negative 'no other hash' pin were added. Assignee was already set by the PM dispatch; no second claim posted, assignee never written.",
      "tests": "All heavy runs through bash /home/user/objectstack/scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=issue-7289 and NODE_OPTIONS=--max-old-space-size=4096; every gate redirected to a file and the exit code captured before any pipe. BASELINE (pre-change, both suites): 'Test Files 2 passed (2)' / 'Tests 127 passed (127)', VERDICT command-exit 0. AFTER, per file: check-eager-closure-budget.test.ts 'Tests 101 passed (101)'; vite-declared-lazy-views.test.ts 'Tests 31 passed (31)' (26 before + 5 new cases). WHOLE scripts/ SURFACE at the final tree: 'Test Files 107 passed (107)' / 'Tests 3239 passed (3239)', VERDICT command-exit 0 — 107 files both before and after, so the new non-.test.ts helper is importable and is never collected as an empty suite (assumption A3 confirmed by measurement, not by reading the glob). PROBES, every mutation proven on disk before its run was read and every restore proven by blob-hash equality to the HEAD blob plus an empty 'git diff HEAD', each script carrying a trap on EXIT INT TERM with absolute paths. A0 (pass-count leg of the lift): the budget test restored to its pre-lift blob 5a772eaabd6146122761c0448e6ffc4f8966aa78 (grep proof: local function present 1, import present 0) ran '101 passed' — the same count the lifted version runs. A (behaviour-preserving lift): one commit hash inside the checker's gzipBytes prose retyped (injected 3d257c85b count 0 to 1, carried 3d257c85a still present 4 times elsewhere), then run TWICE — through the pre-lift local function and through the imported helper. Identical both ways: FAIL 'pins every commit BASELINE carries into its own attached prose', 'AssertionError: expected [ 3d257c85a ] to deeply equal []', '1 failed | 100 passed (101)'. B1/B2/B3 (ablation on the real file, on the committed tree): each constant's value taken out of its own paragraph in turn (anchor count 1 to 0, replacement 0 to 1, blob hash moved each time) reds exactly its own case — 'pins every path APP_CONTENT_PATH carries into its own attached prose', then EAGER_WALK_CONTROL, then DECLARED_LAZY_VIEWS_STILL_EAGER — each '1 failed | 30 passed (31)'. C (fake entry): a second ledger entry with no prose, ObjectDataPage.tsx chosen because it is a real file AppContent really declares lazy, so the sorted / exists / declared-lazy cases stay green and only the new pin speaks — '2 failed | 29 passed (31)': the prose pin and the vacuity record. HONEST NOTE, reported rather than quietly re-run: probe C's FIRST attempt was a NO-OP — a backslash-Q-quoted newline escape in the perl expression matched nothing, the file's blob hash did not move and the injected-text count read 0 to 0. The on-disk check caught it; the reading above is the re-run with a working anchor. Final state after every probe: blob hashes equal to HEAD, 'git diff HEAD' empty.",
      "gates": "At 5ae65749b, each gate's own verdict line quoted. pnpm type-check:scripts — exit 0, no diagnostics. pnpm lint:root — '32 problems (0 errors, 32 warnings)', exit 0; grep of the log shows zero hits on any of the four changed files (this is the full root eslint scan, not a narrowing). pnpm check:control-bytes — 'check-control-bytes: OK (scanned 6422 tracked text file(s); skipped 85 binary).' exit 0; plus a manual control-byte self-scan over the four files with grep -naP over the control-byte class, zero hits. pnpm check:unreferenced-sources — 'OK  Every shipped source file in every covered package is reachable.' exit 0. node scripts/check-changeset-presence.mjs — 'No source or published contract of a released package changed in this range, so no changeset is owed.' exit 0, 4 files changed and 0 of them published source, so NO changeset and NO label (objectui's skip-changeset label is inert here and is never applied). node scripts/check-governed-queue-guard.mjs --test on all four paths — 'NOT GOVERNED — 4 path(s) checked against 5 governed surface(s); none matched.' exit 0, so the ordinary route applies; PR left as draft per the dispatch, not flipped ready, no auto-merge, no labels, no assignee touched. TURBO_SCM_BASE=b313700937c959322f83f0329e73525a3b13375c pnpm exec turbo ls --affected — '0 no packages': the diff is entirely under scripts/, which no workspace package owns. Remote CI is in_progress at report time; waiting on it belongs to the PM.",
      "probe": "A0 lift pass-count 101 = 101 · A behaviour-preserving lift: identical single failure through the local and the imported helper · B1/B2/B3 per-constant prose ablation each reds only its own case · C fake ledger entry reds the pin plus the vacuity record · C's first attempt was a measured no-op and is reported as one · all restores proven by blob hash and an empty git diff HEAD",
      "final_sha": "5ae65749b7a2821f3a841078779175c061ea97b9",
      "files_changed": [
        "scripts/__tests__/helpers/attached-docs.ts (new, 106 lines)",
        "scripts/__tests__/check-eager-closure-budget.test.ts (attachedDocs region only: 78 lines removed, 6-line import block added)",
        "scripts/__tests__/vite-declared-lazy-views.test.ts (one import line, one new describe of 5 cases)",
        "scripts/vite-declared-lazy-views.ts (3 prose lines edited, 5 insertions / 3 deletions — comment text only, the paragraphs the new pin proved missing)"
      ],
      "readers": "Outside the fence, the only CODE reader of either touched module is apps/console/vite.config.ts, which imports viteDeclaredLazyViews from scripts/vite-declared-lazy-views.ts — and this PR's change to that file is comment-only, so nothing it reads moved. Three further files mention scripts/vite-declared-lazy-views.ts in PROSE only, with no import: packages/app-shell/src/index.ts, packages/app-shell/src/views/metadata-admin/index.ts, packages/app-shell/src/views/metadata-admin/register-builtins.ts. Nothing outside scripts/__tests__/ imports the new helper or check-eager-closure-budget.test.ts; git grep for attachedDocs returns hits only in the two suites and the helper itself.",
      "mcp_calls": "2 — create_pull_request and this add_issue_comment. Everything else went through git, repo-scoped REST (the zero-quota issue-page JSON payload for the card, and GET /repos/objectstack-ai/objectui/pulls/7685/files for the overlap check, both HTTP 200), and local greps. No search_issues call was needed: this run produced no out-of-scope finding to file, so there was nothing to de-duplicate.",
      "deviations": "None from the dispatch fence. Two departures from the dispatch's stated expectations, both measured and reported rather than worked around: (1) assumption A2 is FALSIFIED — the value pin was not green on this file today, all three constants failed it, which the dispatch's own item 4 anticipated and authorised repairing with prose; the count is 3. (2) The dispatch asked whether scripts/__tests__/ already has a helper-module convention — it does (scripts/__tests__/helpers/ with six modules), so no new location was invented. One textual change inside the otherwise token-identical lift: the not-found throw said 'in the checker' and now says 'in the source', since the function has two customers; no test asserts that string.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  4. claude commented on Sep 6, 2026

    @claude
    Contributor

    ACCEPT — PR #7982 (head 5ae65749b): the parser is lifted, not copied, into the directory's existing helper convention; its first customer asserts exactly what it asserted; the value pin on the vite file was red on arrival and now names three paths in their own prose.

    domain:devx @ objectui execution seat, PM session session_013uAaxiwgYDybsTNV9xwa1M, R44, 2026-09-06T05:40Z. Report 5557236662 reviewed against GitHub and the tree, ⛔ not against its narrative.

    item reading (mine)
    PR shape draft ✅ · base main ✅ · first line Fixes #7289 ✅ · no other closing keyword adjacent to a card number ✅ · one platform footer ✅ · the #7685 overlap sentence is in the body ✅
    Path surface (get_files) exactly 4: scripts/__tests__/check-eager-closure-budget.test.ts (+6/−78; hunks at old :4 and :1397 — disjoint from #7685's :611 / :795), scripts/__tests__/helpers/attached-docs.ts (+106, NEW — beside six existing helpers in that directory, which the unit project's *.test.ts include never collects), scripts/__tests__/vite-declared-lazy-views.test.ts (+111), scripts/vite-declared-lazy-views.ts (+5/−3, every changed line a comment line — read). scripts/check-eager-closure-budget.mjs untouched (diff vs base = 0). Governed guard NOT GOVERNED (4). No changeset owed; turbo ls --affected = 0 packages
    Lift, behaviour-preserving budget suite 101 → 101 (A0: the pre-lift blob re-run for the count); probe A: one retyped hash in the checker's prose fails the same case with the same assertion through the local function and through the import — identical
    The value pin five new cases, 26 → 31; A2 FALSIFIED usefully: all three constants failed the pin on arrival (their paragraphs named no path), so three sentences now carry the path — the one edit item 4 authorised; B1/B2/B3 ablations each red exactly their own constant's case; C (fake ledger entry, no prose) reds the pin plus the vacuity record. Commit half re-measured non-transferable: five 9-hex citations of TWO commits in prose, zero exported constants carrying one — no commit pin, no negative pin, as ruled
    Readers only code reader outside the fence is apps/console/vite.config.ts (imports viteDeclaredLazyViews) — comment-only change on that module, nothing it reads moved; three prose mentions in packages/app-shell; nothing imports the new helper outside scripts/__tests__/
    Gates whole scripts/ surface 107 files / 3239 tests (107 files before and after — the helper is not collected as an empty suite, A3 measured) · type-check:scripts 0 · lint:root 0 errors (0 hits on the four files) · check:control-bytes OK (6422) · check:unreferenced-sources OK · check-changeset-presence none owed · governed guard NOT GOVERNED — quoted at 5ae65749b. One void probe attempt (C's first perl anchor matched nothing — blob unchanged) declared, not hidden
    CI on head at 2026-09-06T05:39Z 16 success · 10 in progress · 3 skipped · 0 failing

    No findings filed; none owed. #6785 stays closed; #6631 untouched.

    Landing plan

    Path surface clean ⇒ flipped ready at 2026-09-06T05:40Z; auto-merge armed only when every check is green; enqueue confirmed by added_to_merge_queue. On MERGED the card closes via Fixes; strip pm:dispatched and clear the assignee in the same stroke.


    Generated by Claude Code

  5. claude commented on Sep 6, 2026

    @claude
    Contributor

    LANDED — PR #7982 merged 2026-09-06T06:05:49Z (queued 05:52:08Z). Verified on origin/main 4c66baa35 by CONTENT, ⛔ not by the merge event.

    domain:devx @ objectui execution seat, PM session session_013uAaxiwgYDybsTNV9xwa1M, R44 — post-release stroke by the releasing session (2026-09-06T06:06Z), completing its own ACCEPT 5557243562.

    reading expected got
    scripts/__tests__/helpers/attached-docs.ts present 1 1
    helpers/attached-docs imported by check-eager-closure-budget.test.ts ≥ 1 1
    local function attachedDocs left in that file 0 0
    the helper imported by vite-declared-lazy-views.test.ts (the value pin) ≥ 1 1
    RecordDetailView.tsx path now in its own prose in scripts/vite-declared-lazy-views.ts ≥ 1 2
    control — PER_CHUNK_BASELINE pin still in the budget test ≥ 1 26 ✅ probe fires

    Card closed by Fixes. Stripping pm:dispatched and clearing the assignee in this stroke.


    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

No one assigned

    Labels

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repoenhancementNew feature or requestfindingpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions