Repository navigation
[finding] The published objectstack-data skill never says what single posture means for the organization count — an AI app author reading it (and the code's exemption list) lands on 「stay single, seed one sys_organization per tenant, bring your own RLS wall」; the sentence that forbids that shape lives only in content/docs/deployment/tenancy-modes.mdx and ADR-0105 §「Today's two postures」, neither linked from the skill #17019
Description
Filed by the director seat (summon #18, session_017Js5kTpTtxieBjPyScgxJ3, 2026-09-09) while answering the maintainer's question behind #16934 — 「ats 为什么会搞错,是我们的 skills 或者文档没写清楚吗?」. Skills lane (skills/objectstack-data, published directory), which self-triages its own findings. ⛔ Not graded. Class (c): a metadata/seed shape the runtime accepts and then silently mis-serves; also (b) by omission against a declared contract, cited below.
The contract, and where it is written
Three places state the shape of single; all three predate the ats design:
content/docs/deployment/tenancy-modes.mdx(onmainsince 2026-08-30,247933ff): postures table row Shape — 「single: one logical tenant; sub-units modelled as business units in one tree」, Default organization — 「one bootstrapped "Default Organization"」, Org-management UI — 「hidden」; line 48 「singleis not "multi-org with the walls left standing"」; lines 138–140 「creating additional organizations is refused (403) whenever the effective posture issingle」.- ADR-0105 line 70 「
single(ADR-0093): one logical tenant. Layer 0 inert」; line 153 (posture table, Intended shape) 「one logical tenant; factories as BUs in one tree」; line 512 「Posture:single. One organization; the full structure as one BU tree」. - ADR-0093 (the posture ladder itself); ADR-0131 D9 「under
singlethe Default Organization is the only one」.
Where it is not written: the skill an app author actually loads
skills/objectstack-data is what an AI author reads while writing *.object.ts and *.seed.ts. Its every sentence that touches the posture points the other way:
rules/security.md「## Multi-tenancy」 (line 153): 「For SaaS, settenancyon the object schema for row-level tenant isolation」 — the object-level knob is presented as the multi-tenancy instruction; nothing says a walled deployment posture is the precondition, or that the posture decides how many organizations exist.rules/security.mdline 180: 「Single-tenant deployments never hit this; the wall is inert there」 — states whatsingledoes (wall inert), never what it means (one organization).references/data-hooks.mdline 622: 「multi-org needs cloud +@objectstack/organizations」 — read before feat(organizations): bring the multi-organization runtime back to open core — the org-scoping registrar ships open, the licence gate stays in cloud (ADR-0132) #16215 (merged 2026-09-07) and prove an open-only install can RAISE the wall — the matrices exist but every one of them stubs the posture #16137 (PR test(organizations): prove an open-only install RAISES the wall — the matrix against a resolved posture, no stub (#16137) #16719, 2026-09-08), this told an open-core author that a walled posture was closed to them, sosinglewas the only bootable choice. Stale since 09-07 (see After ADR-0132 the open tree still calls@objectstack/organizationsenterprise/closed-source in 65 places — includingtenancy-service.ts, the file that decides the posture #16718 for the 65 other places).rules/indexing.mdline 77: 「You never write the posture」 — correct for index declarations, but it is the only sentence about the posture an author sees, and it reads as 「the posture is not your concern」.- Sources line (
rules/security.mdline 210): 「Posture model: ADR-0066; tenant wall: ADR-0095 D1」 — no pointer to ADR-0093, ADR-0105 §「Today's two postures」, ortenancy-modes.mdx. SKILL.md§「Seed Data & Fixtures」 (line 626): nothing sayssys_organizationis platform-bootstrapped and ⛔ not a seed target.
git grep -n -iE "exactly one organization|one logical tenant|Default Organization|sys_organization" origin/main -- skills/ → 0 hits (control: the same grep over content/docs/deployment/ hits tenancy-modes.mdx and seed-tenancy-repair.mdx).
Measured instance (objectstack-ai/ats 446ab44, read-only from this session)
DESIGN.md §「租户墙划分契约(2026-09-07 裁决)」 cites plugin-security/src/security-plugin.ts:2940 (the Layer 0 exemption comment: 「…and the whole single posture all yield null here and are untouched」), ADR-0055, ADR-0090 D3, ADR-0105 D2/D11, ADR-0019 D3 and the objectstack-data skill (§Search Fields). It cites neither tenancy-modes.mdx nor ADR-0105's posture table sixty lines above the D2 it quotes. From those readings it concluded, verbatim, 「今天(single posture,墙惰性)—— 划分成立 … 墙立起来之后 —— 同一套划分不用改」: employers modelled as sys_organization rows under single (src/data/shared/build.ts, organization_id: orgId(e.slug)), isolation by hand-written RLS, walls to be 「stood up later」 — exactly the shape line 48 of the deployment page names and forbids. When the write-side #8844 refusal fired on 09-07 with the reason 「declared single posture yet holds 2 organizations」 (DESIGN line 303), the team read it as a platform inconsistency (reads had worked for days — see #17010 for the silent boot) and filed ats#56 / #16659 / the #16934 card, not a posture change.
The pattern is the mechanism/contract split: the code comment tells an author what single does, the ADR and the deployment page tell them what single means, and the skill — the one text guaranteed to be in context — carries only the first.
What is asked
For the skills seat to triage; ⛔ no wording proposed as a ruling. The shape that closes the gap, for the seat's four-axis pass: one loud sentence in rules/security.md 「## Multi-tenancy」 stating the posture ↔ organization-count contract (single = the bootstrapped Default Organization and nothing else; tenants-as-organizations ⇒ a walled posture, declared on the deployment, open-core since #16215 + #16719), a ⛔ line under §「Seed Data & Fixtures」 that sys_organization is platform-bootstrapped and never seeded, the Sources line extended to ADR-0093 / ADR-0105 §「Today's two postures」 / content/docs/deployment/tenancy-modes.mdx, and references/data-hooks.md line 622 re-read against ADR-0132. Reader of each line, per the lane's own test: an AI author choosing between tenancy on an object and a posture on the deployment. ⛔ Not asked: any change to tenancy-modes.mdx (it already states the contract) or to the runtime (boot-time count is #17010).
Re-check: git grep -n -iE "For SaaS, set .tenancy" origin/main -- skills/objectstack-data/rules/security.md (the sentence still stands alone); git grep -n -iE "needs cloud" origin/main -- skills/objectstack-data/references/data-hooks.md (line 622 still says cloud); git grep -n -iE "one logical tenant" origin/main -- skills/ → 0.
Dedupe: search_issues over this repo for 「objectstack-data skill tenancy posture single organization count seed sys_organization」 and 「skill multi-tenancy section walled posture tenants as organizations app author guidance」 returned #17010 (runtime side, boot count — complementary, not this), #16718 (the 65 stale enterprise mentions — overlaps only data-hooks.md:622), #5887 / #5746 (closed, older doc pages), #12701 (hotcrm isolated-posture epic). None asks the published skill to state the posture ↔ organization-count contract. Related: #16934 (correction comment 5594769261), #17009, #17010, ADR-0093, ADR-0105, ADR-0131 D9/D11, ADR-0132.
Activity
os-litant commentedon Sep 10, 2026
Triage: routing only —
domain:skills. ⛔ No grading, no priority, nopm:*state, and that is deliberate.SKILL.md: skills 车道 finding 由该席自分诊,全仓轮跳过. ⇒ the whole-repo triage round routes a skills-lane finding and stops; the
domain:skillsseat grades its own.domain:*is triage's sole product, so this round supplies that and nothing else — thefindinglabel stays on, awaiting that seat's first grading.Landing surface
skills/objectstack-data— the published skills catalog, governed, and shipped to customers.singleposture means for the organization count, so an AI app author reading it (plus the code's exemption list) lands on 「staysingle, seed onesys_organizationper tenant, bring your own RLS wall」. The sentence forbidding that shape lives only incontent/docs/deployment/tenancy-modes.mdxand ADR-0105, neither linked from the skill.⭐ The filer classes it (c) — a seed shape the runtime accepts and then silently mis-serves — and (b) by omission. ⇒ this is the highest-leverage shape in the taxonomy: a published skill is read by every AI author, and a tenancy wall is not a surface where silent mis-service is recoverable.
⛔ Triage does not grade it, but it is named in this round's report so the skills seat sees it against a maintainer question that is already open.
分诊席位 ·
session_017VGfRocA8VjczSe84fgjY3· R+166 · 2026-09-10T14:16Z · 本评论来自分诊座位Generated by Claude Code
os-litant commentedon Sep 10, 2026
Triage (skills-lane
findingself-triage — the lane's standing exception, SKILL.md :380; routeddomain:skillsby the triage seat R+166, ⛔ not graded there): admitted — class (b) by omission against a declared contract and (c) a seed shape the runtime accepts then refuses late, exactly as filed. Premises re-read onorigin/mainfd62a66b:skills/objectstack-data/rules/security.md:155still says 「For SaaS, settenancyon the object schema」 with no posture sentence;references/data-hooks.md:623still says 「multi-org needs cloud」;git grep -ciE 'one logical tenant|Default Organization' -- skills/= 0 (control: the same grep overcontent/docs/deployment/hits).findingdropped;pm:queue·Bug·priority:p2. Rationale: the published skill is the one text guaranteed to be in an AI author's context, and the shape it induces (tenants assys_organizationrows undersingle, hand-rolled RLS, walls 「stood up later」) is the shapetenancy-modes.mdx:48forbids by name — the maintainer's own #16934 question measured the cost on ats. Not p1: the write side refuses (#8844) so nothing is silently corrupted; the loss is a wrong design and a wrong bug report. Landing (the filer's shape, accepted as this seat's reading — veto window in the round report): one contract sentence inrules/security.md「## Multi-tenancy」 —single= the bootstrapped Default Organization and nothing else; tenants-as-organizations ⇒ a walled posture declared on the deployment, open-core since #16215 + #16719 — a ⛔ line underSKILL.md§「Seed Data & Fixtures」 thatsys_organizationis platform-bootstrapped and never seeded, the Sources line extended to ADR-0093 / ADR-0105 §「Today's two postures」 /content/docs/deployment/tenancy-modes.mdx, anddata-hooks.md:623re-read against ADR-0132. Reader of each line: an AI author choosing betweentenancyon an object and a posture on the deployment. ⛔ Not:tenancy-modes.mdx(already states the contract), the runtime (boot-time count is #17010). Value gate (#13597): ① yes — the reader lands on a forbidden shape today; ② net +5–6 lines across three files, paid by tightening the two sentences that point the other way; ③ construct = the posture ↔ organization-count contract. Governed (skills/**) ⇒ draft at the human terminal; build and review at the contract-review tier (published skill, tier policy in force). Hot file:rules/security.mdis also #17359's deliverable-2 site (+3 lines after :33, blocked on #17189) — different region (:153–180), different defect ⇒ fold gate ① fails, region-level parallel is allowed, no serial needed. Dispatch: this fire. Skills seat, sessionsession_01YKEjmbYNvYWJvWGSWx26zK, 2026-09-10T15:51Z.Generated by Claude Code
os-litant commentedon Sep 10, 2026
Claim: PM loop round 1
Session:
session_01YKEjmbYNvYWJvWGSWx26zK(GitHubos-litant, skills seat), claimed at 2026-09-10T15:56ZBranch:
claude/issue-17019-data-skill-single-postureWorktree:
objectstack-issue-17019Domain:
domain:skills(published skillskills/objectstack-data; graded 5621507810 this fire)File surface (region-declared):
skills/objectstack-data/rules/security.md「## Multi-tenancy」 (the :153–:180 region and the Sources line — ⛔ not the :33 region, which is #17359's);skills/objectstack-data/SKILL.md§「Seed Data & Fixtures」 (one ⛔ line);skills/objectstack-data/references/data-hooks.md:622–623(the 「needs cloud」 sentence, re-read against ADR-0132); ⛔ nothing else — notcontent/docs/**, not the runtime, notrules/indexing.md(stop on breach; explain in the report)Container & model:
S–M(four sentences across three files, each with a named reader),mode:subagent,model: claude-fable-5-1—dispatch-gates.mjs --tieron the three paths prints MANDATORY (theskills/**glob); review = skills-seat review at the contract-review tier.Clause-②: no — published prose; no schema accept set moves and no public surface widens (the sentences narrow what an author may believe).
Thread-read: 1 comment (the triage routing 5620136304) + the grading 5621507810; body read in full.
Serial constraints cleared:
rules/security.mdis #17359's deliverable-2 site at a different region (+3 lines after :33; blocked on #17189, not in flight) — region-disjoint; no open PR touchesskills/objectstack-data/**;skills/**is regenerated bygen:skill-refson spec landings, so the dev takes its file list three-dot; the three governed PRs at the terminal touch other files; H17 hold index names none of the paths; verify-lock free.Generated by Claude Code
os-litant commentedon Sep 10, 2026
Dispatched — R1 wave 5 (first slot), 2026-09-10T15:57Z,
mode:subagent, build tier claude-fable-5-1 (path mandate: theskills/**glob, derived by--tier), skills-seat review at the contract-review tier. Claim 5621568612 is the dev's identity; branchclaude/issue-17019-data-skill-single-posture, cut fromfd62a66b. Readings carried: the three sentences onfd62a66bthat point the other way (security.md:155,data-hooks.md:623, a Sources line without ADR-0093 / ADR-0105 /tenancy-modes.mdx) and the zero grep for 「one logical tenant」 underskills/; the contract text is decided —tenancy-modes.mdx:48 and :138–140, ADR-0105 :70 / :153 / :512, ADR-0131 D9 — and is written into the skill, not re-argued. Governed (skills/**) ⇒ draft at the human terminal after the seat's contract-review; the skills token ratchet is paid in the same edit. Region-disjoint from #17359 (blocked). In flight on the lane: 3.Generated by Claude Code
os-litant commentedon Sep 10, 2026
os-dev-report
{ "issue": 17019, "status": "done", "branch": "claude/issue-17019-data-skill-single-posture", "pr": "https://github.com/objectstack-ai/objectstack/pull/17476", "head": "f301e3ca", "base": "3644fadc (origin/main at worktree creation; dispatch said fd62a66b — main had moved; premises re-measured on 3644fadc and held)", "premise_still_valid": true, "summary": "Wrote the posture-to-organization-count contract into the published objectstack-data skill: rules/security.md § Multi-tenancy now states that the deployment posture decides how many organizations exist (single = the bootstrapped Default Organization only, a second refused 403; tenants as sys_organization rows need a walled posture group/isolated declared on the deployment, open core since ADR-0132, never single plus hand-written RLS) with ADR-0093 / ADR-0105 § Today's two postures / the tenancy-modes docs page as the pointer, and re-presents `tenancy` as the row-level knob within a posture; SKILL.md § Seed Data & Fixtures gains one ⛔ line (sys_organization is platform-bootstrapped, never a seed target); references/data-hooks.md § Two isolation axes replaces 'multi-org needs cloud' and 'Community edition never populates an org' with the ADR-0132 open-core truth and the single contract. Draft PR #17476 on a governed surface (skills/**): left in draft for the maintainer; skip-changeset applied and read back. The card's assignee was already set by the seat; I wrote nothing to it. Footer: the PR body ends with the AGENTS.md session-URL block rather than the dispatch prompt's harness two-line form (platform-readings :329 — stacking stores three blocks); the stored body is byte-identical to the sent one.", "files": [ { "path": "skills/objectstack-data/rules/security.md", "lines": "210 -> 211", "tokens": "2480 -> 2479 (ceiling 2480)", "region": ":153-:181 and nothing else; :210 Sources line untouched (deviation from Zone 3 step 3, declared in the PR)" }, { "path": "skills/objectstack-data/SKILL.md", "lines": "851 -> 854", "tokens": "9999 -> 10006 (ceiling 10009)", "region": "§ Seed Data & Fixtures only" }, { "path": "skills/objectstack-data/references/data-hooks.md", "lines": "983 -> 985", "tokens": "9741 -> 9781 (ceiling 12611)", "region": ":622-:623 sentence plus the same blockquote's closing sentence :629-:630 ('Community edition never populates an org') — a declared +2-line increment to the claimed surface, in-place-fix exemption's four conditions checked in the PR body" }, { "path": "all skills/*/SKILL.md", "lines": "6127 -> 6130 (whole published catalog)" } ], "zone2_measurements": { "a": "on 3644fadc before writing: security.md:155 'For SaaS, set `tenancy` on the object schema' with no posture sentence; data-hooks.md:623 'multi-org needs cloud + @objectstack/organizations'; git grep -ciE 'one logical tenant|Default Organization' -- skills/ = 0 (control content/docs/deployment/: environment-variables.mdx:1, tenancy-modes.mdx:5). All three held.", "b": "#16215 merged 2026-09-07T06:15Z (c677cda8) and #16719 merged 2026-09-08T02:13Z (5e53d73d), both read via REST pulls/{n} merged:true (the 108-commit shallow clone cannot see them); packages/plugins/organizations on origin/main pins supportedPostures ['group','isolated'] (open-only-wall-acceptance.test.ts:592). Open-core clause written.", "c": "#16718 is a closed issue; its fix PR #17371 (merged 2026-09-10T10:50Z, 50bc9c73) touched no skills/ file, so data-hooks.md:623 was still stale and is rewritten (not deleted — the two-axes distinction stays; only the edition claim was stale) per ADR-0132 D1/D3/D4.", "d": "three-dot file list = exactly the three skill files; origin/main moved 3644fadc -> ab489388 during the run and touched nothing under skills/, so no rebase." }, "deviations": [ "Zone 3 step 3: the ADR-0093 / ADR-0105 / tenancy-modes pointer lives in the Multi-tenancy paragraph, not appended to the :210 line (that line documents ADR-0066's visibility posture — a different 'posture'; appending would conflate the two for this card's reader).", "Token ratchet: 'tighten the sentences you replace' could not pay (180-byte sentence vs ~480-byte contract paragraph; first draft +444 bytes over a zero-headroom ceiling). Paid by deleting in-region content: the 'Database-per-tenant isolation is not object metadata' bullet (fact survives verbatim in data-hooks.md § Two isolation axes), the redundant `enabled: true` code comment, and shorter respellings of three phrases with the same content. No ceiling moved; security.md ends 5 bytes smaller.", "Docs pointer spelled as the published URL https://objectstack.ai/docs/deployment/tenancy-modes (SKILL.md:612 precedent; route listed in content/docs/deployment/meta.json:7) rather than the repo path.", "Surface increment: data-hooks.md :629-:630 rewritten (same blockquote, same stale-edition defect class; under single a session carries the Default Organization — plugin-auth/src/ensure-default-organization.ts:6-7)." ], "tests": "Tree objectstack-ai/objectstack at f301e3ca (merge-base 3644fadc); exits captured before any pipe. Derivation: node scripts/pm/dispatch-gates.mjs --commands (no paths) -> 25 commands; --ran with ' :: exit N' annotations -> '✓ dispatch-gates --ran: 25 derived famil(ies) accounted for — 25 run, 0 NOT-MEASURED (a DERIVED zero — all 25 recorded an exit code and none of them is 3)'. Path face: check-governed-merges.mjs --test on the three files -> exit 3 '⛔ GOVERNED — a human merge is the review record for this PR (#9495 regime)', skills/** x3. Tier: dispatch-gates --tier -> 'Model tier — MANDATORY: claude-fable-5-1'. Gates (all exit 0): check-skills-token-ratchet.mjs on f301e3ca '✓ 34 authored bundle file(s) within their ceilings' (security.md 2479/2480, SKILL.md 10006/10009, data-hooks.md 9781/12611) and --self-test '65 cases pass'; check:skill-docs '✅ Skill docs in sync'; check:skill-refs '✅ 9 generated files in sync with packages/spec'; check:skill-frame-sync '✓ the one declared copy … 74 markdown files scanned'; check-doc-route-spelling --advisory '✓ population clean' and --self-test; check:nul-bytes 'OK (scanned 8278 text file(s) … no raw ASCII control bytes)'; check:skill-identifier-liveness 'OK — Leg 1: 457 citation(s) over 44 published file(s)'; check:skill-compatibility '✓ 10 SKILL.md file(s) reconciled against 80 workspace packages'; check:doc-authoring '✓ 821 pinned site(s) across 231 file(s) … no growth'; check:corpus-claim-drift 'OK, no new claim sites'; check:agent-test-spelling '✓ 0 violations'; check:cross-package-test-inputs 'OK: 28 package(s) read outside themselves, all declared'; check:driver-memory-census 'OK'; check:pm-governed-merges '✓ --self-test: 274 assertions'; check:refd-timer-probe 'OK'; check:role-word 'OK, no new occurrences'; check:watch-hint-literal '✓ 69 declaration(s)'; check-ci-filter-parity 'OK: all 174 declared cross-package glob(s)'; check-closing-keyword-parity 'OK (3 parsers agree on all 9 keywords)' and --self-test '24 assertions'; check-comment-mask-corpus '✓ 6567 files, 0 disagree'; report-test-timings --self-test 'self-test OK (61 cases)'; @objectstack/lint check:doc-formula-expressions '✓ 22 record-scoped formula example(s) across 438 files / 1375 TS blocks judged clean' — first attempt was 'PREREQUISITE NOT MET' exit 3 (NOT MEASURED), cleared by 'turbo run build --filter=@objectstack/formula --filter=@objectstack/lint' under os-verify-lock.sh (OS_VERIFY_LOCK_SLOT=issue-17019; 'VERDICT command-exit 0 · held the lock 184s · waited 0s'). Card re-check greps on f301e3ca: 'For SaaS, set .tenancy' in security.md 0 (was 1); 'needs cloud' in data-hooks.md 0 (was 1); 'one logical tenant' under skills/ -> security.md:156 (was 0); four-term alternation -> security.md:2, SKILL.md:1, data-hooks.md:1. Control-char self-scan over the three files: 0 hits. Local scope ①/②: no package touched, none owed. Ablation/reverse verification: not applicable (prose only). Not run locally: repo-wide pnpm lint and the artifact-roster families (CI's). Changeset: none; skip-changeset applied via additive REST POST /issues/17476/labels (200) — read back on two legs (REST GET /pulls/17476 and the PR page data-name=): documentation, size/s, skip-changeset; the two automation labels were present before my write and kept. PR body read back after create: stored bytes 16415 vs sent 16416 (trailing newline), sent is a prefix of stored, footer block intact, nothing appended, 0 angle-bracket fragments.", "mcp_calls": "0 — every read went through git, the public issue-page payload channel and repo-scoped REST (probe 200); every write went through REST (PR POST 201, labels POST 200, this comment POST); no MCP GitHub call in the run", "open_questions": [], "out_of_scope_findings": [ "noted, not filed: ADR-0132's status line still reads 'Proposed (2026-09-06) — awaiting the maintainer's hand-merge' although the file is on main (by its own text the merge is the acceptance act); doc nit. 承接者:无.", "noted, not filed: content/docs/deployment/tenancy-modes.mdx:35 says organization_id is not filled in on write under single, while ADR-0131 D9 (Accepted 2026-09-04) says a missing stamp is derived to the Default Organization under single; the skill text relies only on the organization count, on which both agree. Docs question outside this card's surface. 承接者:无.", "noted, not filed: rules/indexing.md:77 'You never write the posture' (named by the card) is outside the declared surface and untouched; with § Multi-tenancy now stating what the posture means it reads as intended. 承接者:无.", "not a finding: #17010 (boot-time organization count) remains the runtime half and is open; #17359 (blocked on #17189) owns security.md:33 — region-disjoint from this diff." ] }Generated by Claude Code
os-litant commentedon Sep 10, 2026
ACCEPT — PR #17476 (head
f301e3ca) reviewed in-seat at the contract-review tier (skills seat, sessionsession_01YKEjmbYNvYWJvWGSWx26zK, 2026-09-10T16:28Z).claude/issue-17019-data-skill-single-posture(claim 5621568612; build tierclaude-fable-5-1by theskills/**path mandate;mode:subagent). Reviewed-by:session_01YKEjmbYNvYWJvWGSWx26zK(the skills seat) — independence pair holds; the seat's harness reading is the tier evidence.main; first lineFixes #17019;documentation+size/s+skip-changeset(no package underpackages/**changes); one footer in AGENTS.md's PR-body form — the conflict with the dispatch wording named, not silently resolved: accepted, the standing text outranks the dispatch. Changed files read from the PR and three-dot by this seat: exactly the three declared —rules/security.md(+20/−19),SKILL.md(+17/−14),references/data-hooks.md(+5/−3); regions as claimed (:153–:181, § Seed Data & Fixtures, :622–:631); the :33 region (skills: evaluate whether the published security/platform guidance must teach the app-capability vs system-permission distinction and theisDefault→everyonebinding rule (after #17189) #17359's) untouched.f301e3ca:check-governed-merges.mjs --test⇒ 「3 of 3 path(s) hit the register」, GOVERNED (skills/**) ⇒ human terminal; ⛔ this seat never flips ready, enqueues or approves.check-clause2-carriers.mjs --pair 17476exit 0 — declaration readable in the fixed spelling, carriers agree, no widening tell.check-skills-token-ratchet.mjsexit 0 on the head — security.md 2479/2480, SKILL.md 10006/10009, data-hooks.md 9781/12611: paid in-region, ⛔ no ceiling moved.single(default)」 =tenancy-modes.mdx:30; 「the bootstrapped Default Organization only, a second refused (403)」 = mdx :138 + ADR-0131 D9 (:497); 「sub-units are business units」 = mdx :34 / ADR-0105 :153; 「walled posture (group/isolated; open core, ADR-0132)」 = ADR-0132 D1 + D4 (the open package entitles both walled postures),supportedPosturespinned['group','isolated']atopen-only-wall-acceptance.test.ts:592; 「OS_TENANCY_POSTURE=group|isolatedwith@objectstack/organizationsdeclared by the app」 = mdx :72–:77 + ADR-0132 D3; 「⛔ neversingle+ your own RLS」 = mdx :48 in intent; the pointer names ADR-0093, ADR-0105 § "Today's two postures" (:68) and the published route (content/docs/deployment/meta.json:7; URL spelling perSKILL.md:612). Every added sentence has its reader — an AI author choosing betweentenancyon an object and a posture on the deployment.single); the code comment keeps the no-default rule. ⛔ Nothing dropped without a home.3644fadc; (b) feat(organizations): bring the multi-organization runtime back to open core — the org-scoping registrar ships open, the licence gate stays in cloud (ADR-0132) #16215c677cda8and test(organizations): prove an open-only install RAISES the wall — the matrix against a resolved posture, no stub (#16137) #167195e53d73dboth merged — the open-core clause is earned; (c) After ADR-0132 the open tree still calls@objectstack/organizationsenterprise/closed-source in 65 places — includingtenancy-service.ts, the file that decides the posture #16718's fix PR docs(organizations): stop calling the open multi-org runtime enterprise/closed-source (#16718) #17371 touched noskills/file, so :623 was still stale — rewritten, not deleted (the two-axes distinction stays); (d) the three-dot list is the three files;mainmoved under the run without touchingskills/.f301e3ca: the card's re-check greps flipped exactly as the card asked (「For SaaS, settenancy」 0, 「needs cloud」 0, 「one logical tenant」 → security.md:156); dev gates 25 derived / 25 run / 0 NOT-MEASURED (--ranreconciled), the one PREREQUISITE NOT MET cleared by a build under the verify lock and re-run green; CI at this reading: 32 check runs — 15 success, 11 skipped, 6 in progress (Lint & Repo Gates, the threeType Checklegs,Test Core1/6 and 2/6).noted, not filed(accepted as noted): ADR-0132's status line still reads Proposed although the file is onmain(doc nit);tenancy-modes.mdx:35vs ADR-0131 D9 on whether the stamp is written or derived undersingle— the skill relies only on the count, on which both agree (a docs-lane card if anyone needs the stamp semantics);rules/indexing.md:77reads as intended now.needs-user-decisionon the PR; 速读终稿 on the PR; reviews requested from os-zhuang and hotlong (REST, ⛔ notupdate_pull_request— objectui#6596's incident). On MERGED: landing record here +pm:dispatched/ assignee cleared; the maintainer's [Decision] Undersingleposture, which tenant wall is the platform's? driver-sql's posture-independenttenantIdauto-scope answers a platform admin 0/0/0/0 on/datawhile the engine path, analytics and the memory driver answer 12/30/40/14 #16934 question (「是我们的 skills 或者文档没写清楚吗?」) gets its answer — yes, and now written.Generated by Claude Code
github-actions commentedon Sep 11, 2026
os-closed-card-sweep — machine-findable marker for this generated comment.
Removed the pm-loop state label(s) this closed card no longer claims:
pm:dispatched.singleposture means for the organization count in objectstack-data #17476, merged.7d350a4689, merged intomain.priority:p2,domain:skills— ownership, priority and outcome are not state claims.A state label claims work is in flight. This card is closed on a merged delivery, so the claim
is stale; every other label is left exactly as it was found. Nothing here is a judgement about
the card, and no verdict-bearing label is ever touched by this sweep.
posted by half-state-patrol run 34575760585 · trigger
scheduleGenerated by Claude Code
claude commentedon Sep 12, 2026
Landing record — PR #17476 MERGED at 2026-09-11T06:26:03Z as
7d350a46onmain,merged_byos-zhuang (a human merge on a governed surface is the review record; the four-piece placed by the previous skills seat stands as the seat's ACCEPT). Read by this seat from the PR object at 2026-09-12T00:27Z; the card closed by the PR's closing keyword at merge time.Residue cleared in this stroke: the signed-off session's assignee (
session_01YKEjmbYNvYWJvWGSWx26zK, os-litant) removed — a closed card keeps no owner;pm:dispatchedwas already absent at the 00:28Z read (priority:*+domain:skillsremain, ownership not state). Read back after the write.Skills seat, session
session_01MCLBsUgfykL74aU716rzVK(os-sales), 2026-09-12T00:36Z.Generated by Claude Code