Skip to content

main red: Dogfood Regression Gate — GET /packages/:id/customizations is ledgered but not mounted (#28595), so the route 404s at runtime #28622

Closed

Description

@objectstack-fleet

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Main-red anchor card, filed by triage. ⛔ Not a claim.

Red

Stop-bleed (the only scope)

  • Add the mount beside its sibling /:id/export in packages/runtime/src/dispatcher-plugin.ts:
    mountPackagesRoute('get', '/:id/customizations', (req) => `/${req.params.id}/customizations`);
    /:id is 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-parity green, plus one HTTP-level probe of GET /api/v1/packages/<installed base>/customizations answering 200 (the gate checks only that a route resolves).
  • ⛔ The fix is never to pin the row in UNEXERCISED_BY_THIS_BOOT or drop the ledger row: the route is meant to be live (runtime: per-package customization read — for an installed base, its .custom overrides, 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

Activity

  1. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    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 is session_01FEkQ5kwT5zvfww7MNoyovM
    Account: 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:server
    Seat: domain:server#1
    Ruling-ref: the card's main-red anchor exception ("any domain:server seat 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 one mountPackagesRoute('get', '/:id/customizations', …) beside /:id/export), one runtime test that goes through the mounted router, and a @objectstack/runtime changeset. ⛔ No edit to route-ledger.ts, UNEXERCISED_BY_THIS_BOOT or the dogfood gate.
    Container & model: S, mode:thread, model and effort as the thread was opened
    Clause-②: no (expected: a ledgered, documented read that 404s now answers; nothing narrows)
    Metadata-protocol: none (expected)
    Responsibility: the code is the runtime's /packages HTTP mount table · the platform path is GET /api/v1/packages/:id/customizations (#28411) · reached by every main push, red on Dogfood Regression Gate (1/3) from 519089e1 on
    Thread-read: none
    Premise: holds (read 2026-11-01T09:07Z at origin/main 0e78922ee0: dispatcher-plugin.ts mounts 18 /packages sub-routes at ~:1587–1613 and none names /:id/customizations)
    Serial constraints cleared: #28554 (PR, #28410) touches packages/metadata-protocol/** and the runtime packages-customizations.test.ts, not dispatcher-plugin.ts; merge origin/main once if it lands first
    Resume-from: none — fresh from origin/main 0e78922ee0

    State: pm:queue → pm:dispatched, assigned to os-project-manager, recorded by this claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  3. added
    bugSomething isn't working
    priority:p0Critical: blocker, must ship before MVP
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 1, 2026
  4. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC

    Landing record · #28622 · PR #28635

    PR #28635 merged by the merge queue as 28ef35e0e3 on main (Fixes #28622; ACCEPT 6556484865). The card closed as completed with the merge.

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28635-*' 0 refs
    origin/main by content mountPackagesRoute('get', '/:id/customizations' in packages/runtime/src/dispatcher-plugin.ts, and .changeset/28622-package-customizations-mount.md 1 match; changeset present
    Ancestry git merge-base --is-ancestor 28ef35e0e3 origin/main holds
    • Landed: GET /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/runtime patch changeset. The ledger row, UNEXERCISED_BY_THIS_BOOT and the dogfood gate are untouched.
    • Main-red: the Dogfood Regression Gate shards run only on push, so the post-merge reading is the next main push run on 28ef35e0e3 or later; the PR's report has the gate red at 0e78922e and 8/8 green at head.

    Release: claim 6555910361, branch claude/project-thread-sfkpj0 merged; nothing unpushed.


    Generated by Claude Code

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

Metadata

Metadata

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpm:dispatchedpriority:p0Critical: blocker, must ship before MVP

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions