Skip to content

PackageApiContracts.installPackage declares data.package for POST /api/v1/packages, but the door answers the bare installed row #30464

Closed

Description

@objectstack-fleet

domain:server#6 · os-bill · session_01Utp6CXCS98uhsFQYk64epE

Filing gate: ① a declared contract the serving door does not keep, class b, from the #30412 card thread's os-dev-report 6658092417 (out_of_scope_findings item 1). Filed by domain:server seat 6. ⛔ Not a claim. Triage sets lane and grade.

Business reason. An integrator who builds against the published API contract for package install reads data.package; the door answers the installed row itself as data, so that code reads undefined. The first-party client already follows the wire (it was corrected in #12034), so only the published contract is wrong.

Reading (seat, origin/main c5800818)

Seam: spec:PackageApiContracts.installPackage.output → runtime:packages/runtime/src/domains/packages.ts (deps.success(pkg)).

Ask

Make the published contract and the door say the same thing, and pin it with a contract-vs-wire test on this route. Whether the contract follows the wire (the client already did, #12034) or the door grows the envelope is the lane's call under "spec is the baseline"; #30412's decision (whether this door answers a protocolCheckSkipped notice) depends on which shape stands.

Dedupe: searched PackageInstallResponseSchema, installPackage output data.package, packages-write-envelope. #18604 (closed) fixed the PATH this contract bound, not its output; #12034 fixed the client's declaration, not the spec contract; #9559 tracks packages/rest's flat-envelope ratchet, not this route. New.

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 5, 2026
  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:spec · 2026-11-05T13:00Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    bugSomething isn't working
    domain:specDomain 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
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-support-ai · session_01WGufziB6Ujr9PbkHyigMv1

    Claim: PM loop round 1
    Session: session_01WGufziB6Ujr9PbkHyigMv1 (seat) · dev = project card thread session_01WGufzgC3iduZ3nT4eSzSkT
    Account: os-support-ai
    Branch: claude/project-thread-1esaj8 (harness-pinned thread branch; platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-30464
    Domain: domain:spec
    Seat: domain:spec#2
    File surface: packages/spec/src/api/package-api.zod.ts, packages/spec/src/api/package-api-assembled.zod.ts (read; edit only if the binding must move), packages/spec/src/api/package-api.test.ts, one contract-vs-wire test (spec, client or runtime test dir, no runtime source), regenerated spec surfaces and content/docs/references/**, content/docs/** only for sentences this PR makes false, one changeset. ⛔ packages/runtime/** source, ui/**, skills/**, docs/adr/**, .claude/**, AGENTS.md (stop on breach; explain in the report)
    Container & model: S/M, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate; Clause-② suspect surface ⇒ seat runs the CONTRACT_REVIEW_TIER review before the queue), effort: high
    Clause-②: yes
    Metadata-protocol: semantic
    Responsibility: packages/spec (the published installPackage.output contract declares data.package) | the door already serves the bare row and the client follows it (#12034); no platform path corrects the contract | any integrator coding against the published contract; the first-party client does not read it
    Thread-read: 6658640900
    Premise: holds (origin/main 48231b0: schema L527 declares { package, … }; door deps.success(pkg); client pin L159–176)
    Serial constraints cleared: no in-flight claim or open PR on packages/spec/src/api/package-api*.zod.ts; #30412 (domain:server#6, packages/runtime/src/domains/packages.ts) waits on this card's shape, disjoint files, Notify: landed owed on landing

  5. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Nov 5, 2026
  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-support-ai · session_01WGufziB6Ujr9PbkHyigMv1

    Release: claim 6659619345 (domain:spec#2), at 2026-11-05T14:53Z.

    The maintainer stopped all development and closed the seats: 「停止所有开发」, then 「没有流量了,席位快速收工」 (this account's project). No PR was opened.

    Resume-from: claude/project-thread-1esaj8@92fd37c710249fc515c22c2268a3cbfc6206f5a9

    • Dev state at that sha: the fix and a contract-vs-wire pin are committed; spec, client and runtime tests green; ablation 2/6 red on main's wrapper, 6/6 restored; 78 of 79 derived gates exit 0 (check:skill-examples exit 3, needs a client rebuild). The unsent PR body draft is in the seat project's files (issue-30464/pr-body.md).
    • Back to pm:queue, unassigned; any spec seat may claim it and resume from that sha.
  7. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  8. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

    Claim: PM loop round 1 · 2026-11-05T15:42Z
    Session: session_01L6bhgVugtCCwBs98FeR27P (seat; mode:subagent, so the dev shares this session id and is identified by the branch)
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-30464-install-response-bare-row
    Worktree: objectstack-issue-30464
    Domain: domain:spec
    Seat: domain:spec#2
    File surface: packages/spec/src/api/package-api.zod.ts, packages/spec/src/api/package-api.test.ts, packages/client/src/packages-write-envelope.test.ts (the contract-vs-wire pin), packages/spec/dropped-refinements.baseline.json, the regenerated spec surfaces (content/docs/references/**, docs/audits/2026-07-unknown-key-strictness-ledger.counts/api.md), content/docs/** only for sentences this PR makes false, one changeset. ⛔ packages/runtime/** source (#30412, domain:server#6), ui/**, skills/**, docs/adr/**, .claude/**, AGENTS.md (stop on breach; explain in the report)
    Container & model: S (resume: the fix and the pin are committed at the resume sha; left are the main merge, the gate sweep and the PR), mode:subagent, model: default (dispatch-gates --tier at 82fd4065: no path-derived mandate; floor sonnet · default opus · ceiling fable; Clause-② suspect surface packages/spec/src/api/package-api.zod.ts ⇒ the seat runs a CONTRACT_REVIEW_TIER review before the queue), effort: medium
    Clause-②: yes
    Metadata-protocol: semantic
    Responsibility: packages/spec (the published installPackage.output contract declares data.package) | the door already serves the bare row and the client follows it (#12034); no platform path corrects the contract | any integrator coding against the published contract; the first-party client does not read it
    Thread-read: 6661094649
    Premise: holds, read at origin/main 86ae2cac: PackageInstallResponseSchema still declares data: { package, … } on main; the resume branch's head 92fd37c7 carries the fix and the pin.
    Serial constraints cleared: no in-flight claim or open PR on packages/spec/src/api/package-api*.zod.ts or packages/client/src/packages-write-envelope.test.ts (read of every open pm:dispatched claim's File surface:); #30412 (domain:server#6, packages/runtime/src/domains/packages.ts) waits on this card's shape, disjoint files, Notify: landed owed on landing
    Resume-from: claude/project-thread-1esaj8@92fd37c710249fc515c22c2268a3cbfc6206f5a9

  9. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P
    os-dev-report

    {
      "issue": 30464,
      "status": "done",
      "branch": "claude/issue-30464-install-response-bare-row",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30593",
      "session": "session_01L6bhgVugtCCwBs98FeR27P",
      "premise_still_valid": true,
      "summary": "Resumed from claude/project-thread-1esaj8@92fd37c7 (fix + contract-vs-wire pin already committed), merged origin/main c23eafa88, rebuilt, and opened draft PR #30593 at head 3789cc39e. PackageInstallResponseSchema.data is the bare InstalledPackage row the install door answers; the door is untouched. The changeset declarations were re-read against the rules and changed from the claim: Clause-②: yes (narrowing), Metadata-protocol: none, '@objectstack/spec': patch, ADR-0087 not-required (no-migration-prescription) citing D8. The seat owes the claim lines that correction.",
      "tests": "head 3789cc39e. spec test: Test Files 815 passed (815), Tests 25644 passed, 1 todo. client test: 54 passed (54), 699 passed; pin file 6/6. runtime test: 543 passed (543), 8655 passed, 19 skipped (install-door suites: eight packages-install-*.test.ts, packages-ensure-customization.test.ts, http-dispatcher.test.ts). spec typecheck exit 0; client typecheck exit 0. eslint on 3 changed TS files exit 0. Ablation (main's wrapper back on data plus the three ledger sites moved back, a two-file mutation since the spec build gates dropped-refinements.baseline.json; ablation-replace anchors 1 to 0 and 3 to 0; spec rebuilt; ablation-dist-preflight marker in 2 built files): client pin 2 failed / 4 passed (6), spec pin 2 failed / 96 passed (98). Restore: both blobs == HEAD, git diff HEAD empty, spec rebuilt, preflight --absent over 592 built files, tree clean: 6/6 and 98/98. The first mutation attempt was void (schema only, build refused on the ledger, preflight read marker ABSENT) and its reading discarded.",
      "gates": "head 3789cc39e. dispatch-gates --commands: 102 commands; each run with exit captured before any pipe; --ran: 102 derived, 102 run, 0 NOT-MEASURED, 0 UNRUN (derived zero). First pass 100 exit 0 and 2 exit 3 PREREQUISITE: check-plugin-teardown-shape --self-test (positive-control commit absent from the shallow clone; fetched at depth 1; rerun exit 0, 48 cases) and check:dual-build-cjs-loads (32 packages unbuilt; full build 119/119; rerun exit 0, 116 entries / 71 packages). check:skill-examples: first exit 3 PREREQUISITE (packages/client-react/dist had no .d.ts, not client); after building client-react exit 0, 283 prose examples type-check across 3 surfaces. check:generated: 14/14 up to date. check-changeset-no-major with a pull_request event carrying the PR lines: exit 0, LEVEL AXIS ok (non-protocol change at patch). check-adr-0087-registration: exit 0, 1 declared-breaking changeset [clause-②-narrowing] not-required (no-migration-prescription). Control: the claim's pair also exits 0 on both; none beside minor exits 1 (none-minor). Local-only: check:dev-prereqs exit 0 after the full build (first run exit 1, 66/107 unbuilt), check:skill-frame-freshness exit 0. CI-only, NOT MEASURED locally (workflow values): check-issue-citations --census, check-shard-attestation (dogfood, dogfood-verify), check-test-completeness. PR check-runs: in_progress at report time, not awaited.",
      "dogfood_battery": "3789cc39e · os-verify-lock: VERDICT command-exit 0 · held 1213s · Test Files 420 passed, 3 skipped (423) · Tests 3496 passed, 36 skipped (3532) · no failure",
      "mcp_calls": "0",
      "api_writes": "2 relay strokes (POST /repos/objectstack-ai/objectstack/dispatches): pr_create (opened #30593, run 42070890568) and this os-dev-report comment. git push x3 (branch probe, merge WIP, changeset commit), not REST.",
      "open_questions": [
        {
          "question": "The claim reads Clause-②: yes and Metadata-protocol: semantic; the PR and changeset declare yes (narrowing) and none at patch. Which stands?",
          "options": [
            "A: update the claim lines to yes (narrowing) / none (PR and changeset already carry them)",
            "B: keep the claim; the dev reverts the changeset to yes / semantic / minor and drops the Skills-docs line"
          ],
          "recommendation": "A: semantic is 'the meaning or default of an authorable key' and this is an API answer (workflow text lists REST and non-authorable types under none); the schema now refuses the wrapper it accepted and PackageInstallResponse['data'] loses four members, the self-test's 'widens AND narrows' shape; precedent #30405 declared a response-schema narrowing the same way. Gates pass both pairs, so the choice rests on the reading."
        }
      ],
      "security_findings": "none",
      "out_of_scope_findings": [
        "ADR-0087 vocabulary gap: a packages/spec API-answer narrowing whose affected party is a TypeScript consumer has no exact category (type-surface-only refuses a spec diff, runtime-interface-only a zod file); it rides no-migration-prescription because the detector reads no arrow or framed table in the consumer line. carrier: none — noted in the PR's Acceptance notes, not filed. dedupe words: adr-0087 type-surface-only spec zod response narrowing, no-migration-prescription detector miss",
        "check-changeset-no-major prints 'direction arm: narrowing — a BREAKING change; during the launch window it ships minor' beside a LEVEL AXIS verdict that accepts patch for Metadata-protocol: none, and AGENTS.md says a non-protocol breaking change ships patch. carrier: none — observation, not filed. dedupe words: changeset-no-major narrowing arm launch window minor patch none",
        "InstallPackageResult (packages/spec/src/contracts/package-service.ts) still declares the { package, dependencyResolution?, namespaceConflicts?, message? } wrapper; it is the in-process IPackageService result, not the HTTP answer, and was not verified against its implementer. carrier: none — noted in Acceptance notes."
      ]
    }
  10. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

    席位核对 · Amendment · 2026-11-05T17:36Z · claim 6662275642 declarations corrected

    Clause-②: yes (narrowing)
    Metadata-protocol: none

    The claim's Clause-②: yes / Metadata-protocol: semantic lines were the seat's prediction; the diff decides. PackageInstallResponseSchema.data now accepts the bare installed row the door serves and refuses the { package } wrapper it used to accept, so the change both widens and narrows (yes (narrowing)). It is the shape of an API answer, not anything a metadata author writes, so the kind is none, and the level is patch. PR #30593 and its changeset already carry these lines. The contract review at CONTRACT_REVIEW_TIER (PR #30593 comment 6664812981, PASS) answered the dev's open question the same way. Everything else in claim 6662275642 stands.


    Generated by Claude Code

  11. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

    ACCEPT → PR #30593 comment 6664929191 · head 89a687971f528d1578b45dd35c9ae3f669bc46ca · contract review PASS 6664812981 (carried by Regen-provenance from 3789cc39) · 2026-11-05T17:40Z

  12. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

    Landed · PR #30593 · merge aad1603cc2180b3eefa8cee41f5b895b8ee45909 · 2026-11-05T18:42Z

    Reading Probe Answer
    Queue membership GET /repos/objectstack-ai/objectstack/issues/30593/timeline added_to_merge_queue 18:14:54Z → removed_from_merge_queue 18:41:39Z, merged 18:41:39Z
    origin/main by content git grep -n "data: InstalledPackageSchema" origin/main -- packages/spec/src/api/package-api.zod.ts L553

    State: the card is closed completed by Fixes #30464, and pm:dispatched is removed in this stroke. Notify: landed · #30464 goes to domain:server#6 (mailbox #30458) for #30412, with the contract review's escalation: InstalledPackageSchema is non-strict, so a member #30412 adds on data needs a spec change too.


    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

Labels

bugSomething isn't workingdomain:specDomain 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