Repository navigation
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
Activity
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsSame family, added from the cloud#2465 contract review (objectstack-ai/cloud PR #2513, record 5914711041).
repo:cloudseatrepo:cloud#1, sessionsession_01YSygzqVmrY31BnZge8KDo6.At the pin
4b4ee88f, the spec declaresPackageSchema.visibility(the row schema,packages/spec/src/marketplace/package.zod.tsabout L225) with.default('private'), whileCreatePackageRequestSchema.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
visibilityonly 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
- the CLI always sends
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsTriage: first grade —
bug·priority:p1·domain:cli·area:devpath·pm:queue. Direction: the producer sendsvisibilityonly when asked, and the spec's inert default is settled in the same changeTriage 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
visibilityonly when--visibilitywas 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.visibilitydeclares.default('private'), and no path ever reaches it; the ruled create-time default isorg(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/specis 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
visibilitywhen the flag is absent.
findingcomes off at grading.- The producer first: the upsert body carries
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't workingpriority:p1High: required for production / M2High: required for production / M2and removed
on Sep 30, 2026 objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClaim: PM loop round 1 of the
domain:cliseat's sessionsession_01VvcEokUG1tvVxkceYfR5XB(batch3):priority:p1, graded by triage5914828402(re-publishing silently demotes amarketplacepackage toorg, 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 carriesvisibilityonly when--visibilitywas passed. The flag's owndefault: 'org'goes, so an omitted flag sends nothing. The printed summary and the--submithint read the server's answer, not the flag's default.- A CLI pin: the upsert body omits
visibilitywhen 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.mdxandpublish-and-preview.mdx(the--visibilityrows): the default column says the server decides when the flag is omitted. These are declareddomain:devxcross-lane rows, touched only as far as the flag's behaviour changes..changeset/20892-*.mdfor@objectstack/cli.- ⛔ No
packages/specedit in this PR (a deviation from triage's direction, stated here). Triage asked thatPackageSchema.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:cloudseat) sayorg. pm-dispatchmakes a protocol change its own card, never an option inside a defect card. The question is filed as spec(marketplace):PackageSchema.visibilitydeclares.default('private'), as ADR-0006 v4 states for CLI-created packages, while every create path yieldsorg; 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.visibilityis.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.
- ADR-0006 v4, open question 2, says a CLI-created package defaults to
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsos-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 CLIos 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--submitrow 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
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsACCEPT: PR #20915 at
4ecc5a3c(os package publishsendsvisibilityonly when asked, so a re-publish keeps a package's stored visibility)domain:cliseat ·session_01VvcEokUG1tvVxkceYfR5XB· 2026-09-30T18:12Z- Contract review of record:
5916999769on the PR,CONTRACT_REVIEW_TIER, head4ecc5a3c, PASS.- The upsert body: the flag keeps its three values and loses
default: 'org'. The upsert body is built once and carriesvisibilityonly when the flag was passed, so the key is absent on create, on re-publish and on--submitalike. 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--jsonoutput, so no script-facing shape changes. --submit: there was never a client-side precondition. The reworded help text is true: a storedmarketplacepackage now submits without repeating the flag.- The docs: each edited sentence is true after the change. The third row, the
--submitrow, was one this change made false, so fixing it was required.content/docs/releases/v9.mdxwas rightly left alone. - Semver:
Clause-②: nowith apatchis right. No accept set moves, and the wire drops a key the consumer declares optional.
- The upsert body: the flag keeps its three values and loses
- 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-treeagainst the currentorigin/main(cb4c31dd52) is clean.
- The seat read the upsert body's construction at the head:
- Checklist:
- Draft, base
main, first linePart of #20892,Clause-②: no, and no closing keyword. - The first line was changed from the dev's
Fixes #20892by the seat, for the reason below.Check ChangesetandPart-of PR must not also close its cardare green on the re-run. - 5 files, +272 / −10:
publish.ts, one new pin file, twocontent/docs/deploymentpages, and the changeset (@objectstack/clipatch). This is the claim's surface plus the one required row. - NOT governed. 35 check-run names: 31 success and 4 skipped. Vercel: success.
- Draft, base
- 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.os plugin publishdeclaresdefault: 'private'and always sendsvisibility, so re-publishing a storedmarketplaceplugin without the flag demotes it (packages/cli/src/commands/plugin/publish.ts:64,:169,:210). This was measured with the real CLI.- Its fix is not mechanical. The CLI cannot tell a create from a re-publish before the upsert, so omitting the key would change a new plugin's outcome from
privateto the route's default, which is spec(marketplace):PackageSchema.visibilitydeclares.default('private'), as ADR-0006 v4 states for CLI-created packages, while every create path yieldsorg; which text governs the create-time default is unsettled #20900's open question. - At the merge, this card goes to
pm:blockedwithBlocked-by: #20900, for that one location.
- The record's own flag, carried to spec(marketplace):
PackageSchema.visibilitydeclares.default('private'), as ADR-0006 v4 states for CLI-created packages, while every create path yieldsorg; which text governs the create-time default is unsettled #20900: "orgon 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.- Those sentences rest on the
repo:cloudseat's reading of the route (5914751356), which this repository cannot show. - The card's reach measurement exercised the re-publish path, not a create with the key absent.
- If spec(marketplace):
PackageSchema.visibilitydeclares.default('private'), as ADR-0006 v4 states for CLI-created packages, while every create path yieldsorg; which text governs the create-time default is unsettled #20900 settles towardprivate, or a cloud measurement of the create path says otherwise, those four sentences need a docs follow-up. The CLI's behaviour would not change.
- Those sentences rest on the
- Other findings:
v9.mdx's "defaults toorg" is release-owned and was true of that release. Whether the control plane echoesvisibilitycannot be measured from this repository, and the output is truthful either way. Acceptance notes. - Note on the dev run: one
add_reporead attempt forobjectstack-ai/cloudwas refused. It was not a write, and nothing depends on it. - Next: land through the queue. At the merge, this card goes to
pm:blockedwithBlocked-by: #20900, and the assignee stays.
Generated by Claude Code
- Contract review of record:
15 remaining items
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsClaim: PM loop round 1 of the
domain:cliseat's sessionsession_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 abovebatch3, 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–:242on53ed3d1093) keeps its text and gains one dated resolution line.- The line closes it as
organd names the ruling5921191703(maintainer 「同意」) and the spec symbolPackageSchema.visibility, which landed in32d3b3c76e(PR fix(cli,spec): os plugin publish sends visibility only when asked; PackageSchema.visibility defaults to org #21099). - ⛔ Nothing else in the ADR moves.
- The line closes it as
- ⛔ Not here: any code, changeset or generated file. Docs-only under the governed surface;
skip-changesetis 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.
- the PR stays draft, and its body carries
Generated by Claude Code
- added a commit that references this issue
on Oct 1, 2026 objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsos-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 anobjectstack package publish --marketplaceescalation flow, while packages/cli/src/commands/package/publish.ts (L336-L341 at 9939854) exposes--visibilitywith options private, org, marketplace and no--marketplaceflag. 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 asorg, notprivate. Maintainer ruling 「同意」 on the director's letter A, recorded on #20900 as comment 5921191703: the create-time default isorg, andPackageSchema.visibilitydeclares.default('org')(packages/spec/src/marketplace/package.zod.ts, landed in32d3b3c76e). The entry above is kept as the position the question was opened with."
}objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsSeat 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 approvaldomain:cliseat ·session_01VvcEokUG1tvVxkceYfR5XB· 2026-10-01T08:10Z · governed surface: the seat ⛔ does not ready, queue or merge this PR- The diff: 1 file, +1 / −0. One line is added under open question 2 of
docs/adr/0006-project-environment-split.v4.md. The three original lines are byte-identical, and nothing else in the ADR moves. - Against the ruling's execution parameter (
5921191703: "the entry keeps its text and gains a dated resolution line naming this ruling and the spec symbol"):- the text is kept;
- the line is dated
2026-09-30, the date of the maintainer's 「同意」; - it names the ruling as comment
5921191703on spec(marketplace):PackageSchema.visibilitydeclares.default('private'), as ADR-0006 v4 states for CLI-created packages, while every create path yieldsorg; which text governs the create-time default is unsettled #20900 (verified: that comment's issue is spec(marketplace):PackageSchema.visibilitydeclares.default('private'), as ADR-0006 v4 states for CLI-created packages, while every create path yieldsorg; which text governs the create-time default is unsettled #20900); - it names the spec symbol
PackageSchema.visibility.default('org')inpackages/spec/src/marketplace/package.zod.ts, and the commit32d3b3c76e, PR fix(cli,spec): os plugin publish sends visibility only when asked; PackageSchema.visibility defaults to org #21099's landing onorigin/main. - Every clause is true at the head.
- Discipline: no code, changeset or generated file. Nothing publishes, so
skip-changesetapplies; the seat applies it in this act.- The dev's derived gates: 19 / 19 run, 0 NOT-MEASURED, including
check:adr-links,check-adr-symbol-anchors,check:adr-anchorsandcheck:doc-authoring. - The commit carries the model-free trailer pair.
- The dev's derived gates: 19 / 19 run, 0 NOT-MEASURED, including
- The draft quick-read is accurate, with one correction in the final version: the cloud route default is the cloud seat's reading (
5914751356), not verified in this repository. - Residual, noted: the kept original sentence names an
objectstack package publish --marketplaceflag. The command's flag is--visibilitywith three values. The ruling keeps the text, so the line stays and nothing is owed here. - The four-piece path, executed in this act:
needs-user-decisionandskip-changeseton the PR;- the final quick-read posted on the PR;
- review requested from both authorised approvers;
- the PR stays draft.
- At a human approval, the seat lands it through the queue. At its merge, the
Fixescloses this card.
Generated by Claude Code
- The diff: 1 file, +1 / −0. One line is added under open question 2 of
- added a commit that references this issue
on Oct 1, 2026 objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsSeat 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 approvaldomain:cliseat ·session_01VvcEokUG1tvVxkceYfR5XB· 2026-10-01T08:37Z · follows the record5927446607· 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 commitd8f4f77freplaces 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:- 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. - Re-publishing without
--visibilityleaves an existing package's visibility unchanged:packages/cli/src/commands/package/publish.ts:536sends the key only when the flag is passed, and the flag has no default (:333–:342).os plugin publishdoes the same (plugin/publish.ts:186). - Listing on the public marketplace is an explicit choice: no path sets
marketplaceby default.
- The default is
- Against the ruling's execution parameter:
5921191703asked 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#20892pointer. The ruling's substance,org, is unchanged. If the maintainer wants the provenance back in the ADR, it is a one-line revert to737a7507. - Checks on
d8f4f77f: every check-run is green or an expected skip (Check Changesetis skipped underskip-changeset). The dev's derived gates: 19 / 19 run, 0 NOT-MEASURED. - Next, in this act:
- the final quick-read
5927457997is 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.
- the final quick-read
Generated by Claude Code
- Why a revision: os-zhuang, one of the two authorised approvers, submitted a changes-requested review (
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsLanded: PR #21126 →
db48028f1a(ADR-0006 v4 open question 2 closed asorg, in business terms). With the code half (PR #21099,32d3b3c76e), this closes the card, and the seat removespm:dispatcheddomain:cliseat ·session_01VvcEokUG1tvVxkceYfR5XB· 2026-10-01T10:19Z- Landing reading:
db48028f1ais onorigin/mainas a single-parent squash. Its diff equals the PR's net diff at headd8f4f77fline for line, once theindexand 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 is5929003534. 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:dispatchedis removed in the same act as this note.domain:cli,area:devpath,bugandpriority:p1stay. - Both halves of ruling A are on
main:- the code half:
PackageSchema.visibilitydefaults toorg, andos plugin publishsendsvisibilityonly when asked (PR fix(cli,spec): os plugin publish sends visibility only when asked; PackageSchema.visibility defaults to org #21099); - the ADR half: this PR.
- the code half:
Generated by Claude Code
- Landing reading:
- added 3 commits that reference this issue
on Oct 7, 2026
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 visibilityon objectstack returned 1 unrelated hit (#8443, closed).publish visibility demoted marketplace org re-publish CLI default upserton cloud returned 1 unrelated hit (cloud#1846, closed).What is wrong
Code read at the framework pin
4b4ee88f:packages/cli/src/commands/package/publish.tsL327–L335 declares--visibilityasFlags.string, with optionsprivate | org | marketplaceanddefault: 'org'.visibility: flags.visibilityin 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
marketplacepackage without repeating--visibility marketplacesilently demotes the package toorg, and it leaves the marketplace. Nothing warns them.reach, measured by the cloud#2465 dev on 2026-09-30:
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"}.marketplace, answered 200 and storedorg.Fix direction (for the executing lane)
visibilityonly when the user passed--visibility. Theorgdefault still applies when a package is created, and the create path stays explicit.marketplace→ other demotion through the upsert is a separate product question, and is not assumed here.--visibilityleaves an existing package's visibility unchanged.org.visibilitywhen 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:cloudseat (repo:cloud#1, sessionsession_01YSygzqVmrY31BnZge8KDo6).Blocked-by: #20900