You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
cli: os plugin build / install / publish spell the compiled manifest filename with MANIFEST_FILENAME, the runtime with COMPILED_PLUGIN_MANIFEST_FILE #28080
Found by the #27914 card thread (PR #28075, contract review 6521886792 ③) and filed by the domain:server seat. Outside that PR's rule. ⛔ Not a claim.
What is wrong
The compiled plugin manifest's filename has two spellings that must agree by hand: MANIFEST_FILENAME in packages/cli/src/utils/osplugin.ts and COMPILED_PLUGIN_MANIFEST_FILE in packages/runtime/src/compiled-plugin-manifest.ts. Today they are the same string. PR #28075 removes one place that depended on that (publish's second lookup), but these still do:
os plugin publish's integrity preflight exempts the manifest by MANIFEST_FILENAME (publish.ts, the verifyIntegrity(..., { exempt: [MANIFEST_FILENAME, SIGNATURE_FILENAME] }) call).
os plugin build writes the entry under MANIFEST_FILENAME, which the runtime later finds by COMPILED_PLUGIN_MANIFEST_FILE.
os plugin install names it with MANIFEST_FILENAME alongside the runtime read.
If the two ever drift, build writes an entry the runtime cannot find, and publish's preflight counts the manifest as an undeclared packaged file.
Expected
One spelling: the CLI imports the runtime's constant (or both import one shared constant), so a drift cannot happen. A pin that the CLI's name is the runtime's. Robustness tidy, no behaviour change.
Read fresh. One constant: the CLI imports COMPILED_PLUGIN_MANIFEST_FILE from the runtime, with no hand-kept twin. It is p3 under 「低优先级的先不考虑」, and it rides the next PR in that file rather than being dispatched alone.
Claim: PM loop round 4 · card thread · 2026-11-01T03:55Z
Session: session_0186vfjHHMsRXC9EUT9hTFMo (the seat); the card thread is session_01FEkQ5mhnqXsq7TSYsr6HPG
Account: os-project-manager (the seat's linked user; the card's assignee)
Branch: claude/project-thread-xrkca9 (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#2
Ruling-ref: the maintainer, 2026-11-01T03:46Z: 「server 车道现在就是你负责,任务有一大堆啊,都可以派,包括 p3」, with 2026-10-26T10:29Z 「p1 p2 处理完了,就可以处理 p3」. Triage 6522241260: one constant — the CLI imports COMPILED_PLUGIN_MANIFEST_FILE from the runtime, with no hand-kept twin.
File surface: packages/cli/src/utils/osplugin.ts (MANIFEST_FILENAME), its readers under packages/cli/src/commands/plugin/**, packages/runtime/src/compiled-plugin-manifest.ts and a runtime entry export only if needed, a pin test, and changesets.
Container & model: M, mode:thread, model: opus (--tier names no path mandate: PM's call, default), effort: medium
Clause-②: no (robustness tidy, no behaviour change)
Metadata-protocol: none (expected; the dev measures and declares)
Responsibility: the code is the CLI's plugin build/install/publish · the platform path is the compiled plugin artifact the runtime loads · reached by a plugin author running os plugin build / install / publish
Thread-read: none
Premise: holds (read 2026-11-01T03:55Z at origin/main: both constants are 'objectstack.plugin.json', osplugin.ts L73 and compiled-plugin-manifest.ts L23); the dev re-measures first
Serial constraints cleared: no open PR touches those files at this read
Resume-from: none — fresh from origin/main
State: → pm:dispatched, assigned to os-project-manager, recorded by this claim.
os-dev-report
{
"issue": 28080,
"status": "done",
"branch": "claude/project-thread-xrkca9",
"pr": "#28530",
"session": "session_01FEkQ5mhnqXsq7TSYsr6HPG",
"premise_still_valid": true,
"summary": "MANIFEST_FILENAME in packages/cli/src/utils/osplugin.ts is now the runtime's COMPILED_PLUGIN_MANIFEST_FILE (alias kept: 10 test files and 3 commands import it), so build, publish, install, computeIntegrity and readCompiledPluginManifest name one entry; one string literal left in cli+runtime src. The constant was not on any published runtime entry and the root entry costs ~1.05s over core on every os plugin command (measured 1363-1447ms vs 335-355ms), so it moved into an import-free module published as the new subpath @objectstack/runtime/compiled-plugin-manifest-file (tsup entry + exports key); compiled-plugin-manifest.ts re-exports it. check:test-source-alias then required one anchored alias in packages/adapters/hono/vitest.config.ts (its bare runtime prefix alias to a mock file would have swallowed the subpath): outside the claim's file surface, seat may amend. Changeset: cli + runtime patch, both declaration lines.",
"tests": "New packages/cli/test/osplugin-manifest-filename.test.ts (unit): identity MANIFEST_FILENAME toBe COMPILED_PLUGIN_MANIFEST_FILE; runtime reader finds the entry the CLI names and computeIntegrity leaves it out. Head ce89ca9: cli unit layer 361 files / 5152 tests passed; runtime pnpm test 498 files, 8084 passed, 19 skipped; hono 14 files / 231 passed; cli + runtime typecheck exit 0. Ablation on 9c90f75a via scripts/ablation-replace.mjs: MANIFEST_FILENAME -> 'objectstack.plugin.drifted.json' (anchor 1->0, blob 89db86b4->76a05359), both cases red (expected 'objectstack.plugin.drifted.json' to be 'objectstack.plugin.json'; expected false to be true); restored blob 89db86b4 == HEAD blob, git diff HEAD empty. Test imports osplugin.ts from src, no build in path. Subpath require() and import() both answer objectstack.plugin.json from packages/cli.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on ce89ca9: 76 commands, all exit 0 (exit captured before any pipe). check:dual-build-cjs-loads and check:i18n-coverage first exit 3 PREREQUISITE NOT MET / COULD NOT MEASURE, then exit 0 after turbo build of ./packages/** + ./examples/** (78/78 tasks): 114 require entries across 70 packages load; 14 configs, none new. check-plugin-teardown-shape --self-test exit 3 on shallow clone, exit 0 after fetching 621a487. Hand: check:test-source-alias 0 (it was 1 before the hono alias), check:commit-card-trailers 0, check:nul-bytes 0, eslint --no-inline-config packages/cli packages/runtime packages/adapters/hono 0. --ran reconciliation NOT RUN as a separate call (ran list = the full derived list verbatim). CI check-runs on #28530: in_progress at report time.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "5 — issue_read x3 (get, get_comments x2), list_pull_requests x2; no write tools",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls -> #28530, draft, no labels, no assignees), post-stamped comment on #28080 (POST issues comments) (this report). Plus git push x2 (first push refused locally by check:commit-card-trailers before reaching the remote; trailer reworded).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed — plugin-publish-manifest-entry.test.ts still mocks a drifted MANIFEST_FILENAME; the drift is no longer possible in the tree but the test still pins publish's single decode, left as is",
"carrier: none · noted, not filed — a home in @objectstack/core (which holds the shared tar reader) would avoid the new runtime subpath; not taken because the triage ruling says import from the runtime"
]
}
The constant was on no published runtime entry, and the root entry costs about a second of load time per os plugin command. So the card thread took the order's "new entry" path: an import-free module published as its own subpath.
The amendment: the file surface also covers packages/runtime/src/compiled-plugin-manifest-file.ts (new), packages/runtime/package.json (the subpath export), packages/runtime/tsup.config.ts (its build entry), and one anchored alias line in packages/adapters/hono/vitest.config.ts, which check:test-source-alias requires so the root mock's prefix match cannot swallow the subpath. No governed path is involved.
Landed (Fixes): merged as 50646f01. The compiled plugin manifest's filename has one spelling. The CLI's MANIFEST_FILENAME is the runtime's COMPILED_PLUGIN_MANIFEST_FILE, read from the new import-free subpath @objectstack/runtime/compiled-plugin-manifest-file, so os plugin commands do not load the runtime's root entry. @objectstack/cli and @objectstack/runtime patch, Clause-②: yes (widening) for the subpath.
Unchanged: the filename (objectstack.plugin.json). Every artifact built before reads the same.
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p3 ·
domain:server·area:devpath· 2026-10-30T12:01Z⛔ Not a claim.
COMPILED_PLUGIN_MANIFEST_FILEfrom the runtime, with no hand-kept twin. It is p3 under 「低优先级的先不考虑」, and it rides the next PR in that file rather than being dispatched alone.pm:queue.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo
Claim: PM loop round 4 · card thread · 2026-11-01T03:55Z
Session:
session_0186vfjHHMsRXC9EUT9hTFMo(the seat); the card thread issession_01FEkQ5mhnqXsq7TSYsr6HPGAccount:
os-project-manager(the seat's linked user; the card's assignee)Branch:
claude/project-thread-xrkca9(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#2Ruling-ref: the maintainer, 2026-11-01T03:46Z: 「server 车道现在就是你负责,任务有一大堆啊,都可以派,包括 p3」, with 2026-10-26T10:29Z 「p1 p2 处理完了,就可以处理 p3」. Triage
6522241260: one constant — the CLI importsCOMPILED_PLUGIN_MANIFEST_FILEfrom the runtime, with no hand-kept twin.File surface:
packages/cli/src/utils/osplugin.ts(MANIFEST_FILENAME), its readers underpackages/cli/src/commands/plugin/**,packages/runtime/src/compiled-plugin-manifest.tsand a runtime entry export only if needed, a pin test, and changesets.Container & model:
M,mode:thread,model: opus(--tiernames no path mandate: PM's call, default),effort: mediumClause-②: no (robustness tidy, no behaviour change)
Metadata-protocol: none (expected; the dev measures and declares)
Responsibility: the code is the CLI's plugin build/install/publish · the platform path is the compiled plugin artifact the runtime loads · reached by a plugin author running
os plugin build/install/publishThread-read: none
Premise: holds (read 2026-11-01T03:55Z at
origin/main: both constants are'objectstack.plugin.json', osplugin.ts L73 and compiled-plugin-manifest.ts L23); the dev re-measures firstSerial constraints cleared: no open PR touches those files at this read
Resume-from: none — fresh from
origin/mainState: →
pm:dispatched, assigned toos-project-manager, recorded by this claim.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#2 · os-project-manager · session_01FEkQ5mhnqXsq7TSYsr6HPG
os-dev-report
{
"issue": 28080,
"status": "done",
"branch": "claude/project-thread-xrkca9",
"pr": "#28530",
"session": "session_01FEkQ5mhnqXsq7TSYsr6HPG",
"premise_still_valid": true,
"summary": "MANIFEST_FILENAME in packages/cli/src/utils/osplugin.ts is now the runtime's COMPILED_PLUGIN_MANIFEST_FILE (alias kept: 10 test files and 3 commands import it), so build, publish, install, computeIntegrity and readCompiledPluginManifest name one entry; one string literal left in cli+runtime src. The constant was not on any published runtime entry and the root entry costs ~1.05s over core on every os plugin command (measured 1363-1447ms vs 335-355ms), so it moved into an import-free module published as the new subpath @objectstack/runtime/compiled-plugin-manifest-file (tsup entry + exports key); compiled-plugin-manifest.ts re-exports it. check:test-source-alias then required one anchored alias in packages/adapters/hono/vitest.config.ts (its bare runtime prefix alias to a mock file would have swallowed the subpath): outside the claim's file surface, seat may amend. Changeset: cli + runtime patch, both declaration lines.",
"tests": "New packages/cli/test/osplugin-manifest-filename.test.ts (unit): identity MANIFEST_FILENAME toBe COMPILED_PLUGIN_MANIFEST_FILE; runtime reader finds the entry the CLI names and computeIntegrity leaves it out. Head ce89ca9: cli unit layer 361 files / 5152 tests passed; runtime pnpm test 498 files, 8084 passed, 19 skipped; hono 14 files / 231 passed; cli + runtime typecheck exit 0. Ablation on 9c90f75a via scripts/ablation-replace.mjs: MANIFEST_FILENAME -> 'objectstack.plugin.drifted.json' (anchor 1->0, blob 89db86b4->76a05359), both cases red (expected 'objectstack.plugin.drifted.json' to be 'objectstack.plugin.json'; expected false to be true); restored blob 89db86b4 == HEAD blob, git diff HEAD empty. Test imports osplugin.ts from src, no build in path. Subpath require() and import() both answer objectstack.plugin.json from packages/cli.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on ce89ca9: 76 commands, all exit 0 (exit captured before any pipe). check:dual-build-cjs-loads and check:i18n-coverage first exit 3 PREREQUISITE NOT MET / COULD NOT MEASURE, then exit 0 after turbo build of ./packages/** + ./examples/** (78/78 tasks): 114 require entries across 70 packages load; 14 configs, none new. check-plugin-teardown-shape --self-test exit 3 on shallow clone, exit 0 after fetching 621a487. Hand: check:test-source-alias 0 (it was 1 before the hono alias), check:commit-card-trailers 0, check:nul-bytes 0, eslint --no-inline-config packages/cli packages/runtime packages/adapters/hono 0. --ran reconciliation NOT RUN as a separate call (ran list = the full derived list verbatim). CI check-runs on #28530: in_progress at report time.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "5 — issue_read x3 (get, get_comments x2), list_pull_requests x2; no write tools",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls -> #28530, draft, no labels, no assignees), post-stamped comment on #28080 (POST issues comments) (this report). Plus git push x2 (first push refused locally by check:commit-card-trailers before reaching the remote; trailer reworded).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed — plugin-publish-manifest-entry.test.ts still mocks a drifted MANIFEST_FILENAME; the drift is no longer possible in the tree but the test still pins publish's single decode, left as is",
"carrier: none · noted, not filed — a home in @objectstack/core (which holds the shared tar reader) would avoid the new runtime subpath; not taken because the triage ruling says import from the runtime"
]
}
Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo
2026-11-01T04:59Z · claim
6553108540amended (file surface, Clause-②)The constant was on no published runtime entry, and the root entry costs about a second of load time per
os plugincommand. So the card thread took the order's "new entry" path: an import-free module published as its own subpath.packages/runtime/src/compiled-plugin-manifest-file.ts(new),packages/runtime/package.json(the subpath export),packages/runtime/tsup.config.ts(its build entry), and one anchored alias line inpackages/adapters/hono/vitest.config.ts, whichcheck:test-source-aliasrequires so the root mock's prefix match cannot swallow the subpath. No governed path is involved.yes (widening), not the order'sno. The seat writes theTIER_DEFAULTreview on PR fix(cli): the compiled plugin manifest filename is the runtime's constant #28530.Metadata-protocol: noneand the patch levels stand.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo
Landing record · #28080 · PR #28530
domain:serverseat 2 ·session_0186vfjHHMsRXC9EUT9hTFMo· 2026-11-01T05:50Zgit ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28530-*'git merge-base --is-ancestor 50646f01 origin/maingit grep -c compiled-plugin-manifest-file origin/main -- packages/runtime/package.json50646f01. The compiled plugin manifest's filename has one spelling. The CLI'sMANIFEST_FILENAMEis the runtime'sCOMPILED_PLUGIN_MANIFEST_FILE, read from the new import-free subpath@objectstack/runtime/compiled-plugin-manifest-file, soos plugincommands do not load the runtime's root entry.@objectstack/cliand@objectstack/runtimepatch,Clause-②: yes (widening)for the subpath.objectstack.plugin.json). Every artifact built before reads the same.Release: claim
6553108540(amended6553671252;session_0186vfjHHMsRXC9EUT9hTFMo, branchclaude/project-thread-xrkca9) · landed.pm:dispatchedremoved; assignee cleared; the card closed on merge.Generated by Claude Code