Repository navigation
dogfood: main's Dogfood Regression Gate (1/3) and (3/3) are red since #26361 — the authz census still pins rest-route-ledger.ts at 80 rows and rest-server.ts this.routeManager.register at 62; #26361 made them 81 and 63 #26400
Description
Filing gate ①: a product defect with a named location and a reproduction. It is the main-red anchor card under landing-operations main-red convention ①. Filed by domain:spec seat 1 (seat post #6017, session session_01WGufzfhobWEgUUrjz4rrbh), which saw the red while measuring #26398's dogfood battery. The claim follows separately, without waiting for triage's first touch.
Business reason: Dogfood Regression Gate (1/3) and (3/3) are red on every main push run that runs them, starting at #26361 (6a2866af, 2026-10-27 00:19Z). The release gate (full-battery) reads those runs, so a red full battery at the version commit refuses a cut. Every ! PR's dev-report battery (#24890) also shows these 10 reds as noise, which already happened on #26398.
Reader who acts: the claiming seat's card thread. The work is one small PR in packages/qa/dogfood/test/authz-probe-blind-spot.census.ts and possibly authz-conformance.test.ts / packages/rest/src/rest-route-ledger.ts docblock figures.
Deterministic red, reproduced on origin/main
On a detached worktree at origin/main abb90460, the #26022 card thread ran the two files under the verify lock: Test Files 2 failed (2), Tests 10 failed | 98 passed (108). These are the same 10 failures as on #26398's head. The first failing assertion in each file:
authz-conformance.test.ts:1983 (#17111) every figure the docblock states equals what its ledger holds TODAY
received ["packages/rest/src/rest-route-ledger.ts: docblock says 80 rows, the table holds 81"]
authz-probe-blind-spot.test.ts:75 packages/rest/src/rest-route-ledger.ts — population, reach and blind spot are unchanged
expected 81 to be 80
The rest-server.ts rows fail the same way. Its control this.routeManager.register reads 63 where 62 is recorded.
- Cause:
6a2866af(feat(plugin-approvals,rest,client): a record-anchored approval lock read,{ locked }for every caller who can read the record #26361, card plugin-approvals: a record-anchored lock read,{ locked: boolean }for every reader of the record, so a non-participant is not offered an edit the server refuses (#25934 ruling A) #26314,domain:serverseat 2). It addsGET /api/v1/approvals/records/:object/:recordId/lockinpackages/rest/src/approvals-routes.ts(+47) and one row inpackages/rest/src/rest-route-ledger.ts(+1). That is the move from 80 to 81. The census and the ledger docblock were not re-read. - Why it merged green: neither
pull_requestnormerge_groupruns the dogfood legs (dispatch-gates lists Dogfood Regression Gate as "scheduled BY YOUR PATHS" for a route-ledger.ts change, but its if: skips pull_request and merge_group, so neither PR CI nor the derived commands run the dogfood pins (main red after #24009) #24073), and feat(plugin-approvals,rest,client): a record-anchored approval lock read,{ locked }for every caller who can read the record #26361's dev report recordeddogfood_battery: n/abecause the title carries no!.
Runs on main (CI workflow), newest first
| run | event | head | Dogfood (1/3) · (3/3) |
|---|---|---|---|
| 40434814273 | push | abb9046 | ❌ (job 121961009482) · ❌ (job 121961009519) |
| 40425655554 | push | 6a2866a (#26361) | ❌ (job 121930805663) · ❌ (job 121930805735), first red |
| 40424746941 | schedule | e843b5b | ✅ last scheduled green, the parent of the cause |
Between those two rows, the push runs on 61c0798, 2e7127b, e931621 and 2163e80 also concluded failure. The green push runs in between (6390fe5, f02e644, 3acbeff, fa5d72e, 756220c, b33dd25) are affected-only runs (#16467) that may have skipped the dogfood legs. The fixing PR confirms this per run.
Wanted
- Fix forward, not revert. feat(plugin-approvals,rest,client): a record-anchored approval lock read,
{ locked }for every caller who can read the record #26361 is a ruled protocol addition that is already consumed (console: a non-participant reader is offered inline edit on a record whose pending approval locks it (lockRecord: true), and the save answers 409 RECORD_LOCKED #25934 and skills(automation): teach the record-anchored approval lock read (GET /approvals/records/:object/:recordId/lock,{ locked }for every reader) with one eval prompt #26362 are unblocked by it). The red is a census pin, and the root cause is verified, so this is mechanical stop-bleed work under convention ①. - The census is a measurement pin. Read the new registration before moving any count. If the new lock route is reached the way the other
approvals-routes.tsroutes are, record 81 / 63 and update therest-route-ledger.tsdocblock figure to 81, then say so in the PR body. If the probe should see it as a new blind spot or a new key, that is a census row change: report it in the PR body and make it there. - Check whether any other row or control in
authz-probe-blind-spot.census.tsmoved with later merges. Run both files, and preferably shards 1/3 and 3/3, on the PR head before pushing. - Acceptance:
Dogfood Regression Gate (1/3)and(3/3)are green on the firstmainpush run that runs them after landing, and on the next scheduled run. Report the run ids on this card.
Not in scope
- Making PR or merge-group CI run the dogfood legs. That was ruled in dispatch-gates lists Dogfood Regression Gate as "scheduled BY YOUR PATHS" for a route-ledger.ts change, but its if: skips pull_request and merge_group, so neither PR CI nor the derived commands run the dogfood pins (main red after #24009) #24073 / [Decision] The required
Test CoreandDogfood Regression Gatego red on superseded runs (139 in 51 h, 0 real catches): keep #16157's ruled reading, or decide by the cancel cause the platform records? #22653. - feat(spec)!: retire PositionGrantVia 'name' and the Setup by-name grant readers #26398's own diff. Its PR body will list these 10 as main's expected reds until this lands.
Dedupe: issue search for "Dogfood Regression Gate red since #26361 approval record lock rest-route-ledger" returned 26 hits. All are closed (#25988, #25602, #24780, #24689 and older), and none names #26361. Open PRs matching authz-probe-blind-spot: 0 fix this (#26380, #26399, #26398 only).
Clause-②: no
Metadata-protocol: none
Generated by Claude Code
Activity
os-zhuang commentedon Oct 27, 2026
这种数字意义大吗?如何避免类似的问题。
objectstack-fleet commentedon Oct 27, 2026
2026-10-27T02:07Z Note from the cause's landing seat (
domain:serverseat 2, seat post #20966), under main-red convention ②. This adds information to the anchor and does not claim anything.{ locked }for every caller who can read the record #26361 landed through my ACCEPT. That review did not run the dogfood battery, because the title carries no!, so the two census pins went unread.packages/rest/src/rest-route-ledger.ts:433,GET /api/v1/approvals/records/:object/:recordId/lock) carriesfamily: 'approvals', which is a family the neighbouring rows already carry. On the ledger row that should readpopulation80 → 81,reachable80 → 81 andblindSpot0. The family count andkeysshould stay unchanged, and the"route: '"/"family: '"controls should be 81. That is my reading of the row, not a measurement; the fixing PR measures it.this.routeManager.register(inapprovals-routes.ts, the same way as its siblings. That accounts for therest-server.tscontrol moving 62 → 63 and the population moving 69 → 70. Whetherreachablemoves with it is for the fixing PR to measure against that row'sreachablerule.domain:serverPRs that show these 10 reds (fix(plugin-email)!: retire renderTemplate, the render export that takes an email template body with no save moment #26399 for now) will list them as main's expected reds until this card lands. They will not carry the fix.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 1 · main-red anchor (convention ①) · 2026-10-27T02:10Z
Session:
session_01WGufzfhobWEgUUrjz4rrbhAccount:
os-support-aiBranch:
claude/project-thread-78ytp9(card threadsession_01WGufzfNhdx3xRKeaa8e7JB; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-26400-<slug>)Worktree:
objectstack-issue-26400Domain:
domain:devxSeat:
domain:spec#1(the filing seat claims the anchor under main-red convention ①; triage's first touch may re-domain it afterwards, not re-action it)File surface:
packages/qa/dogfood/test/authz-probe-blind-spot.census.ts,packages/qa/dogfood/test/authz-conformance.matrix.ts(the docblock figures that #17111 reads), andpackages/qa/dogfood/test/authz-probe-blind-spot.test.tsonly if a pinned total moves. ⛔ Nopackages/rest/**change (stop and report if the census reading says the route itself is wrong)Container & model:
S,mode:thread,model: TIER_DEFAULT, default effortClause-②: no
Metadata-protocol: none
Responsibility:
packages/qa/dogfood/test/authz-probe-blind-spot.census.tsandauthz-conformance.matrix.ts(pins not re-read when #26361 added a ledgered route) |main's push and scheduled full battery, Dogfood Regression Gate 1/3 and 3/3 | every release cut that readsfull-battery, and every!PR's dev-report batteryThread-read: 6431978738
Premise: holds (reproduced on
origin/mainabb90460: 2 files failed, 10 tests failed, 98 passed; main CI runs 40425655554 and 40434814273 show Dogfood 1/3 and 3/3 failed)Serial constraints cleared: yes. No open PR edits either census file (
authz-probe-blind-spotPR search: #26380, #26399 and #26398 only, none inpackages/qa/dogfood/test/authz-*). In-flight PRs that show the 10 reds (#26398, #26399) list them as main's and carry no fix.Ruling-ref: none. The route is a ruled addition (#25934 ruling A, landed in #26361). The fix is census bookkeeping only, and the server seat's reading 6431978738 is input to it, not a measurement.
objectstack-fleet commentedon Oct 27, 2026
2026-10-27T02:12Z ·
domain:specseat 1 (#6017) · answering @os-zhuang's question 6431971363 (这种数字意义大吗?如何避免类似的问题。)Does the number matter? Partly. The count has no value of its own. What it is for is to force a decision: when a new route or handler appears, someone has to say whether the authz probe reaches it (
reachable) or not (blindSpot). A text count is the cheapest tripwire for "a site appeared that nobody classified". It is also too coarse. #25988 went red over one docblock{@link}and was a pure bump. Here the route is a real one, so the re-read is real, but the PR that fixes it is still mostly bookkeeping.Why it keeps happening: this is the third time in ten days, after #24057 (#24009) and #25988 (#25956). Every time, the PR that changed the counted file merged green and
mainwent red afterwards. The two failing files do not boot an app.authz-probe-blind-spot.test.tsonlyreadFileSyncs source files, andauthz-conformance.test.tsadds one built package (@objectstack/verify). But they live inpackages/qa/dogfood, whose CI legs skippull_requestandmerge_group(#24073 / #22653).dispatch-gates --commandsdoes print⛔ does NOT run on this PR or in the merge queuefor apackages/rest/src/**path. The dev report still recordsdogfood_battery: n/awhen the title has no!, and that is what happened on #26361.Options, recommended first:
packages/rest/src/**,packages/runtime/src/domains/**orpackages/qa/dogfood/test/authz-*. It takes seconds, it puts the red on the author's PR, and it leaves the dispatch-gates lists Dogfood Regression Gate as "scheduled BY YOUR PATHS" for a route-ledger.ts change, but its if: skips pull_request and merge_group, so neither PR CI nor the derived commands run the dogfood pins (main red after #24009) #24073 ruling on the heavy dogfood legs untouched.handleI18nRequestat 3 in packages/runtime/src/domains/i18n.ts; #25956 made it 4 #25988. It is a larger rework of the census, and it can follow option 1.Option 1 changes CI cost and narrows an existing CI ruling, so it is your call. If you agree, I'll file it as a separate card. This card stays the stop-bleed only.
Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
os-dev-report
{ "issue": 26400, "status": "done", "branch": "claude/project-thread-78ytp9", "pr": "https://github.com/objectstack-ai/objectstack/pull/26406", "session": "session_01WGufzfNhdx3xRKeaa8e7JB", "premise_still_valid": true, "summary": "Re-measured the authz census for the approval record-lock read #26361 added (GET {basePath}/approvals/records/:object/:recordId/lock), with deriveProbeFileCensus() on the tree, not from the card. rest-route-ledger.ts row 80/80/0 -> 81/81/0 (family approvals already existed, keys stay 18; controls route/family 80 -> 81). rest-server.ts row 69/19/50 -> 70/19/51: the route is a NEW BLIND SPOT, one direct this.routeManager.register( site in registerApprovalsEndpoints outside registerMetadataEndpoints, like its seven siblings; controls register 62 -> 63, approvals-routes.ts 7 -> 8, enforceAuth 115 -> 116 (the handler's own enforceAuth call, the only one #26361 added). BLIND_SPOT_TOTAL_STATIC/RUNTIME 64/69 -> 65/70, and the matrix docblock figure #17111 parses moves to 81 rows / 18 families, in authz-conformance.matrix.ts:27 and not in rest-route-ledger.ts, where the order placed it (seat 1's claim already said so). No packages/rest change. origin/main moved to 48a9d9db after the branch was cut, and none of those commits touches packages/rest/src, packages/runtime/src or packages/qa/dogfood/test. The census holds on the current main. The reviewer request for os-support-ai (platform best-effort) was not sent, to stay inside the three-write budget. PR activity was not subscribed, per the dispatch contract.", "tests": "Under os-verify-lock on 1cc4fa20: pnpm --filter @objectstack/dogfood exec vitest run --maxWorkers=2 test/authz-probe-blind-spot.test.ts test/authz-conformance.test.ts -> 'Test Files 2 passed (2) · Tests 108 passed (108)', VERDICT command-exit 0. Before, on b33dd25b with the dogfood^... closure built: 'Test Files 2 failed (2) · Tests 10 failed | 98 passed (108)', VERDICT command-exit 1, the 10 named on the card. Ablation: n/a, because no tested behaviour changed. The diff is the measurement pin itself, and its before/after red-to-green is the proof.", "gates": "dispatch-gates --commands on 1cc4fa20: 50 derived families. 48 exit 0; 2 exit 3 PREREQUISITE NOT MET = NOT MEASURED: node scripts/check-plugin-teardown-shape.mjs --self-test (positive control pinned to commit 621a4876, unreachable from this shallow clone) and pnpm check:dual-build-cjs-loads (seven packages outside the diff have no dist/). --ran reconciliation: '50 derived famil(ies) accounted for — 48 run, 2 NOT-MEASURED'. PR check-runs: in_progress at report time.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm. The two files that hold all 10 of main's dogfood reds were run as above. Shards 1/3 and 3/3 whole were not run locally. Card acceptance is the first main push run and the next scheduled run after landing.", "mcp_calls": "4 — mcp__github__issue_read get (#26400), mcp__github__issue_read get_comments x2 (#26400), mcp__github__pull_request_read get (#26406); all reads", "api_writes": "2 relay strokes plus git push — fleet-write run 40438705207 pr_create (POST /repos/objectstack-ai/objectstack/pulls draft, POST /issues/26406/assignees os-support-ai, POST /issues/26406/labels skip-changeset); this report: POST /issues/26400/comments", "open_questions": [], "out_of_scope_findings": ["carrier: seat 1 (comment 6432031749 on #26400) · the census pins run outside PR and merge-queue CI, so a ledgered route merges green and reds main · noted, not filed"] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Triage: first touch —
bug·tests·priority:p0(as filed) ·domain:devx·area:devpath·pm:dispatched· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-27T02:54Z⛔ Not a claim, ⛔ not a dispatch.
packages/qa/**isdomain:devx. p0 stays as filed: main is red on every push run since6a2866af(feat(plugin-approvals,rest,client): a record-anchored approval lock read,{ locked }for every caller who can read the record #26361), andfull-batteryrefuses a cut while it is. Fix PR test(dogfood): re-measure the authz census for the approval record-lock read #26406 is open. The latest completed push run (40438946532) fails only theDogfood Regression Gatejobs.rest-server.tsrow (50 → 51). Recording it in the census is correct bookkeeping. Whether the authz probe should reach this route is a separate coverage question, not this fix.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Landed
2026-10-27T03:18Z ·
domain:specseat 1 (#6017) ·os-support-ai·session_01WGufzfhobWEgUUrjz4rrbh. PR #26406 merged through the merge queue as56b0a586ec(Fixes #26400, ACCEPT6432304497). The merge closed this card as completed.git merge-base --is-ancestor 56b0a586ec origin/maingit grep -n 'BLIND_SPOT_TOTAL_STATIC = ' origin/main -- packages/qa/dogfood/test/authz-probe-blind-spot.census.ts65at :1318mainpush run that runs Dogfood Regression Gate 1/3 and 3/3 after56b0a586ec, and the next scheduled run. Both run ids will be reported here.pm:dispatchedremoved in this act.Generated by Claude Code
Merge origin/main into claude/project-thread-g33c7k
objectstack-fleet commentedon Oct 27, 2026
Acceptance ·
domain:specseat 1 (#6017) · sessionsession_01WGufzfhobWEgUUrjz4rrbh· 2026-10-27T04:36ZThe fix-forward #26406 (
56b0a586) holds on main. Both acceptance runs ran all three Dogfood Regression Gate shards, and all three were green in each:56b0a586that ran shards 1/3 and 3/3: 40445572661 at08ed7e29. Shards 1/3, 2/3, 3/3 and the aggregate are success.26e7c75e. Shards 1/3, 2/3, 3/3 and the aggregate are success.The red in both runs was
Test UI(12/16 at08ed7e29, 1/16 at26e7c75e), which is outside this anchor.Test UIwas 16/16 green again at67461403(40448487170). The anchor is accepted.