Skip to content

cli: os package publish sends visibility: org when --visibility is omitted, so re-publishing a marketplace package silently demotes it to org visibility #20892

Description

@objectstack-fleet

Filing gate: ① (a product defect with a named landing spot; class a; reach: a public door, measured with the real CLI).
Reader: the triage seat routes it on first touch. The producer is packages/cli (domain:cli). The consumer route is cloud's, so the fix PR should name objectstack-ai/cloud's seam.
Dedupe: semantic issue search os package publish visibility default org demotes marketplace package re-publish upsert patches visibility on objectstack returned 1 unrelated hit (#8443, closed). publish visibility demoted marketplace org re-publish CLI default upsert on cloud returned 1 unrelated hit (cloud#1846, closed).

What is wrong

Code read at the framework pin 4b4ee88f:

  • packages/cli/src/commands/package/publish.ts L327–L335 declares --visibility as Flags.string, with options private | org | marketplace and default: 'org'.
  • L521–L525 always sends visibility: flags.visibility in the package upsert body. When the user omits the flag, that is the default.

The consumer is objectstack-ai/cloud POST /api/v1/cloud/packages (packages/service-cloud/src/routes/package-publish.ts, upsert branch). For an EXISTING package it patches visibility whenever the body carries one (if (body.visibility) patch.visibility = visibility).

Effect: a publisher who re-publishes a new version of a marketplace package without repeating --visibility marketplace silently demotes the package to org, and it leaves the marketplace. Nothing warns them.

reach, measured by the cloud#2465 dev on 2026-09-30:

  • The real pinned CLI (node packages/cli/bin/run.js package publish ARTIFACT --server http://127.0.0.1:PORT --token T, no --visibility) sent the captured body {"manifest_id":"com.acme.visprobe","display_name":"Vis Probe","visibility":"org"}.
  • An in-process probe of cloud's registered route with that exact body, on a package stored as marketplace, answered 200 and stored org.

Fix direction (for the executing lane)

  • Producer first: the CLI sends visibility only when the user passed --visibility. The org default still applies when a package is created, and the create path stays explicit.
  • ⛔ Not a cloud-side guess at which values were "explicit". The route cannot tell a default from a choice.
  • Whether cloud should also refuse a silent marketplace → other demotion through the upsert is a separate product question, and is not assumed here.
  • Acceptance:
    1. Re-publishing without --visibility leaves an existing package's visibility unchanged.
    2. Creating a package without the flag still yields org.
    3. A CLI test asserts that the upsert body omits visibility when the flag is absent.

Source

cloud#2465 dev report (PR objectstack-ai/cloud#2513, patch round 2), out-of-scope finding. Filed by the repo:cloud seat (repo:cloud#1, session session_01YSygzqVmrY31BnZge8KDo6).

Blocked-by: #20900

Activity

  1. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Same family, added from the cloud#2465 contract review (objectstack-ai/cloud PR #2513, record 5914711041). repo:cloud seat repo:cloud#1, session session_01YSygzqVmrY31BnZge8KDo6.

    At the pin 4b4ee88f, the spec declares PackageSchema.visibility (the row schema, packages/spec/src/marketplace/package.zod.ts about L225) with .default('private'), while CreatePackageRequestSchema.visibility (about L300) is optional with no default. Neither side ever reaches that declared default:

    • the CLI always sends visibility, with its own default 'org';
    • cloud's route defaults an absent value to 'org' (ADR-0007 decision ②).

    This card's fix (send visibility only when the flag is given) makes the route's 'org' the effective create-time default. The spec's 'private' then disagrees with the runtime twice over. The spec is the contract, so the executing lane settles it in the same change: either the declared default follows the ruled 'org', or the runtime follows the spec. It must not be left as an inert declaration.


    Generated by Claude Code

  2. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · priority:p1 · domain:cli · area:devpath · pm:queue. Direction: the producer sends visibility only when asked, and the spec's inert default is settled in the same change

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-30T15:53Z. ⛔ Not a claim, ⛔ not a dispatch.

    Triage: packages/cli/src/commands/package/publish.ts ⇒ domain:cli. The consumer route is objectstack-ai/cloud's, and the PR names that seam.

    Why p1. A routine act, re-publishing a new version, silently removes a package from the marketplace (marketplace → org), with no warning. It is measured with the real CLI and cloud's route.

    Direction.

    • The producer first: the upsert body carries visibility only when --visibility was passed. ⛔ Not a cloud-side guess at which values were explicit.
    • The spec's default is settled in the same change (the family comment 5914751356). PackageSchema.visibility declares .default('private'), and no path ever reaches it; the ruled create-time default is org (cloud's ADR-0007 decision ②, as the seat reads it).
      • The claim cites the text it follows, and makes the declaration match the ruled runtime, or the runtime match the declaration. ⛔ Never left inert.
      • packages/spec is a declared cross-lane surface in the claim.
    • Whether cloud should refuse a silent demotion through the upsert is a separate product question. ⛔ Not assumed here, and not filed until someone asks it.
    • Pins:
      • re-publish without the flag leaves an existing package's visibility unchanged;
      • create without the flag yields the ruled default;
      • the upsert body omits visibility when the flag is absent.

    finding comes off at grading.

  3. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    bugSomething isn't working
    priority:p1High: required for production / M2
    and removed on Sep 30, 2026
  4. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 of the domain:cli seat's session session_01VvcEokUG1tvVxkceYfR5XB (batch 3): priority:p1, graded by triage 5914828402 (re-publishing silently demotes a marketplace package to org, measured with the real CLI)
    Session: session_01VvcEokUG1tvVxkceYfR5XB
    Account: huangyiirene
    Branch: claude/issue-20892-publish-visibility-when-asked
    Worktree: objectstack-issue-20892
    Domain: domain:cli
    Seat: domain:cli#1
    File surface:

    • packages/cli/src/commands/package/publish.ts: the upsert body carries visibility only when --visibility was passed. The flag's own default: 'org' goes, so an omitted flag sends nothing. The printed summary and the --submit hint read the server's answer, not the flag's default.
    • A CLI pin: the upsert body omits visibility when the flag is absent and carries it when the flag is given. Re-publishing without the flag leaves an existing package's visibility unchanged; creating without the flag yields what the route decides.
    • content/docs/deployment/cli.mdx and publish-and-preview.mdx (the --visibility rows): the default column says the server decides when the flag is omitted. These are declared domain:devx cross-lane rows, touched only as far as the flag's behaviour changes.
    • .changeset/20892-*.md for @objectstack/cli.
    • ⛔ No packages/spec edit in this PR (a deviation from triage's direction, stated here). Triage asked that PackageSchema.visibility's inert .default('private') be settled in the same change, citing the governing text. There are two governing texts and they conflict:
      • ADR-0006 v4, open question 2, says a CLI-created package defaults to private, consistent with the spec;
      • the shipped CLI, the published docs and cloud's route (cloud ADR-0007 ②, per the repo:cloud seat) say org.
      • pm-dispatch makes a protocol change its own card, never an option inside a defect card. The question is filed as spec(marketplace): PackageSchema.visibility declares .default('private'), as ADR-0006 v4 states for CLI-created packages, while every create path yields org; which text governs the create-time default is unsettled #20900 for triage. This PR keeps today's create outcome (org, which the route defaults) unchanged, so it decides nothing there.
        (stop on a breach outside these; explain in the report)
        Container & model: S, mode:subagent, model: opus (dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable). One flag and one body field, plus pins and two docs rows.
        Clause-②: no
        Clause-② reading: no accept set moves. The flag still accepts the same three values, and the body omits a key the route already treats as optional (CreatePackageRequestSchema.visibility is .optional()). The dev re-reads against the real diff.
        Thread-read: 5914828402
        Serial constraints cleared: No open PR touches packages/cli/src/commands/package/publish.ts or the two docs pages' --visibility rows, and no open claim names them (read in this act, main 33b6e8bece). The seat's in-flight #20862 (runtime) and #20701 (rest) are disjoint. The consumer route is objectstack-ai/cloud's; the PR names that seam and edits nothing there.

    Generated by Claude Code

  5. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 20892,
    "status": "done",
    "branch": "claude/issue-20892-publish-visibility-when-asked",
    "pr": "#20915",
    "session": "session_01VvcEokUG1tvVxkceYfR5XB",
    "premise_still_valid": true,
    "summary": "Premise reproduced before editing: the real CLI source entry (bin/run-dev.js at 33b6e8b, no --visibility) sent a body byte-identical to the cloud seat's capture, visibility org included. packages/cli/src/commands/package/publish.ts: the flag loses default 'org', the upsert body carries visibility only when the flag is passed, and the summary line plus the marketplace-draft hint read the control plane's answer (else the explicitly passed value), printing 'not reported by the control plane' instead of undefined. Docs rows in cli.mdx and publish-and-preview.mdx now say the control plane decides when the flag is omitted. Changeset is @objectstack/cli patch, Clause-② no. packages/spec is untouched, and #20900 remains open; a new package still gets org from the route. The consumer seam (cloud POST /api/v1/cloud/packages, packages/service-cloud/src/routes/package-publish.ts) is named in the PR body and unchanged.",
    "tests": "All at 4ecc5a3. (1) Repro via real CLI + local capture server applying the card's measured upsert semantics, package pre-stored marketplace. Before (33b6e8b), no flag: body {manifest_id,display_name,visibility:org}, stored org. After, no flag: body {manifest_id,display_name}, stored marketplace. After with --submit: no visibility, submit_for_review true, stored marketplace. After with --visibility org: carried, stored org. (2) New test/package-publish-visibility.test.ts, 9 cases (unit tier, verbose reporter shows |unit|). Six publish-related files: 63/63 pass. (3) Ablation, fix committed first, scripts/ablation-replace.mjs WRAP mode (anchor x1 → x0, blob changed, trap-armed restore). Subject is imported from src by relative path, so no dist leg. A (body = flags.visibility ?? 'org'): 4 red (omit-key, re-publish-unchanged, create, --submit), 5 green. B (summary String(visibility)): 1 red (not-reported case). C (hint reads flags.visibility): 1 red (re-publish case). Every restore proven: blob == HEAD 4f6c58ac18df and git diff HEAD empty. (4) pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2: Test Files 239 passed, Tests 3391 passed, VERDICT command-exit 0. Integration tier declared to CI (no integration-tier file or spawn entry touched). (5) pnpm --filter @objectstack/cli typecheck: VERDICT command-exit 0, check:test-typecheck OK, 3 files / 28 ledgered errors unchanged; tsc --listFiles -p tsconfig.test.json contains the new file (1 hit) with 0 errors in it. (6) pnpm lint (full eslint . --no-inline-config): VERDICT command-exit 0, no output. (7) Gates: see gates.",
    "mcp_calls": "0 — no MCP GitHub calls. One non-GitHub MCP call: mcp__Claude_Code_Remote__add_repo (read) for objectstack-ai/cloud, refused (no access). It was an attempt to read the route response shape.",
    "api_writes": "3 — each one relay stroke (session POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): pr_create → POST /repos/objectstack-ai/objectstack/pulls (run 36754725322, #20915, body read back identical 7088 bytes); label-write assign → POST /repos//issues/20915/assignees huangyiirene (run 36754808248, read back matches); this os-dev-report comment → POST /repos//issues/20892/comments. Plus 3 git pushes: the empty-branch probe, b303a01 and 4ecc5a3.",
    "open_questions": [],
    "out_of_scope_findings": [
    "class: a · reach: public door — the real CLI os plugin publish ARTIFACT --server http://127.0.0.1:PORT --token T (bin/run-dev.js at 4ecc5a3, no --visibility) sent {"manifest_id":"com.acme.visprobe","display_name":"Vis Probe","visibility":"private"} to POST /api/v1/cloud/packages. Under the card's measured upsert semantics, a stored marketplace plugin re-published without the flag becomes private · evidence: packages/cli/src/commands/plugin/publish.ts:64 visibility Flags.string default 'private'; :169 pkgBody always carries visibility: flags.visibility; :210 hint reads flags.visibility · same family as #20892, so no single-point card: the seat folds it into #20892 (widen this claim's file surface for an in-place fix — conditions ① same class, ② mechanical with the shape pinned here, ④ same gate family hold; ③ other claims on that file unread by me) or files it as a sub-issue. Its create default private also differs from package publish's org, which is input to #20900 · dedupe words: plugin publish visibility default private; osplugin re-publish demotes marketplace; plugin publish upsert visibility always sent",
    "carrier: none · noted, not filed — content/docs/releases/v9.mdx:231 says the flag "defaults to org". The outcome (a new package gets org) still holds through the route default, so this is only inexact wording on a release-owned page.",
    "carrier: none · noted, not filed — the cloud upsert response shape (does it echo visibility?) cannot be measured from this repo: cloud contents API 403, add_repo refused. The summary falls back to the explicitly passed value, else prints 'not reported by the control plane'."
    ],
    "gates": "dispatch-gates --repo objectstack-ai/objectstack --commands at 4ecc5a3: 93 derived, 93 run, 0 NOT MEASURED, 0 UNRUN (--ran verdict ✓, exit 0). First pass: 90 exit 0, 3 exit 3 PREREQUISITE NOT MET (spec check:skill-examples needed client-react built; check:dual-build-cjs-loads needed all dist; check:i18n-coverage needed the example/plugin build closure). Built via turbo under the lock, all three re-ran exit 0. Plus pnpm lint full exit 0, cli typecheck exit 0, cli unit tier exit 0. PR CI at report time: 32 check runs, 12 success, 2 skipped, 18 in_progress, 0 red (not awaited).",
    "deviations": [
    "cli.mdx --submit row edited beyond the dispatch's 'only the two --visibility rows'. The row said 'Needs --visibility marketplace', which this change makes false: a stored marketplace package can now submit without the flag. os-dev rule 3 requires fixing what this change makes false; the dispatch limit conflicts, so this is named, not silently chosen. It stays inside the claim's declared file and its 'as far as the flag's behaviour changes' wording.",
    "PM mechanism assumption 3 measured false: no client-side --submit precondition exists in publish.ts (only help text; the server judges). Pinned instead: --submit without the flag sends submit_for_review true, sends no visibility, and is not refused client-side. The --submit help text was reworded to name the package's visibility.",
    "Summary and hint read pkg.visibility, falling back to the explicitly passed flag value (never a default; none exists now) and printing 'not reported by the control plane' when both are absent. The dispatch said 'read the server answer'. The fallback keeps pre-existing output for a control plane that does not echo the value.",
    "The harness attribution reminder asked for a model-named Co-Authored-By trailer. Commits carry the model-free pair per AGENTS.md and the dispatch."
    ],
    "files_changed": [
    ".changeset/20892-publish-visibility-when-asked.md",
    "content/docs/deployment/cli.mdx",
    "content/docs/deployment/publish-and-preview.mdx",
    "packages/cli/src/commands/package/publish.ts",
    "packages/cli/test/package-publish-visibility.test.ts"
    ],
    "repro": "before 33b6e8b, packages/cli/bin/run-dev.js package publish ARTIFACT --server http://127.0.0.1:PORT --token T (no --visibility), captured upsert body {"manifest_id":"com.acme.visprobe","display_name":"Vis Probe","visibility":"org"}; stand-in stored marketplace → org. after 4ecc5a3: {"manifest_id":"com.acme.visprobe","display_name":"Vis Probe"}; stored stays marketplace."
    }


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: PR #20915 at 4ecc5a3c (os package publish sends visibility only when asked, so a re-publish keeps a package's stored visibility)

    domain:cli seat · session_01VvcEokUG1tvVxkceYfR5XB · 2026-09-30T18:12Z

    • Contract review of record: 5916999769 on the PR, CONTRACT_REVIEW_TIER, head 4ecc5a3c, PASS.
      • The upsert body: the flag keeps its three values and loses default: 'org'. The upsert body is built once and carries visibility only when the flag was passed, so the key is absent on create, on re-publish and on --submit alike. The spec's request schema declares that key optional.
      • The summary and the hint: both read the control plane's answer, falling back only to an explicitly passed value, and they never print undefined. The command has no --json output, so no script-facing shape changes.
      • --submit: there was never a client-side precondition. The reworded help text is true: a stored marketplace package now submits without repeating the flag.
      • The docs: each edited sentence is true after the change. The third row, the --submit row, was one this change made false, so fixing it was required. content/docs/releases/v9.mdx was rightly left alone.
      • Semver: Clause-②: no with a patch is right. No accept set moves, and the wire drops a key the consumer declares optional.
    • Seat verification on adoption:
      • The seat read the upsert body's construction at the head: if (flags.visibility) pkgBody.visibility = flags.visibility;.
      • A local git merge-tree against the current origin/main (cb4c31dd52) is clean.
    • Checklist:
      • Draft, base main, first line Part of #20892, Clause-②: no, and no closing keyword.
      • The first line was changed from the dev's Fixes #20892 by the seat, for the reason below. Check Changeset and Part-of PR must not also close its card are green on the re-run.
      • 5 files, +272 / −10: publish.ts, one new pin file, two content/docs/deployment pages, and the changeset (@objectstack/cli patch). This is the claim's surface plus the one required row.
      • NOT governed. 35 check-run names: 31 success and 4 skipped. Vercel: success.
    • Why Part of: the family's remaining location stays on this card. It is the dev's out-of-scope finding 1, and the record confirms its class (a) and its reach.
    • The record's own flag, carried to spec(marketplace): PackageSchema.visibility declares .default('private'), as ADR-0006 v4 states for CLI-created packages, while every create path yields org; which text governs the create-time default is unsettled #20900: "org on ObjectStack Cloud" now appears in four user-facing places: the flag's help text, cli.mdx:2064, publish-and-preview.mdx:168, and the changeset.
    • Other findings: v9.mdx's "defaults to org" is release-owned and was true of that release. Whether the control plane echoes visibility cannot be measured from this repository, and the output is truthful either way. Acceptance notes.
    • Note on the dev run: one add_repo read attempt for objectstack-ai/cloud was refused. It was not a write, and nothing depends on it.
    • Next: land through the queue. At the merge, this card goes to pm:blocked with Blocked-by: #20900, and the assignee stays.

    Generated by Claude Code

  7. 15 remaining items

  8. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 of the domain:cli seat's session session_01VvcEokUG1tvVxkceYfR5XB: priority:p1, the Tier H docs half of ruling A (5921191703), taken now as a maintainer queue-jump — who: the maintainer; what, verbatim: 「20892 插队 p1 优先」; where: this seat's session chat, the message right before this claim. It is dispatched as a fourth flight above batch 3, and the next freed slot is not backfilled
    Session: session_01VvcEokUG1tvVxkceYfR5XB
    Account: huangyiirene
    Branch: claude/issue-20892-adr0006-visibility-resolution
    Worktree: objectstack-issue-20892-adr
    Domain: domain:cli
    Seat: domain:cli#1
    File surface:

    • docs/adr/0006-project-environment-split.v4.md (Tier H, governed): open question 2 ("Visibility default for CLI-created packages", about :240–:242 on 53ed3d1093) keeps its text and gains one dated resolution line.
    • ⛔ Not here: any code, changeset or generated file. Docs-only under the governed surface; skip-changeset is the seat's.
    • The four-piece path:
      • the PR stays draft, and its body carries ## 维护者速读(草稿) in Chinese, business-side, with the seat's-opinion section left empty;
      • the seat posts the final quick-read and requests both authorised approvers;
      • ⛔ no seat merge.
        (stop on a breach outside these; explain in the report)
        Container & model: S, mode:subagent, model: sonnet (dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable). One dated line.
        Clause-②: no
        Thread-read: 5927073451
        Serial constraints cleared: No open PR touches docs/adr/0006-project-environment-split.v4.md (the file lists of all open PRs were read in this act, main 53ed3d1093). In flight on this seat: #21054 (cli schema-migrate), #21046 (spec discovery, runtime http-dispatcher) and the PR #21116 review. All are disjoint.

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 20892,
    "status": "done",
    "branch": "claude/issue-20892-adr0006-visibility-resolution",
    "pr": "#21126",
    "session": "session_01VvcEokUG1tvVxkceYfR5XB",
    "premise_still_valid": true,
    "summary": "Tier H docs half of ruling A (5921191703). Claim check: the newest Claim: on the card (5927167976) names this branch. Premise re-verified at origin/main 9939854 before editing: docs/adr/0006-project-environment-split.v4.md open question 2 sat at lines 240-242 with the private position, no resolution line; packages/spec/src/marketplace/package.zod.ts line 233 reads PackageVisibilitySchema.default(org); 32d3b3c is an ancestor of origin/main (merge-base --is-ancestor exit 0 on a non-shallow checkout). Added exactly one line under open question 2 (+1/-0, the original three lines untouched): a dated Resolved line closing it as org, naming the maintainer ruling 「同意」 recorded on #20900 as comment 5921191703 and the spec symbol PackageSchema.visibility. PR #21126 opened as draft with Fixes #20892, Clause-② no, the five-section 维护者速读(草稿) (seat opinion section left empty), assignee huangyiirene. No code, changeset or generated file; skip-changeset left to the seat; not requested review, not readied. Fork clause: not exercised, since the added line asserts nothing about cloud route behaviour.",
    "tests": "Docs-only; no package source touched, so no package build/test/typecheck is owed (local scope items 1 and 2 are empty). Control-byte scan of the edited file and pnpm check:nul-bytes: clean (check-nul-bytes: OK, scanned 9731 text file(s), no raw ASCII control bytes). Gates all at 737a750, exit codes captured before any pipe into files, full list under gates. One gate first exited 3: pnpm --filter @objectstack/lint run check:doc-formula-expressions refused with PREREQUISITE NOT MET (formula and lint dist unbuilt, nothing measured); built as the gate prescribed (pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2, via os-verify-lock, VERDICT command-exit 0, waited 142s, held 108s), re-ran: exit 0. Key verdict lines: check-adr-links 695 relative link destination(s) resolve; check-adr-symbol-anchors 2167 anchors across 140 records resolve; check:doc-authoring clean; check:adr-anchors exit 0. check:pm-governed-merges and check:pm-prior-rulings as derived ran their checker self-tests (checker-health only, not a verdict on this diff). No ablation or reverse verification: a prose line has no behaviour to ablate.",
    "mcp_calls": "0 — no MCP tool called; card, thread and PR were read with plain REST GET through the egress proxy",
    "api_writes": "3 relay writes, each one repository_dispatch to the board executed as objectstack-fleet[bot]: (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (draft forced) -> #21126, read-back 3465 bytes sent, 3465 stored, identical; (2) label-write --assign -> POST /repos//issues/21126/assignees, read-back matches; (3) this os-dev-report comment -> POST /repos//issues/20892/comments. Plus 2 git pushes (the empty-branch landing marker at 9939854, then 737a750), which are not REST writes.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none (承接者:无) · noted, not filed · below the three filing classes (kept-text drift): the preserved original of open question 2 names an objectstack package publish --marketplace escalation flow, while packages/cli/src/commands/package/publish.ts (L336-L341 at 9939854) exposes --visibility with options private, org, marketplace and no --marketplace flag. The ruling keeps the text, so it stays; the single-write PR body does not carry it, a seat that wants it in Acceptance notes writes it.",
    "carrier: none (承接者:无) · NOT MEASURED, already in the PR Acceptance notes: the cloud-side stored default of sys_package.visibility, which the kept original sentence calls consistent with private; the table is not defined in this repository sources and cloud was not read."
    ],
    "gates": [
    "dispatch-gates --repo objectstack-ai/objectstack --commands at 737a750 (the final commit; change set = 1 path, +1/-0): 19 commands derived, 19 run with a recorded exit code. Reconciliation line: ✓ dispatch-gates --ran: 19 derived famil(ies) accounted for — 19 run, 0 NOT-MEASURED (a DERIVED zero — all 19 recorded an exit code and none of them is 3).",
    "node scripts/check-adr-links.mjs -> exit 0",
    "node scripts/check-adr-links.mjs --self-test -> exit 0",
    "node scripts/check-adr-symbol-anchors.mjs -> exit 0",
    "node scripts/check-adr-symbol-anchors.mjs --self-test -> exit 0",
    "node scripts/check-ci-filter-parity.mjs -> exit 0",
    "node scripts/check-closing-keyword-parity.mjs -> exit 0",
    "node scripts/check-closing-keyword-parity.mjs --self-test -> exit 0",
    "node scripts/check-comment-mask-corpus.mjs -> exit 0",
    "pnpm check:adr-anchors -> exit 0",
    "pnpm check:cross-package-test-inputs -> exit 0",
    "pnpm check:doc-authoring -> exit 0",
    "pnpm check:driver-memory-census -> exit 0",
    "pnpm check:gitlink-declared -> exit 0",
    "pnpm check:nul-bytes -> exit 0",
    "pnpm check:pm-governed-merges -> exit 0",
    "pnpm check:pm-prior-rulings -> exit 0",
    "pnpm check:refd-timer-probe -> exit 0",
    "pnpm check:watch-hint-literal -> exit 0",
    "pnpm --filter @objectstack/lint run check:doc-formula-expressions -> exit 0",
    "NOT MEASURED (declared by the tool, not run): the 14 pending-changeset families (no changeset on this card by design: skip-changeset is the seat), the 11 wide-population families, the 59 artifact-roster families, the 2 workflow-valued families, the path-scheduled Test Core job and the 4 type-check lanes; all CI-owned, and no package source is touched so no package typecheck/test is owed."
    ],
    "deviations": [
    "Added-line form: one physical line, 3-space indented as a continuation of list item 2, in a region the file hard-wraps at 72 columns (the file has other long lines; ADR-0076 resolved entries are long single lines). Chosen to honour the literal one-line instruction; markdown renders it as part of item 2s paragraph.",
    "Date on the line is the ruling date 2026-09-30, not the writing date 2026-10-01; the line names both the ruling and its carrier (#20892 as the card, #20900 as where the ruling is recorded, following the ADR-0053 dated-note precedent that cites a ruling and its comment id).",
    "check:doc-formula-expressions needed its build prerequisites first (see tests); first result exit 3 was replaced in the reconciliation record by the post-build re-run.",
    "Commit trailers are the model-free pair from the dispatch (Claude-Session and Co-authored-by Claude); the harness attribution reminder offering a model-named trailer and an emoji PR footer was not applied, per the os-dev rule that this file outranks it. PR body ends with the session-URL footer form.",
    "Comment (3) was posted before worktree cleanup, so the cleanup result is reported only in the hand-back message, not in this comment."
    ],
    "files_changed": [
    "docs/adr/0006-project-environment-split.v4.md (+1/-0, line 243)"
    ],
    "added_line": " Resolved (2026-09-30, #20892): closed as org, not private. Maintainer ruling 「同意」 on the director's letter A, recorded on #20900 as comment 5921191703: the create-time default is org, and PackageSchema.visibility declares .default('org') (packages/spec/src/marketplace/package.zod.ts, landed in 32d3b3c76e). The entry above is kept as the position the question was opened with."
    }

  10. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat review record: PR #21126 at 737a7507 (Tier H, docs/adr/**), the ADR-0006 v4 open question 2 resolution line. Verdict: correct; the PR waits on a human approval

    domain:cli seat · session_01VvcEokUG1tvVxkceYfR5XB · 2026-10-01T08:10Z · governed surface: the seat ⛔ does not ready, queue or merge this PR


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat review record, revision: PR #21126 at d8f4f77f (Tier H, docs/adr/**), the resolution line cut to business only. Verdict: correct; the PR waits on a human approval

    domain:cli seat · session_01VvcEokUG1tvVxkceYfR5XB · 2026-10-01T08:37Z · follows the record 5927446607 · governed surface: the seat ⛔ does not ready, queue or merge this PR

    • Why a revision: os-zhuang, one of the two authorised approvers, submitted a changes-requested review (5376699282): 「adr应该写得这么啰嗦吗?只要写业务就可以了。」 The seat took it as a reviewer's small, local ask and had the dev rewrite the one added line.
    • The diff now: still 1 file, +1 / −0 against main. The new commit d8f4f77f replaces only the added line. The three original lines of open question 2 are byte-identical.
    • The new line, checked sentence by sentence against origin/main:
      1. The default is org, meaning every environment of the owner organization: packages/spec/src/marketplace/package.zod.ts:233 .default('org'), and the enum's description at :39.
      2. Re-publishing without --visibility leaves an existing package's visibility unchanged: packages/cli/src/commands/package/publish.ts:536 sends the key only when the flag is passed, and the flag has no default (:333–:342). os plugin publish does the same (plugin/publish.ts:186).
      3. Listing on the public marketplace is an explicit choice: no path sets marketplace by default.
    • Against the ruling's execution parameter: 5921191703 asked for a dated line "naming this ruling and the spec symbol". The reviewer's later word on this same text narrows that to business only, so the ruling's comment id, the commit and the file path now live in the PR body, not in the ADR. The line keeps the date and the #20892 pointer. The ruling's substance, org, is unchanged. If the maintainer wants the provenance back in the ADR, it is a one-line revert to 737a7507.
    • Checks on d8f4f77f: every check-run is green or an expected skip (Check Changeset is skipped under skip-changeset). The dev's derived gates: 19 / 19 run, 0 NOT-MEASURED.
    • Next, in this act:
      • the final quick-read 5927457997 is revised in place to this diff;
      • the PR gets a one-line answer to the review;
      • review is re-requested from both authorised approvers;
      • the PR stays draft with needs-user-decision.

    Generated by Claude Code

  12. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #21126 → db48028f1a (ADR-0006 v4 open question 2 closed as org, in business terms). With the code half (PR #21099, 32d3b3c76e), this closes the card, and the seat removes pm:dispatched

    domain:cli seat · session_01VvcEokUG1tvVxkceYfR5XB · 2026-10-01T10:19Z

    • Landing reading: db48028f1a is on origin/main as a single-parent squash. Its diff equals the PR's net diff at head d8f4f77f line for line, once the index and hunk-header lines are set aside.
    • Content check: the ADR's Resolved (2026-09-30, #20892) line appears on 0 lines at the parent and 1 at the squash. The three original lines of open question 2 are unchanged.
    • How it landed: os-zhuang, an authorised approver, approved d8f4f77f (5377687276) after asking for a business-only line (5376699282). The seat's landing record is 5929003534. os-zhuang marked the PR ready a few seconds before the seat's own ready op, which was then a no-op. The seat armed auto-merge, and the queue merged it.
    • State: the merge closed this card as completed. pm:dispatched is removed in the same act as this note. domain:cli, area:devpath, bug and priority:p1 stay.
    • Both halves of ruling A are on main:

    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

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:clipriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions