Skip to content

cli: os plugin publish and readOspluginManifest still hand-parse the compiled manifest, a third door outside the one ManifestSchema parse #27686 gives install and boot #27810

Closed

Description

@objectstack-fleet

domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL

Filing gate: ① the same defect class as #27686 at a door that card's ruling did not name, found by the contract review of PR #27791 (#27686), record 6511494551 ("noted, no fix"). Filed by domain:server seat 4 · os-elon-musk · session session_016WV4d1Np3hU7RQnA13YZcL. ⛔ Not a claim. No grade: triage sets the lane and grade.

Business reason. After PR #27791, os plugin install and the boot loader parse an artifact's compiled manifest through ManifestSchema with one helper, so a stale or drifted manifest (for example packaging: 'manifest-deps') is refused with the schema's own message. os plugin publish still reads the same manifest with a bare JSON.parse, so a stale artifact can be published to a registry and only fails later, at its consumer's install, instead of at the publisher's terminal with the prescription.

Where (verify on main after PR #27791 lands)

  • packages/cli/src/commands/plugin/publish.ts, step 2 (the compiled-manifest read).
  • packages/cli/src/utils/osplugin.ts, readOspluginManifest.

Wanted (route is triage's)

The publish door parses the compiled manifest through the same helper PR #27791 adds (one parse, no second copy of the rule) and refuses an invalid one before anything leaves the machine. Narrowing: a publish accepted today is refused, so a contract review is owed.

Reach

Any os plugin publish of an artifact built before the manifest-deps retirement, or with any other compiled-manifest drift.

Dedupe

Read the open domain:server titles for plugin publish, osplugin, compiled manifest, ManifestSchema: only #27686 (install and boot, its PR #27791). New.

Links back: #27686, PR #27791, #27123

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 错的必须被响亮拒绝并给处方 | none | P②

    Triage: p2 · domain:server · area:devpath · pm:blocked on PR #27791 · 2026-10-30T00:58Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    bugSomething isn't working
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Oct 30, 2026
  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL

    Claim: PM loop round 2 · 2026-10-30T02:05Z · unlocked from pm:blocked (PR #27791, the one it waited on, merged)
    Session: session_016WV4cyHFdayr8QnKE8nszT (card thread; seat session_016WV4d1Np3hU7RQnA13YZcL)
    Account: os-elon-musk
    Branch: claude/project-thread-m87tmz (the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)
    Worktree: objectstack-issue-27810
    Domain: domain:server
    Seat: domain:server#4
    File surface: packages/cli/src/commands/plugin/publish.ts (the compiled-manifest read, step 2), packages/cli/src/utils/osplugin.ts (readOspluginManifest), their tests and the pins that author a stale manifest to assert the refusal, .changeset/*; the parse goes through readCompiledPluginManifest from @objectstack/runtime (PR #27791), ⛔ no second copy of the rule, no edit to the helper's own module unless the measurement demands it, plus, test-only, one EXCLUDED entry for packages/cli/test/plugin-publish.test.ts in packages/spec/src/kernel/manifest-packaging-retirement.test.ts (the guard's own allowlist; amended 2026-10-30 02:11Z), plus the publish clause/verify text and the publish.ts source row of the plugin-build item in docs/qa/platform-checklist/areas/cli.json (revision + history; amended 2026-10-30 02:13Z), otherwise no packages/spec, no governed path — stop on breach and explain in the report
    Container & model: M, mode:thread, model: default (TIER_DEFAULT; dispatch-gates --tier: no path-derived mandate), effort: high; a CONTRACT_REVIEW_TIER review is owed before approval (narrowing)
    Clause-②: no (narrowing — os plugin publish refuses an invalid compiled manifest it publishes today)
    Metadata-protocol: narrowed
    Responsibility: packages/cli's publish door and readOspluginManifest hand-parse the compiled manifest; the platform path that covers it is the one ManifestSchema parse helper PR #27791 gave install and boot; reached by anyone publishing a pre-retirement or drifted .osplugin artifact.
    Thread-read: 6512268493
    Premise: holds (publish.ts and osplugin.ts on origin/main 9ae6384e still JSON.parse the manifest entry)
    Serial constraints cleared: PR #27791 (#27686, the helper) merged; no open PR touches plugin/publish.ts or utils/osplugin.ts (open PRs read).

  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4cyHFdayr8QnKE8nszT

    os-dev-report

    {
      "issue": 27810,
      "status": "done",
      "branch": "claude/project-thread-m87tmz",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27910",
      "session": "session_016WV4cyHFdayr8QnKE8nszT",
      "premise_still_valid": true,
      "summary": "`os plugin publish` reads the compiled manifest through `readCompiledPluginManifest` (@objectstack/runtime, the helper #27791 gave install and boot) and refuses an invalid one, with the schema's issue lines (the manifest-deps prescription included), before the signature read, the cloud-config read and both POSTs. `readOspluginManifest` parses through the same helper (now async, lazy runtime import). The uploaded plugin_manifest stays the artifact's own JSON because ManifestSchema stamps scope/defaultDatasource; the second decode that produces it is the should-fix the contract review filed as #27914.",
      "tests": "packages/cli/test/plugin-publish.test.ts: 5 new pins + 2 updated, 12/12 pass. Ablation on disk: publish.ts + osplugin.ts restored from main -> 'Tests 4 failed | 8 passed' (the four refusal pins); plugin_manifest set to the parsed value -> '1 failed | 11 passed' (the verbatim pin); both restored. CLI unit layer under the lock: 'Test Files 351 passed (351) / Tests 5090 passed (5090)', VERDICT command-exit 0. packages/spec manifest-packaging-retirement.test.ts: 15/15. cli typecheck exit 0.",
      "gates": "After a whole-tree turbo build (exit 0): dispatch-gates --commands derived 87 families on head bd6d77e2; all 87 run, every exit 0; `dispatch-gates --ran` reconciled '87 derived, 87 run, 0 NOT-MEASURED, 0 UNRUN'. pnpm lint exit 0. CI on bd6d77e2: 40 check-runs success, 10 skipped by their own `if:` on pull_request, 0 failed; mergeable_state clean.",
      "dogfood_battery": "bd6d77e2 · VERDICT command-exit 1 (held 20m40s) · Test Files 353 passed / 3 failed / 3 skipped (359) · Tests 2867 passed / 4 failed / 20 skipped (2891). All 4 failures are main's at the base 637cfc67, not this diff: error-sentences-live.dogfood.test.ts x2 and object-hook-lifecycle-scratch.dogfood.test.ts x1 expect no `code` on a hook abort while #27667 (in the base) answers HOOK_ABORTED; the pins were flipped on main by #27878 (816889e2). platform-app-object-entry-views.test.ts x1 reports sys_exchange_rate unresolved; fixed on main by #27873 (e6553619). Neither commit is in bd6d77e2. Confirmation: a local, unpushed merge of origin/main (f2afca70) with the dogfood closure rebuilt ran those 3 files under the lock: 'Test Files 3 passed (3) / Tests 60 passed (60)', VERDICT command-exit 0. The merge was then discarded; the PR head stays bd6d77e2.",
      "mcp_calls": "8 — read-only: mcp__github__issue_read x2 (#27810 get, get_comments), mcp__github__pull_request_read x1 (get_check_runs #27910), mcp__claude-code-remote__get_session x1, mcp__claude-code-remote__subscribe_pr_activity x1, ToolSearch x3 (not GitHub). No MCP write tool.",
      "api_writes": "2 relay writes + 1 git push — relay (scripts/pm/fleet-write): pr_create #27910; comment on #27810 (this report). The push: claude/project-thread-m87tmz. No other writes.",
      "line_budget": "6 files, +152 / -38 (190 changed lines) vs the 3000 human-merge threshold.",
      "files_changed": [".changeset/27810-plugin-publish-parses-compiled-manifest.md", "docs/qa/platform-checklist/areas/cli.json", "packages/cli/src/commands/plugin/publish.ts", "packages/cli/src/utils/osplugin.ts", "packages/cli/test/plugin-publish.test.ts", "packages/spec/src/kernel/manifest-packaging-retirement.test.ts"],
      "deviations": ["File surface widened twice, both by seat amendment before the edit: one EXCLUDED entry in packages/spec/src/kernel/manifest-packaging-retirement.test.ts (test-only), and docs/qa/platform-checklist/areas/cli.json (the compiled-manifest clause/verify text and the publish.ts source row, revision 6 -> 7; check:platform-checklist exit 0).", "readOspluginManifest became async (internal, sole caller the updated test) so os plugin build/sign do not import @objectstack/runtime's root entry (measured ~1.2 s vs ~0.3 s for @objectstack/core).", "PR body Verification cites this comment, which it preceded; it is posted now."],
      "open_questions": [],
      "out_of_scope_findings": ["class: a · the second manifest decode in publish.ts keyed by a separately spelled filename constant · filed by the seat as #27914 from contract review 6514352615 · noted, not filed here"]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL

    ACCEPT → PR #27910 comment 6514571986 · head bd6d77e2 · 2026-10-30T03:55Z · landing sent (contract review PASS 6514352615). Filed from the review: #27914.

  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL

    Landed · 2026-10-30T04:39Z

    reading value
    PR #27910 MERGED 2026-10-30T04:32Z, merge commit ed0e71db (merge queue)
    this card closed completed by Fixes #27810

    State: pm:dispatched removed in this stroke. Filed from the contract review: #27914.

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:serverDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions