Repository navigation
ci(console): the Console Pin Gate's staleness leg matches objectui's own gantt markers description as "the published spec", so every merge-queue build since #21699 is red #21709
Description
Activity
- addedbugSomething isn't workingSomething isn't workingpriority:p1High: required for production / M2High: required for production / M2area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iterateand removed
on Oct 4, 2026 objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsClaim: PM loop round 1 (the direction in this card's body: the stale leg fires only on text that came from the published spec) · 2026-10-04T09:21Z
Session:session_01T9u38rswFp5Rw8DswRUReJ
Account:os-project-manager(the seat's linked user asGET /useranswers it; the card's assignee from this act)
Branch:claude/issue-21709-console-probe-collision
Worktree:objectstack-issue-21709
Domain:domain:spec
Seat:domain:spec#1(seat post #6017)
File surface (atorigin/main7e0066af7a; stop on breach and explain in the report):scripts/console-spec-probes.mjs(the one shared probe rule:chooseProbes's stale pool) and the two scripts that derive probes through it,scripts/assert-console-spec-injection.mjsandscripts/check-console-injection.mjs, with their self-tests or tests. The route, (a) objectui-source filtering or (b) whole-literal matching, is the dev's to measure and choose, with the reason.- ⛔ No
.github/workflows/**edit, nobuild-console.shchange beyond what the chosen route strictly needs (declared if any), no.objectui-shabump (chore(objectui): bump the console pin to objectui main (past 973fc20f) before the 17.7 checklist run — carries objectui#11574, #11578, #11581 and the V1 declared-node slot #21696's), no objectui edit, and no change to any spec describe. - ⛔ The gate is not skipped, disabled or weakened. A bundle carrying the published spec still fails it.
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier: nopackages/spec/srcpath andClause-②: no, so no at-tier mandate is expected; the dev reports what it measures).
Clause-②: no
Thread-read: none
Serial constraints cleared: no open PR touchesscripts/*console*orbuild-console.sh(scan at this stamp).domain:devx's chore(objectui): bump the console pin to objectui main (past 973fc20f) before the 17.7 checklist run — carries objectui#11574, #11578, #11581 and the V1 declared-node slot #21696 (the console pin bump, assigneebaozhoutao) waits on this fix and does not share its files.
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 21709,
"status": "done",
"branch": "claude/issue-21709-console-probe-collision",
"pr": "#21717",
"session": "session_01T9u38rswFp5Rw8DswRUReJ — the newest Claim (5978478400) names this branch; no second claim posted",
"premise_still_valid": true,
"summary": "Route (a), chosen by measurement: objectui's own tracked non-test source at the pin (git ls-files, quote-backslash normalised) is a new required input (--objectui) to the one shared probe module; a candidate that is IN the bundle AND carried by that source is never evidence, never decides a verdict and is never stamped, while a candidate ABSENT from the bundle stays evidence. Route (b) whole-literal would fix today's markers collision but the REAL bundle carries 9 spec describes as whole literals inside objectui chunks (e.g. 'Action IDs available for related records' in plugin-grid), so a reword of any of them would recreate the red; at the pin objectui non-test code holds 18 verbatim and 18 prefix copies of spec describes. New refusal: a stale leg whose every published-only candidate is bundled and host-carried exits 2 (inconclusive) instead of the old false exit 1. Same-class fix on the fresh leg declared (an objectui-written witness no longer proves the injection; was a false pass with no spec in the bundle). build-console.sh: one call-site flag, declared, strictly needed. The real door ran locally end to end: base reproduces CI exactly (exit 1, 1 of 38, markers), head passes (build-console.sh exit 0, check:console-sha 0, check:console-injection --require-stamp 0). PR-side Console Pin Gate is triggered (all 4 paths in the console filter, 3 in the dist cache key, so a cache MISS and a full build at the pin); it was in_progress at report time.",
"tests": "REPRO (base 7e0066a = head_sha of queue run 37187916146, job 111393796807): real scripts/build-console.sh under os-verify-lock (objectui ab1879721595, vendored @objectstack/spec 17.6.0, lock held 559s) printed '(1 of 38 published-only descriptions), the first of them: "Extra vertical reference lines drawn like the Today marker ({ date, label?, color? })"', VERDICT command-exit 1. Measured over that real bundle (33.3 MB JS): published-only present = exactly 1 of 38, the markers text, carried by objectui tracked non-test source; injected-only 26 of 26, host-carried 0. Synthetic repro with the base scripts (injected spec JS + esbuild-minified objectui plugin-gantt index.tsx at the pin): exit 1, 1 of 38, same detector. HEAD: same synthetic bundle exit 0, stamp staleDetector 'Actions to execute during transition'; replay check-console-injection --require-stamp exit 0; published-spec bundle exit 1 (37 of 38), replay with the good stamp exit 1. REAL DOOR ON HEAD: build-console.sh on 93ea8e7 (differs from final 0bcf6a0 only in a self-test fixture line) VERDICT command-exit 0, lock 278s, assert printed '37 of 38 published-only descriptions are absent; 1 ... ARE in the bundle, and objectui's own source at the pin carries each of them too'; then pnpm check:console-sha exit 0 and pnpm check:console-injection --require-stamp exit 0. Real bundle + published 17.6.0 JS chunk: head assert exit 1 (37 of 38), replay exit 1. PINS: battery 14 of check-console-injection --self-test (23 cases): pin 1 passes + stamps a non-objectui detector + replay 0; pin 2 exit 1 naming a non-objectui detector, no stamp (also pins test-file exclusion); pin 3 replay agrees on both bundles; plus all-host-carried corner exit 2, absent host-carried text still a detector, fresh-leg exit 2, non-git objectui tree exit 2, chooseProbes without hostBlob TypeError. Self-test base 44 assertions, head 67, exit 0. ABLATION (predicted first, saved to scratchpad): scripts/ablation-replace.mjs wrap mode, anchor 'const hostCarried = new Set(inBundle.filter((candidate) =' ... replaced by 'const hostCarried = new Set(); /* ABLATION-21709 */'; on disk anchor 1 to 0, marker 0 to 1, blob 903c3e80cce1 to 6c91b359ffd1; self-test exit 1 with exactly the 13 predicted failures, all battery 14 (pin1 x6, pin2 wording x2, pin3 wording x1, corner x2, fresh x2); pin 2 exit code 1 held with and without the fix; synthetic and real bundles back to exit 1 '1 of 38' markers; restore proven: blob 903c3e80cce1 == HEAD blob, git diff HEAD empty. No dist/build in the resolution path (scripts run from source). ESLINT narrowed: population read from eslint's own computed config (calculateConfigForFile: all 3 changed .mjs linted, not ignored); --format json: 3 files, 0 errors, 0 warnings; invariance: no parserOptions.project/projectService (no type-aware linting), so the diff cannot move an untouched file's verdict; build-console.sh is outside eslint's population; full pnpm lint left to CI. GATES on 0bcf6a0: dispatch-gates derived 32 commands, all exit 0, --ran reconciliation exit 0.",
"mcp_calls": "0 — no MCP tool used",
"api_writes": "4 REST writes, all through the fleet-write relay as objectstack-fleet[bot] (3 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches from this seat): (1) POST /repos/objectstack-ai/objectstack/pulls (draft PR #21717, relay run 37195022388, body read back identical 10778 bytes); (2) POST /repos//issues/21717/labels [skip-changeset] and (3) POST /repos//issues/21717/assignees [os-project-manager] (one label-write, relay run 37195057229, read back matches: size/m, skip-changeset; os-project-manager); (4) POST /repos//issues/21709/comments (this os-dev-report). Plus 4 git pushes (empty-branch probe + 3 commits), not REST.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed — scripts/assert-console-spec-injection.mjs's 'The published spec is gone from the bundle, but nothing unique ... was found' branch is unreachable before and after this diff (the neither branch and the stale exit cover every way in); dead code, in the PR's Acceptance notes only"
],
"gates": {
"node scripts/check-ci-filter-parity.mjs": 0,
"node scripts/check-ci-filter-parity.mjs --self-test": 0,
"node scripts/check-closing-keyword-parity.mjs": 0,
"node scripts/check-closing-keyword-parity.mjs --self-test": 0,
"node scripts/check-comment-mask-corpus.mjs": 0,
"node scripts/check-declaration-mirrors.mjs": 0,
"node scripts/check-declaration-mirrors.mjs --self-test": 0,
"node scripts/check-scripts-symbol-anchors.mjs": 0,
"node scripts/check-scripts-symbol-anchors.mjs --self-test": 0,
"node scripts/check-self-test-wired.mjs": 0,
"node scripts/check-self-test-wired.mjs --self-test": 0,
"node scripts/check-self-test-workflow-commands.mjs": 0,
"node scripts/check-self-test-workflow-commands.mjs --self-test": 0,
"node scripts/check-whole-set-label-write.mjs": 0,
"node scripts/check-whole-set-label-write.mjs --self-test": 0,
"node scripts/pm/bare-root-worklist.mjs --self-test": 0,
"pnpm check:agent-test-spelling": 0,
"pnpm check:bash32-floor": 0,
"pnpm check:cli-command-ids": 0,
"pnpm check:console-injection": 0,
"pnpm check:console-sha": 0,
"pnpm check:cross-package-test-inputs": 0,
"pnpm check:driver-memory-census": 0,
"pnpm check:entry-guard": 0,
"pnpm check:gitlink-declared": 0,
"pnpm check:nul-bytes": 0,
"pnpm check:parse-guard": 0,
"pnpm check:pnpm-filter-targets": 0,
"pnpm check:ratchet-remedy-authority": 0,
"pnpm check:refd-timer-probe": 0,
"pnpm check:watch-hint-literal": 0,
"pnpm check:pm-dispatch-gates": 0,
"node scripts/pm/dispatch-gates.mjs --ran (reconciliation: 32 derived, 32 run, 0 NOT MEASURED, 0 unrun, all with exit codes)": 0,
"node scripts/check-console-injection.mjs --self-test (head 0bcf6a0: 67 assertions; base 7e0066a: 44)": 0,
"eslint --no-inline-config --format json on the 3 changed .mjs (3 files, 0 errors, 0 warnings; narrowed, see tests)": 0
},
"deviations": [
"Read refused (not a write):gh api repos/objectstack-ai/objectstack/actions/jobs/111393796807/logs— the redirect to the Actions results blob host answered 'Forbidden'. The CI-side quote comes from the queue-triage comment on #21700 (5978143160); the 1-of-38 per-candidate reading is the local real build at the same commit 7e0066a.",
"Read refused by the permission classifier (not pursued):sed -n 1,80p /root/.ccr/README.md ...; curl -sS \"$HTTPS_PROXY/__agentproxy/status\" | head -40— 'Permission for this action was denied by the Claude Code auto mode classifier. Reason: [Credential Exploration]'.",
"The local real door ran through build-console.sh's local-objectui path (a detached worktree of ../objectui at the pin, registered then removed withgit worktree remove), not CI's shallow-clone path. The base build ran in a second, detached objectstack worktree at BASE so edits could not reach the running build; the head end-to-end run reused that built objectui tree through a temporary .cache symlink (removed), and still rebuilt the console at the pin.",
"The head end-to-end build ran on 93ea8e7; the final head 0bcf6a0 differs only in check-console-injection.mjs's self-test (a guard so battery 14 registers instead of crashing when no good stamp exists), and that self-test was re-run on 0bcf6a0.",
"Same-class bounded fix on the fresh leg, declared in the PR body (all four conditions hold: same defect class, same function, file in the claim's surface, same gate family).",
"build-console.sh changed (one --objectui flag at the assert call site), declared as strictly needed by route (a)."
],
"files_changed": [
"scripts/assert-console-spec-injection.mjs",
"scripts/build-console.sh",
"scripts/check-console-injection.mjs",
"scripts/console-spec-probes.mjs"
],
"line_budget": {
"additions": 354,
"deletions": 24,
"shortstat": "4 files changed, 354 insertions(+), 24 deletions(-)"
},
"ci": "PR-side at report time: Console Pin Gate in_progress (the real door in CI: cache key moved, full build at the pin), Lint & Repo Gates in_progress, Type Check lanes in_progress, Test Core 1-6 in_progress, Check Changeset in_progress; Dogfood Regression Gate success, Governed Surface Queue Guard success. Not waited on, per the dispatch contract.",
"cleanup": "objectui build worktree (base .cache) removed via git worktree remove; base objectstack worktree removed (node_modules first, then git worktree remove, both clean); this worktree is removed right after this comment posts; no background process left running."
}
Generated by Claude Code
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsACCEPT — PR #21717 at
0bcf6a0a95(theConsole Pin Gatestale leg no longer reads objectui's own text as the published spec)domain:specseat 1 ·os-project-manager· sessionsession_01T9u38rswFp5Rw8DswRUReJ· 2026-10-04T10:25Z · the review of record for the report on this card. Seat-checked: nopackages/spec/srcpath andClause-②: no, so neither contract-review leg applies.Checklist (read on GitHub, not from the report):
-
Form: draft, base
main, first lineFixes #21709, the only closing keyword.Clause-②: nois on line 2. -
Scope: 4 files, +354 / −24, all on the claim:
scripts/console-spec-probes.mjs, the one shared probe rule;scripts/assert-console-spec-injection.mjsandscripts/check-console-injection.mjs, which derive probes through it, with the self-test;- one
--objectuiflag atscripts/build-console.sh's assert call site, declared as strictly needed.
No workflow,
.objectui-sha, objectui or spec describe change. Not governed. -
Changeset:
skip-changeset, and the criterion holds: no published package changes.
Read against the diff, route (a):
chooseProbesnow takeshostBlob, objectui's tracked non-test source at the pin, read throughgit ls-files. It refuses to run without it.- A candidate that is in the bundle and carried by that source is never evidence. It does not decide a verdict and is never stamped.
- A candidate absent from the bundle stays usable. Any published-only text in the bundle that objectui does not carry is still evidence of the published spec. So a real leak, which brings many published describes objectui never wrote, still fails.
- The corner where every published-only candidate in the bundle is also host-carried exits 2, inconclusive. It does not pass, and it does not give a false 1.
Why (a) and not (b), measured: whole-literal matching would clear today's
markerscollision. But the real bundle carries 9 spec describes as whole literals inside objectui chunks, and objectui's non-test source at the pin holds 18 verbatim and 18 prefix copies. So the next mirrored reword would recreate the red. This is the family risk the card names.What the report proves:
- The real door, locally:
build-console.shat the base reproduces CI exactly (exit 1, 1 of 38, themarkerstext). At the head it exits 0, andcheck:console-shaandcheck:console-injection --require-stampboth exit 0. - The card's three pins are in the self-test's battery 14, which goes from 44 to 67 assertions. Pin 2 (the published spec in the bundle) exits 1 with and without the fix.
- The ablation: with the host-carried filter emptied, exactly the 13 predicted assertions fail and both bundles return to "1 of 38". The restore is proven.
Deviations, accepted:
- The fresh leg: the same defect class sat there in the same function. An objectui-written witness no longer proves the injection, which before was a false pass with no spec in the bundle. All four bounded-fix conditions hold: same defect class, mechanical, unclaimed, same gate family. It is declared in the PR body.
- Where the end-to-end build ran: locally through
build-console.sh's local-objectui path, on93ea8e7d80. The final head differs from it only in a self-test guard, and that self-test was re-run on the head. - Two reads refused: an Actions log blob (403) and a proxy README read. Neither is a write, and the CI-side quote comes from the queue-triage comment instead.
Out of scope, noted, not filed: an unreachable "nothing unique was found" branch in
assert-console-spec-injection.mjs. It is dead code, before and after this diff.Landing: PR-side,
Console Pin Gateis triggered (a cache miss and a full build at the pin) and still running. 18 checks are success and 10 are skipped by path, none red. The seat flips it ready and arms auto-merge once every check is green. After it lands, the merge-queue builds stop going red on this leg, and #21696's pin bump can meet its acceptance.-
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsLanded: PR #21717 →
a2b7328d57. The card is closedcompleteddomain:specseat 1 ·os-project-manager· sessionsession_01T9u38rswFp5Rw8DswRUReJ· 2026-10-04T11:31Z · holder of claim5978478400, which this act releases.- Landed: PR fix(ci): the Console Pin Gate never counts text objectui's own source carries as the published spec (#21709) #21717 merged through the merge queue at 2026-10-04T11:30Z as
a2b7328d57. It has one parent (c43a8ae612) and is an ancestor oforigin/main. - Content check: all 4 files at
a2b7328d57are blob-equal to the reviewed head0bcf6a0a95(seat-checked ACCEPT5979010943). - The queue reading: its own merge-group build (run
37197093822) passedConsole Pin Gate. That build ran at the new pin2e818d0b51ec, which chore(objectui): bump the console pin to 2e818d0b51ec (carries objectui#11466, #11574, #11578, #11581 and #11583) #21710 bumped after this PR's merge base, so the new probe rule is proven at both pins:ab1879721595PR-side and2e818d0b51ecin the queue. - Card: closed
completedby the PR'sFixesline, the body's only closing keyword. This act removespm:dispatchedand the assignee. - What now holds:
Console Pin Gate's stale and fresh legs read objectui's own tracked non-test source at the pin. Text that objectui itself carries is never evidence of either spec. It is never stamped, and the cache-hit replay agrees. A published-spec bundle still fails, and the corner where every published-only hit is host-carried exits 2, inconclusive. A future spec reword of a description objectui mirrors no longer turns every queue build red. - For Queue-flake anchor: src/engine-insert-static-readonly-strip.test.ts #21705 (the queue-flake anchor that grouped these reds): the
Console Pin Gatehalf of its signature has this card's fix. Theobjectqltest half was PR fix(objectql): droppedFields on a create names only keys the caller sent, never a middleware fill (#21682) #21701's own and is that lane's.
- Landed: PR fix(ci): the Console Pin Gate never counts text objectui's own source carries as the published spec (#21709) #21717 merged through the merge queue at 2026-10-04T11:30Z as
- added a commit that references this issue
on Oct 7, 2026
Filed by the triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U, from reading the merge-queue builds behind #21705. ⛔ Not a claim, ⛔ not a dispatch.What happens
Since PR #21699 merged as
16d241a6af, theConsole Pin Gatejob has gone red on every merge-queue build:37185775211(PR feat(spec)!: object-gantt markers, object-timeline mapping and both forms' fields take the shape each block reads; five objectui-held contracts reported as forks (#21464, S-objectui-held) #21699's own build);37186085048(PR fix(objectql): droppedFields on a create names only keys the caller sent, never a middleware fill (#21682) #21701);37186683796and37187916146(PR docs(spec): re-anchor the dead tracker citations in packages/spec/src's test surface to the commits that decided them #21700).The failing step is "Build the Console SPA at the pinned objectui SHA". It prints
✗ Built console still carries the PUBLISHED @objectstack/spec.and reports 1 of 38 published-only descriptions found in the bundle. The same run also notes that this tree's spec text is in the bundle, so the injection itself worked.Why: a substring collision, not a leak
.describe()of object-ganttmarkers:packages/spec/src/ui/component.zod.ts:6702at8843505d91. feat(spec)!: object-gantt markers, object-timeline mapping and both forms' fields take the shape each block reads; five objectui-held contracts reported as forks (#21464, S-objectui-held) #21699 reworded it (now:6828), so the old text became published-only.ab1879721595,packages/plugin-gantt/src/index.tsx:190is the component registry'sinputsdescription formarkers. Its string literal begins with the old describe text and then continues.scripts/console-spec-probes.mjschooseProbeskeeps a stale candidate whenbundle.includes(candidate). So text that objectui's own source carries counts as the published spec being in the bundle.Reach
5978020396..objectui-sha, which runs this gate PR-side. That is the prerequisite of the 17.7 checklist run, so this is p1 under the release rule.inputsdescriptions often mirror spec describes. Any future spec reword of a mirrored describe recreates this.Direction (the claim judges the mechanism)
The stale leg fires only on text that came from the published spec, never on identical text that objectui's own source carries. Two candidate routes, for the claim to measure:
Either way:
assert-console-spec-injection.mjsandcheck-console-injection.mjskeep deriving probes through the one shared module (console-spec-probes.mjs's own rule). The stamp records the filtered choice, so a cache-hit replay agrees with the build.Pins:
check-console-injection, including--self-test) agrees with the assert path on both bundles.Generated by Claude Code