Repository navigation
Closed
Labels
area:studioChanging a running app without code — authoring, publish, docs and the portalChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatpm:dispatchedpriority:p0Critical: blocker, must ship before MVPCritical: blocker, must ship before MVP
Description
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Main-red anchor card, filed by triage. ⛔ Not a claim.
Red
- Runs:
mainpushCIis red on every head from519089e1(PR feat(runtime,spec): GET /packages/:id/customizations answers a base's overrides, extensions and switched-off items in one read #28595, runtime: per-package customization read — for an installed base, its.customoverrides, its object extensions and its switched-off items, served rows only, with counts #28411 N-15) onward:519089e1,20dcc075,7449e479,a9c6eac6,479ad08fand882fcdbe(e.g. run41287645615). - The failing job:
Dogfood Regression Gate (1/3), which fails exactly one test:packages/qa/dogfood/test/route-ledger-live-mount-parity.dogfood.test.ts› "every ledgered route is reachably mounted". It says:runtime/route-ledger.ts: GET /packages/:id/customizations — LEDGERED BUT NOT MOUNTED. The live router answers nothing for GET /api/v1/packages/__parity_probe_0/customizations. - Deterministic, and a real defect, not a stale pin. PR feat(runtime,spec): GET /packages/:id/customizations answers a base's overrides, extensions and switched-off items in one read #28595 added the ledger row (
packages/runtime/src/route-ledger.ts:544) and the domain handler (packages/runtime/src/domains/packages.ts:2532). It did not add the HTTP mount.packages/runtime/src/dispatcher-plugin.tsmounts each/packagessub-route explicitly throughmountPackagesRoute(...)(18 calls,/:id/exportat about :1589), and none names/:id/customizations. So the new read 404s for every caller at runtime. Its unit test (packages-customizations.test.ts) calls the domain handler directly, so it passes. - Why the queue let it through: the CI workflow runs the
Dogfood Regression Gate (n/3)shards only onpush. They are skipped forpull_requestandmerge_groupby design (ci.yml~:2391). The first reading of this gate is therefore post-merge onmain, and every later push carries the red.
Stop-bleed (the only scope)
- Add the mount beside its sibling
/:id/exportinpackages/runtime/src/dispatcher-plugin.ts:mountPackagesRoute('get', '/:id/customizations', (req) => `/${req.params.id}/customizations`);
/:idis single-segment, so order does not shadow it, but keep it with the other two-segment GETs. - Prove it with the gate itself:
pnpm --filter @objectstack/dogfood test -- route-ledger-live-mount-paritygreen, plus one HTTP-level probe ofGET /api/v1/packages/<installed base>/customizationsanswering 200 (the gate checks only that a route resolves). - ⛔ The fix is never to pin the row in
UNEXERCISED_BY_THIS_BOOTor drop the ledger row: the route is meant to be live (runtime: per-package customization read — for an installed base, its.customoverrides, its object extensions and its switched-off items, served rows only, with counts #28411), and pinning would hide a 404 on a shipped read.
Reader who acts
domain:server: the seat that landed PR #28595 (attribution os-project-manager), or any domain:server seat under the main-red anchor exception. Under #27047 item 6, a lane claims it this round. If it is unclaimed for one round, triage escalates by name. If it is still unclaimed after that, triage dispatches this stop-bleed.
Dedupe
The open priority:p0 cards: none. Issues updated since 08:00Z with customizations, Dogfood or red on main in the title: only #28580 (Nightly Tiers, a different suite).
Generated by Claude Code
Metadata
Metadata
Assignees
Labels
area:studioChanging a running app without code — authoring, publish, docs and the portalChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatpm:dispatchedpriority:p0Critical: blocker, must ship before MVPCritical: blocker, must ship before MVP
Activity
objectstack-fleet commentedon Nov 1, 2026
domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC
Claim: PM loop round 1 · card thread · 2026-11-01T09:07Z
Session:
session_01R1q2xdtYgU6FKrZ7LgjPCC(the seat); the card thread issession_01FEkQ5kwT5zvfww7MNoyovMAccount:
os-project-manager(the seat's linked user; the card's assignee)Branch:
claude/project-thread-sfkpj0(the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)Worktree: the card thread's own container checkout
Domain:
domain:serverSeat:
domain:server#1Ruling-ref: the card's main-red anchor exception ("any
domain:serverseat under the main-red anchor exception", #27047 item 6); dispatched under the maintainer's 「server 车道现在就是你负责,任务有一大堆啊,都可以派,包括 p3」 (2026-11-01T03:46Z). Server seats 2 and 3 were told before this claim.File surface:
packages/runtime/src/dispatcher-plugin.ts(the onemountPackagesRoute('get', '/:id/customizations', …)beside/:id/export), one runtime test that goes through the mounted router, and a@objectstack/runtimechangeset. ⛔ No edit toroute-ledger.ts,UNEXERCISED_BY_THIS_BOOTor the dogfood gate.Container & model:
S,mode:thread, model and effort as the thread was openedClause-②: no (expected: a ledgered, documented read that 404s now answers; nothing narrows)
Metadata-protocol: none (expected)
Responsibility: the code is the runtime's
/packagesHTTP mount table · the platform path isGET /api/v1/packages/:id/customizations(#28411) · reached by everymainpush, red onDogfood Regression Gate (1/3)from519089e1onThread-read: none
Premise: holds (read 2026-11-01T09:07Z at
origin/main0e78922ee0:dispatcher-plugin.tsmounts 18/packagessub-routes at ~:1587–1613 and none names/:id/customizations)Serial constraints cleared: #28554 (PR, #28410) touches
packages/metadata-protocol/**and the runtimepackages-customizations.test.ts, notdispatcher-plugin.ts; mergeorigin/mainonce if it lands firstResume-from: none — fresh from
origin/main0e78922ee0State:
pm:queue→pm:dispatched, assigned toos-project-manager, recorded by this claim.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC
os-dev-report
{
"issue": 28622,
"status": "done",
"branch": "claude/project-thread-sfkpj0",
"pr": "#28635",
"session": "session_01FEkQ5kwT5zvfww7MNoyovM",
"premise_still_valid": true,
"summary": "Added the one missing HTTP mount, mountPackagesRoute('get', '/:id/customizations', ...), beside its two-segment sibling GET /:id/export in packages/runtime/src/dispatcher-plugin.ts. It is the exact shape the siblings use, so it matches the card's sketch with no difference, and because registerPackageRoutes runs for both bases it is also mounted at the environment-scoped prefix. Added one probe, dispatcher-plugin.package-customizations-mount.test.ts, that starts createDispatcherPlugin() on a recording IHttpServer, calls the registered handler as the transport does, and asserts 200 with the domain handler's data parsed through GetPackageCustomizationsResponseSchema. A @objectstack/runtime patch changeset (files[] ships dist). No edit to route-ledger.ts, UNEXERCISED_BY_THIS_BOOT or the dogfood gate; no generated file moved. #28595 shipped only this one route, so nothing else was unmounted.",
"tests": "RED at origin/main 0e78922 (closure @objectstack/dogfood^... built, VERDICT command-exit 0): pnpm --filter @objectstack/dogfood exec vitest run --maxWorkers=2 test/route-ledger-live-mount-parity.dogfood.test.ts -> 'x every ledgered route is reachably mounted ... GET /packages/:id/customizations - LEDGERED BUT NOT MOUNTED', Test Files 1 failed (1), Tests 1 failed | 7 passed (8), VERDICT command-exit 1. GREEN at head 67e1f91 after pnpm --filter @objectstack/runtime build (dist/index.js holds the route): Tests 8 passed (8), VERDICT command-exit 0. Probe green at head: Tests 1 passed (1). Ablation via scripts/ablation-replace.mjs --delete of the mount line (probe imports ./dispatcher-plugin.js from src, no dist hop): 'ok mutation landed: anchor 1 -> 0, blob 8c421f8946a7 -> 82127f5f7dce', AssertionError 'GET /api/v1/packages/:id/customizations must be mounted: expected undefined to be type of function', Tests 1 failed (1); 'ok restored: blob == HEAD (8c421f8946a7) and git diff HEAD is empty'. pnpm --filter @objectstack/runtime test at 67e1f91: Test Files 503 passed (503), Tests 8159 passed | 19 skipped (8178), VERDICT command-exit 0. pnpm --filter @objectstack/runtime typecheck (tsc --noEmit && check:test-typecheck): exit 0. eslint packages/runtime --no-inline-config: exit 0.",
"gates": "Local at 67e1f91: dispatch-gates --commands --repo objectstack-ai/objectstack derived 58 families from 3 paths; each run with exit captured before any pipe. --ran reconciliation: '58 derived, 57 run, 1 NOT-MEASURED, 0 UNRUN' (record with exit codes: /mnt/project-files/pm-orders/server/28622-gates-ran.txt). 57 exit 0; check-plugin-teardown-shape --self-test exit 3 first (shallow clone), exit 0 after git fetch --depth=1 origin 621a487. NOT MEASURED: pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (needs every package's dist). CI families: PR #28635 check-runs in_progress at report time; not re-run locally.",
"dogfood_battery": "n/a - no ! in the PR title and no (narrowing) arm; the one gate the card names was run red at origin/main and green at head",
"mcp_calls": "0",
"api_writes": "2 - fleet-write relay pr_create (PR #28635, draft, no labels, no assignees); this os-dev-report comment via post-stamped. Plus 1 git push (not REST).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none - observation only, not filed: the queue let this through because Dogfood Regression Gate (n/3) runs on push only (as the card records); a mount-parity reading before merge would have caught it. No action proposed (new gates default to no)."
]
}
Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC
Landing record · #28622 · PR #28635
PR #28635 merged by the merge queue as
28ef35e0e3onmain(Fixes #28622; ACCEPT6556484865). The card closed as completed with the merge.git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28635-*'origin/mainby contentmountPackagesRoute('get', '/:id/customizations'inpackages/runtime/src/dispatcher-plugin.ts, and.changeset/28622-package-customizations-mount.mdgit merge-base --is-ancestor 28ef35e0e3 origin/mainGET /api/v1/packages/:id/customizations(and its/environments/:environmentId/…twin) is mounted beside/:id/export, with a probe through the registered handler and an@objectstack/runtimepatch changeset. The ledger row,UNEXERCISED_BY_THIS_BOOTand the dogfood gate are untouched.Dogfood Regression Gateshards run only onpush, so the post-merge reading is the nextmainpush run on28ef35e0e3or later; the PR's report has the gate red at0e78922eand 8/8 green at head.Release: claim
6555910361, branchclaude/project-thread-sfkpj0merged; nothing unpushed.Generated by Claude Code