Skip to content

A package with no protocol range installs with the compatibility check skipped, and only the server log says so #30326

Closed

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

Filing gate: ③ the maintainer's direct order, verbatim: 「你发现的问题都立卡,安全问题总专用的安全密卡通道,需要进一步分析的进一步测试,还是没有把握的用决策卡。」 (2026-11-05). Found in a real-user browser walkthrough of Setup on main 04f36b63f8, with a test app and a local test deployment.

Business reason. The compatibility check exists so an app written for another platform version does not break a customer's deployment. When it is skipped, the administrator clicking Install is the person who needs to know, and they do not read server logs.

Reader. The server lane dev for the install answer in packages/cloud-connection/src/marketplace-install-local-plugin.ts, and the UI lane for showing it.

Duplicates. Searched engines.protocol package marketplace warning admin (19 hits). #21727, closed, is a different case: an incompatible package answered with a 500. The rest are QA run anchors.

Measured

Installing HotCRM v6.0.0 from the marketplace, the server log says:

WARN [MarketplaceInstallLocal] [protocol] package 'app.objectstack.hotcrm' declares no engines.protocol range; loading under protocol 18.0.0 without a compatibility check (ADR-0087).

The page says only that the install succeeded. The detail page shows no platform version information.

Expected

The install answer carries this, and the page shows it in plain words, for example that the app did not state which platform version it supports and was not checked for compatibility. Whether publishing should also warn or refuse such a package is a separate choice. If the dev finds it needs a contract change, report it rather than deciding in the PR.

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:server · pm:queue · 2026-11-05T07:08Z

    ⛔ Not a claim.

    • Read fresh. A package with no protocol range installs with the compatibility check skipped, and only the server log says so (marketplace-install-local-plugin.ts). p2. The install dialog's wording is the domain:ui half.

    Generated by Claude Code

  2. added
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

    Claim: PM loop round 1
    Session: session_01Utp6CYVV6fcAQrNTDQRvPb (seat) · dev = project card thread session_01Utp6CZ35sjTKgyrvdkytCz
    Account: os-bill
    Branch: claude/project-thread-fqxfr0 (harness-pinned thread branch; platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-30326
    Domain: domain:server
    Seat: domain:server#5
    File surface: packages/cloud-connection/src/** (the install answer and its tests); packages/metadata-core/src/protocol-handshake.ts only to expose the existing verdict; packages/services/service-package/src/** only if the same install path answers there; content/docs/** only for sentences this PR makes false (not releases/**); one changeset. ⛔ packages/spec/** (a needed schema change stops as needs_decision), ui/**, skills/**, docs/adr/**, .claude/**, AGENTS.md (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default tier (opus), effort: high
    Clause-②: yes (widening) provisional — an optional notice on the install answer; no if nothing answered changes shape
    Metadata-protocol: none (provisional) — an install answer, not what an author writes
    Responsibility: cloud-connection's marketplace install loads a package with no engines.protocol range without the compatibility check and says so only in a server warn line (measured installing HotCRM v6.0.0, card body) | none: the administrator clicking Install never reads server logs | every administrator installing a package that declares no protocol range
    Thread-read: 6652014530
    Premise: holds per the card's measurement; server half only (the install dialog's wording is the ui half, lane off duty) — the PR carries Refs #30326 and the seat releases the card at landing
    Serial constraints cleared: seat 3's PR #30351 (#30217) edits marketplace-install-local-plugin.ts and is in the merge queue: the dev branches code from origin/main after it merges. Seat 4's PR #30346 (same file) merged at 8589756a.

    Order: project file server-seat5/dispatch-30326.md, delivered to the card thread.

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb
    os-dev-report

    Card thread session_01Utp6CZ35sjTKgyrvdkytCz · branch claude/project-thread-fqxfr0 · draft PR #30409 · head 6c1d2ef22

    {
      "issue": 30326,
      "status": "done",
      "branch": "claude/project-thread-fqxfr0",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30409",
      "session": "session_01Utp6CZ35sjTKgyrvdkytCz",
      "premise_still_valid": true,
      "summary": "Premise held on fdad1786 and 870ebce3: install-local admitted a package with no engines.protocol through assertProtocolCompat, which only warned and returned void, and all three success answers (managed, unmanaged, paired customization) said nothing. assertProtocolCompat now returns the verdict checkProtocolCompat gave (new type ProtocolCompatAdmitted) and the no-range / unparsed-range verdicts carry protocolVersion; step 1c keeps it and every success answer carries optional data.protocolCheckSkipped { reason (the handshake's own status), packageId, protocolVersion, message, + requiredRange / rangeSource for unparsed-range }, omitted when the range was checked. The warn line is unchanged. Contract stop measured and not reached: no packages/spec schema describes the install-local success answer. Card assignee untouched; PR opened as draft with no assignee, labels or review request (Part of #30326: the UI half remains).",
      "tests": "Red first on fdad1786 (fix reverted, pins in): 5 notice cases red (200 with no protocolCheckSkipped), 2 controls green; with the fix 43/43 in the two files. Head 4d926a74 (os-verify-lock VERDICT command-exit 0): metadata-core typecheck exit 0, cloud-connection typecheck exit 0; metadata-core test Test Files 23/23 Tests 911/911; cloud-connection test Test Files 70/70 Tests 877/877. One existing pin moved: marketplace-install-local-jobs.test.ts fixture now declares engines.protocol ^CURRENT_MAJOR (its jobs-free case pins the exact answer key set). Ablation via scripts/ablation-replace.mjs on 4d926a74: deleting the protocolCheckSkipped assignation (anchor 1 -> 0, blob 8e7fdb92 -> 5f6c1432) turns the 5 notice cases red, 38 green; restored blob == HEAD 8e7fdb92, git diff HEAD empty; no dist leg (metadata-core aliased to src in the cloud-connection vitest config, plugin imported from src).",
      "gates": "dispatch-gates --commands on 6c1d2ef22 (after merging origin/main 8fad7b193): 60 families, identical to the list on 4d926a74; 60 run, exit codes captured before any pipe, 60 x exit 0; --ran: 60 derived / 60 run / 0 NOT-MEASURED / 0 UNRUN. On 4d926a74: 60 x exit 0 after git fetch of fixture commit 621a4876 for check-plugin-teardown-shape --self-test (exit 3 on the shallow clone before). pnpm lint exit 0 on 4d926a74. CI check-runs on #30409: not read at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "line_budget": "7 files, +242 / -14 vs origin/main merge base 8fad7b193; under the 3000-line class (c) threshold",
      "deviations": [
        "The order names `Refs #30326`; os-dev.md's Definition of done names `Part of #N` for a PR that should not close its card, and the file wins on conflict, so the body says `Part of #30326` (neither closes the card).",
        "The order asks for `pnpm lint`; os-dev.md says the repo-wide lint is CI's run. Ran it anyway: exit 0 on 4d926a74.",
        "packages/cloud-connection/src/marketplace-install-local-jobs.test.ts: an existing fixture gained engines.protocol (inside the dispatched surface, tests of the install answer).",
        "The merge of origin/main (#30380, #30368) touched metadata-protocol, cli and spec only, so suites and typecheck were not re-run on 6c1d2ef22; gates were.",
        "Thread-designated branch: commits carry the model-free trailer pair per AGENTS.md."
      ],
      "files_changed": [
        ".changeset/30326-install-answer-protocol-check-skipped.md",
        "packages/cloud-connection/src/marketplace-install-local-customization-pair-install.test.ts",
        "packages/cloud-connection/src/marketplace-install-local-jobs.test.ts",
        "packages/cloud-connection/src/marketplace-install-local-plugin.ts",
        "packages/cloud-connection/src/marketplace-install-local-protocol-handshake.test.ts",
        "packages/metadata-core/src/protocol-handshake.test.ts",
        "packages/metadata-core/src/protocol-handshake.ts"
      ],
      "mcp_calls": "0 — no GitHub MCP call; reads went through gh api",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches, run 42007198845 success, read-back 9571/9571 bytes identical, PR #30409 draft, no assignees, no labels); this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/30326/comments). Plus git push of the designated branch (not REST).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: seat 5 · noted, not filed — POST /api/v1/packages (packages/runtime/src/domains/packages.ts, assertProtocolCompat(manifest)) still answers success with no notice for a package with no range; outside this order's surface; with the verdict now returned, the same spread there is small. Dedupe words: engines.protocol packages door notice, protocolCheckSkipped runtime packages",
        "carrier: seat 5 · noted, not filed — os package install prints the answer's note but not protocolCheckSkipped; the CLI's call"
      ]
    }

    Report taken 2026-11-05T10:02Z.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

    Landing · 2026-11-05T10:10Z: server half → PR #30409 (head 6c1d2ef2), seat ACCEPT posted, ready + auto-merge enabled. Part of #30326: the card stays open for its ui half; the seat releases it at merge.

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

    Release: 2026-11-05T10:55Z — server half landed, PR #30409 merged as 60fe44fdc (seat ACCEPT 6655279987), Part of #30326. The card goes back to the queue for its remaining half, re-laned domain:server → domain:ui; assignee cleared.
    Resume-from: the ui half — the install dialog shows data.protocolCheckSkipped.message in plain words when POST /api/v1/marketplace/install-local answers it (present only when the ADR-0087 handshake admitted the package unchecked: reason no-range / unparsed-range, packageId, protocolVersion; requiredRange / rangeSource for unparsed-range), and the package detail page may show the same. Nothing is owed on the server for this card. The other install door, POST /api/v1/packages, is #30412 (server, p3).

  7. added
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 5, 2026
  8. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  9. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif

    Claim: PM loop round 2
    Session: session_01L6bhgVwQZbHRRM9CaXeKif
    Account: os-sales
    Branch: claude/project-thread-sukiom (card thread of this project; a thread can push only its designated branch — measured platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-30326
    Domain: domain:ui
    Seat: domain:ui#5
    File surface: ui/packages/app-shell/src/console/marketplace/** (install result types in marketplaceApi.ts, the detail page's Install note, the catalog's org install message, their tests) + ui/packages/app-shell/src/views/metadata-admin/PackagesPage.tsx (Setup → Packages → Import) + ui/packages/i18n/src/locales/*.ts (marketplace.*) + ui/packages/i18n/src/namespaces/studio/{en,zh}.ts (engine.packages.*) + one root .changeset/. ⛔ packages/** (server lane).
    Container & model: M, mode:thread, model: default — dispatch-gates --tier: no path-derived mandate, effort: high
    Clause-②: yes
    Metadata-protocol: none
    Responsibility: POST /api/v1/marketplace/install-local already answers data.protocolCheckSkipped when the ADR-0087 handshake admitted a package unchecked (PR #30409), and the Console's three install result surfaces read only the success fields, so the notice is dropped | none: the administrator does not see server logs and no client draws the field | every administrator who installs, from the Console, a package that declares no engines.protocol or a range the server cannot parse
    Thread-read: 6656206176
    Premise: holds
    Serial constraints cleared: PR #30443 (this seat, #30311) edits imports and the Open app button in MarketplacePackagePage.tsx / MarketplacePage.tsx, not the install handlers or notes: merge main if it lands first. PR #30426 (#30330) merged. #30325 and #30323 (queue, unclaimed) share these pages and serialise after this card. No in-flight domain:ui claim covers console/marketplace/** or PackagesPage.tsx.

    Scope: the ui half named in Release 6656206176, at the three install result surfaces. A standing protocol display on the package detail page is out (no field to read back after install); the dev reports it. Clause-② yes (widening) for new i18n keys: the seat's TIER_DEFAULT review before the queue. Dispatch order lives in the card thread's opening message.

  10. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgWZ1wrAZ2ocZovnByy
    os-dev-report

    Card thread session_01L6bhgWZ1wrAZ2ocZovnByy · branch claude/project-thread-sukiom · draft PR #30460 · head 1a72f696

    {
      "issue": 30326,
      "status": "done",
      "branch": "claude/project-thread-sukiom",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30460",
      "session": "session_01L6bhgWZ1wrAZ2ocZovnByy",
      "premise_still_valid": true,
      "summary": "Premise held on b6caa141: the install door answers data.protocolCheckSkipped (measured live on app-showcase: no-range and unparsed-range shapes exactly as the dispatch's mechanism section states), and the Console's three install result surfaces read only the success fields. New console/marketplace/protocolCheckSkipped.ts (modelled on dependencyMissing.ts) draws marketplace.install.protocolCheckSkipped.noRange / .unparsedRange from the notice's facts, the server message for an unknown reason, nothing when absent; ProtocolCheckSkippedNote.tsx renders it as an amber line inside the existing result note on the package page Install (all four success branches), the catalog org install and Setup > Packages > Import. Result types gain the optional field; 2 keys in all 10 locale packs.",
      "tests": "On a58846c5 (head 1a72f696 is tree-identical): 4 new files Test Files 4/4, Tests 14/14 (lock VERDICT command-exit 0). pnpm --dir ui exec vitest run packages/app-shell/src/console/marketplace/ packages/app-shell/src/views/metadata-admin/PackagesPage packages/i18n/: Test Files 163/163, Tests 2016 passed 13 skipped. Ablation via scripts/ablation-replace.mjs: reader guard replaced by an unconditional return null (anchor 1 -> 0, blob 1700af14 -> 8e4eb802): 10 failed / 4 passed (the 4 CONTROL cases green); restored blob == HEAD 1700af14, git diff HEAD empty; no dist leg (tests import app-shell src). type-check @object-ui/app-shell and @object-ui/i18n exit 0.",
      "gates": "dispatch-gates --commands on a58846c5: 35 families, 35 x exit 0 (codes captured before any pipe); --ran: 35 derived / 35 run / 0 NOT-MEASURED / 0 UNRUN. pnpm --dir ui run check:spec-symbols exit 0. ui checks i18n-keys, i18n-drift, i18n-dead-keys, control-bytes, new-line-citations, icon-record-names, phantom-deps: exit 0 each; check:eager-locale-catalogues exit 2 PREREQUISITE NOT MET (needs a built console bundle): NOT MEASURED locally, CI's reading. eslint on 6 changed sources: 0 errors. CI check-runs on #30460: not read at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "line_budget": "21 files, +637 / -4 vs merge base b6caa141 (393 of the added lines are the 4 test files); under the 3000-line threshold",
      "deviations": [
        "Suggested route named engine.packages.* rows in studio en/zh for Import; PackagesPage already draws DEPENDENCY_MISSING through the shared marketplace hook (marketplace.* keys, 10 locales, same language source as useMetadataLocale), so Import reuses useProtocolCheckSkippedText and no engine.packages.* row is added.",
        "Before/after zh 1440 shots cover Setup > Packages > Import only: the rig has no cloud marketplace (cloudUrl empty), so the package page and the org catalog cannot install from a catalog; both are pinned by tests on the wire shape the live server answered. Before = reader held to null via ablation-replace --hold, restored, blob == HEAD.",
        "Evidence commit 136df32a holds the PNGs, removed by 1a72f696; the PR body links blob URLs at 136df32a.",
        "Thread-designated branch: commits carry the model-free trailer pair per AGENTS.md."
      ],
      "files_changed": [
        ".changeset/30326-install-result-protocol-check-skipped.md",
        "ui/packages/app-shell/src/console/marketplace/MarketplacePackagePage.tsx",
        "ui/packages/app-shell/src/console/marketplace/MarketplacePage.tsx",
        "ui/packages/app-shell/src/console/marketplace/ProtocolCheckSkippedNote.tsx",
        "ui/packages/app-shell/src/console/marketplace/__tests__/MarketplacePackagePage.protocolCheckSkipped-30326.test.tsx",
        "ui/packages/app-shell/src/console/marketplace/__tests__/MarketplacePage.orgInstallProtocolCheckSkipped-30326.test.tsx",
        "ui/packages/app-shell/src/console/marketplace/__tests__/protocolCheckSkipped-30326.test.ts",
        "ui/packages/app-shell/src/console/marketplace/marketplaceApi.ts",
        "ui/packages/app-shell/src/console/marketplace/protocolCheckSkipped.ts",
        "ui/packages/app-shell/src/views/metadata-admin/PackagesPage.importProtocolCheckSkipped-30326.test.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/PackagesPage.tsx",
        "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts"
      ],
      "mcp_calls": "2 — mcp__github__issue_read (get_comments on #30326), mcp__github__pull_request_read (get on #30442, body format); reads only, no MCP write",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches, run 42026770457 success, read-back 9378/9378 bytes identical, PR #30460 draft, no assignees, no labels); this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/30326/comments). Plus git push of the designated branch (not REST).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: claim (seat 5) · noted, not filed — a standing protocol display on the package detail page: no read serves protocolCheckSkipped back after install (GET install-local listing carries no such field), so it would need a server field first. Dedupe words: package detail protocol range display, installed package protocolCheckSkipped listing",
        "carrier: #30412 · noted, not filed — POST /api/v1/packages answers no notice; when it does, PackagesPage has no caller of that door for install, nothing owed here"
      ]
    }

    Report taken 2026-11-05T12:25Z.

  11. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif

    Landed at 2026-11-05T13:35Z: PR #30460 merged as 48231b024e (seat ACCEPT 6658926257 on head afdb07ea, TIER_DEFAULT contract review PASS 6658702566), Fixes #30326. The merge read 2026-11-05T13:31Z on the PR.

    probe reading
    git grep -c "noRange:" origin/main -- ui/packages/app-shell/src/console/marketplace/protocolCheckSkipped.ts 1 (the install result's protocol note is on main)
    card state closed (completed) by the merge

    State change: pm:dispatched removed. The server half landed earlier (PR #30409); with the three Console install surfaces now drawing protocolCheckSkipped, nothing remains on the card.

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

Metadata

Metadata

Assignees

Labels

domain:uiDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions