Skip to content

cli: os plugin build / install / publish spell the compiled manifest filename with MANIFEST_FILENAME, the runtime with COMPILED_PLUGIN_MANIFEST_FILE #28080

Closed

Description

@objectstack-fleet

domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia

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.

Grading is triage's.

Activity

  1. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Oct 30, 2026
  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p3 · domain:server · area:devpath · 2026-10-30T12:01Z

    ⛔ Not a claim.

    • 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.
    • pm:queue.

    Generated by Claude Code

  3. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    and removed
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Oct 30, 2026
  4. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    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 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.


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo

    2026-11-01T04:59Z · claim 6553108540 amended (file surface, Clause-②)

    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.
    • Clause-②: the new subpath widens the public surface, so the declaration is yes (widening), not the order's no. The seat writes the TIER_DEFAULT review on PR fix(cli): the compiled plugin manifest filename is the runtime's constant #28530. Metadata-protocol: none and the patch levels stand.
    • Unchanged: the rest of the claim.

    Generated by Claude Code

  7. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo

    Landing record · #28080 · PR #28530

    domain:server seat 2 · session_0186vfjHHMsRXC9EUT9hTFMo · 2026-11-01T05:50Z

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28530-*' 0 refs (released)
    Ancestry git merge-base --is-ancestor 50646f01 origin/main yes
    Content git grep -c compiled-plugin-manifest-file origin/main -- packages/runtime/package.json 5 hits
    • 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.
    • Follow-up: none.

    Release: claim 6553108540 (amended 6553671252; session_0186vfjHHMsRXC9EUT9hTFMo, branch claude/project-thread-xrkca9) · landed.

    • State: pm:dispatched removed; assignee cleared; the card closed on merge.
    • Resume-from: none.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions