Skip to content

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

Closed

Description

@objectstack-fleet

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.

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

Not in scope

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

  1. added
    bugSomething isn't working
    priority:p0Critical: blocker, must ship before MVP
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    on Oct 27, 2026
  2. os-zhuang commented on Oct 27, 2026

    @os-zhuang
    Contributor

    这种数字意义大吗?如何避免类似的问题。

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    2026-10-27T02:07Z Note from the cause's landing seat (domain:server seat 2, seat post #20966), under main-red convention ②. This adds information to the anchor and does not claim anything.

    • I confirm the cause: feat(plugin-approvals,rest,client): a record-anchored approval lock read, { 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.
    • The new ledger row (packages/rest/src/rest-route-ledger.ts:433, GET /api/v1/approvals/records/:object/:recordId/lock) carries family: 'approvals', which is a family the neighbouring rows already carry. On the ledger row that should read population 80 → 81, reachable 80 → 81 and blindSpot 0. The family count and keys should 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.
    • The route is registered through this.routeManager.register( in approvals-routes.ts, the same way as its siblings. That accounts for the rest-server.ts control moving 62 → 63 and the population moving 69 → 70. Whether reachable moves with it is for the fixing PR to measure against that row's reachable rule.
    • In-flight domain:server PRs 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

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · main-red anchor (convention ①) · 2026-10-27T02:10Z
    Session: session_01WGufzfhobWEgUUrjz4rrbh
    Account: os-support-ai
    Branch: claude/project-thread-78ytp9 (card thread session_01WGufzfNhdx3xRKeaa8e7JB; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-26400-<slug>)
    Worktree: objectstack-issue-26400
    Domain: domain:devx
    Seat: 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), and packages/qa/dogfood/test/authz-probe-blind-spot.test.ts only if a pinned total moves. ⛔ No packages/rest/** change (stop and report if the census reading says the route itself is wrong)
    Container & model: S, mode:thread, model: TIER_DEFAULT, default effort
    Clause-②: no
    Metadata-protocol: none
    Responsibility: packages/qa/dogfood/test/authz-probe-blind-spot.census.ts and authz-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 reads full-battery, and every ! PR's dev-report battery
    Thread-read: 6431978738
    Premise: holds (reproduced on origin/main abb90460: 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-spot PR search: #26380, #26399 and #26398 only, none in packages/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.

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    2026-10-27T02:12Z · domain:spec seat 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 main went red afterwards. The two failing files do not boot an app. authz-probe-blind-spot.test.ts only readFileSyncs source files, and authz-conformance.test.ts adds one built package (@objectstack/verify). But they live in packages/qa/dogfood, whose CI legs skip pull_request and merge_group (#24073 / #22653). dispatch-gates --commands does print ⛔ does NOT run on this PR or in the merge queue for a packages/rest/src/** path. The dev report still records dogfood_battery: n/a when the title has no !, and that is what happened on #26361.

    Options, recommended first:

    1. Run the static census files before merge. Add a small PR and merge-queue lane that runs only the dogfood files needing no booted app (the authz census pair, and any others like them), triggered by packages/rest/src/**, packages/runtime/src/domains/** or packages/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.
    2. Make dispatch-gates derive them as required local commands for those same paths, so the dev report has to show them run. It costs no CI, but it depends on every dev running them, and the merge queue still would not catch a miss.
    3. Replace the bare counts with derived-and-classified rows. The census derives the population from the ledger and goes red only on a route that has no classification. That removes bump-only PRs like dogfood: main's Dogfood Regression Gate (3/3) is red since #25956 — the authz blind-spot census still pins handleI18nRequest at 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

  6. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  7. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed

    2026-10-27T03:18Z · domain:spec seat 1 (#6017) · os-support-ai · session_01WGufzfhobWEgUUrjz4rrbh. PR #26406 merged through the merge queue as 56b0a586ec (Fixes #26400, ACCEPT 6432304497). The merge closed this card as completed.

    Reading Probe Result
    Ancestry git merge-base --is-ancestor 56b0a586ec origin/main holds
    Content git grep -n 'BLIND_SPOT_TOTAL_STATIC = ' origin/main -- packages/qa/dogfood/test/authz-probe-blind-spot.census.ts 65 at :1318
    • Remains (this seat): the acceptance runs. These are the first main push run that runs Dogfood Regression Gate 1/3 and 3/3 after 56b0a586ec, and the next scheduled run. Both run ids will be reported here.
    • Open question to the maintainer: how to stop this drift from recurring is comment 6432031749. Option 1 (run the static census files before merge) waits on @os-zhuang's call and gets its own card if agreed.
    • pm:dispatched removed in this act.

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Acceptance · domain:spec seat 1 (#6017) · session session_01WGufzfhobWEgUUrjz4rrbh · 2026-10-27T04:36Z

    The fix-forward #26406 (56b0a586) holds on main. Both acceptance runs ran all three Dogfood Regression Gate shards, and all three were green in each:

    • First main push run after 56b0a586 that ran shards 1/3 and 3/3: 40445572661 at 08ed7e29. Shards 1/3, 2/3, 3/3 and the aggregate are success.
    • Next scheduled run: 40447801748 at 26e7c75e. Shards 1/3, 2/3, 3/3 and the aggregate are success.

    The red in both runs was Test UI (12/16 at 08ed7e29, 1/16 at 26e7c75e), which is outside this anchor. Test UI was 16/16 green again at 67461403 (40448487170). The anchor is accepted.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:devxpriority:p0Critical: blocker, must ship before MVPtests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions