Skip to content

[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

Closed

Description

@huangyiirene

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 (on main since 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 「single is not "multi-org with the walls left standing"」; lines 138–140 「creating additional organizations is refused (403) whenever the effective posture is single」.
  • 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 single the 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:

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

  1. os-litant commented on Sep 10, 2026

    @os-litant
    Contributor

    Triage: routing only — domain:skills. ⛔ No grading, no priority, no pm:* state, and that is deliberate.

    SKILL.md: skills 车道 finding 由该席自分诊,全仓轮跳过. ⇒ the whole-repo triage round routes a skills-lane finding and stops; the domain:skills seat grades its own. domain:* is triage's sole product, so this round supplies that and nothing else — the finding label stays on, awaiting that seat's first grading.

    Landing surface

    skills/objectstack-data — the published skills catalog, governed, and shipped to customers.

    ⚠️ Raised in answer to the maintainer's own question on #16934 — 「ats 为什么会搞错,是我们的 skills 或者文档没写清楚吗?」 — and the answer measured here is yes: the published skill never says what single posture means for the organization count, so an AI app author reading it (plus the code's exemption list) lands on 「stay single, seed one sys_organization per tenant, bring your own RLS wall」. The sentence forbidding that shape lives only in content/docs/deployment/tenancy-modes.mdx and 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

  2. os-litant commented on Sep 10, 2026

    @os-litant
    Contributor

    Triage (skills-lane finding self-triage — the lane's standing exception, SKILL.md :380; routed domain:skills by 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 on origin/main fd62a66b: skills/objectstack-data/rules/security.md:155 still says 「For SaaS, set tenancy on the object schema」 with no posture sentence; references/data-hooks.md:623 still says 「multi-org needs cloud」; git grep -ciE 'one logical tenant|Default Organization' -- skills/ = 0 (control: the same grep over content/docs/deployment/ hits). finding dropped; 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 as sys_organization rows under single, hand-rolled RLS, walls 「stood up later」) is the shape tenancy-modes.mdx:48 forbids 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 in rules/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 under SKILL.md §「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 data-hooks.md:623 re-read against ADR-0132. Reader of each line: an AI author choosing between tenancy on 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.md is 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, session session_01YKEjmbYNvYWJvWGSWx26zK, 2026-09-10T15:51Z.


    Generated by Claude Code

  3. added theissue type on Sep 10, 2026
  4. os-litant commented on Sep 10, 2026

    @os-litant
    Contributor

    Claim: PM loop round 1
    Session: session_01YKEjmbYNvYWJvWGSWx26zK (GitHub os-litant, skills seat), claimed at 2026-09-10T15:56Z
    Branch: claude/issue-17019-data-skill-single-posture
    Worktree: objectstack-issue-17019
    Domain: domain:skills (published skill skills/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 — not content/docs/**, not the runtime, not rules/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 --tier on the three paths prints MANDATORY (the skills/** 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.md is #17359's deliverable-2 site at a different region (+3 lines after :33; blocked on #17189, not in flight) — region-disjoint; no open PR touches skills/objectstack-data/**; skills/** is regenerated by gen:skill-refs on 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

  5. self-assigned this
    on Sep 10, 2026
  6. os-litant commented on Sep 10, 2026

    @os-litant
    Contributor

    Dispatched — R1 wave 5 (first slot), 2026-09-10T15:57Z, mode:subagent, build tier claude-fable-5-1 (path mandate: the skills/** glob, derived by --tier), skills-seat review at the contract-review tier. Claim 5621568612 is the dev's identity; branch claude/issue-17019-data-skill-single-posture, cut from fd62a66b. Readings carried: the three sentences on fd62a66b that 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」 under skills/; 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

  7. os-litant commented on Sep 10, 2026

    @os-litant
    Contributor

    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

  8. os-litant commented on Sep 10, 2026

    @os-litant
    Contributor

    ACCEPT — PR #17476 (head f301e3ca) reviewed in-seat at the contract-review tier (skills seat, session session_01YKEjmbYNvYWJvWGSWx26zK, 2026-09-10T16:28Z).

    • Implemented-by: os-dev subagent on claude/issue-17019-data-skill-single-posture (claim 5621568612; build tier claude-fable-5-1 by the skills/** path mandate; mode:subagent). Reviewed-by: session_01YKEjmbYNvYWJvWGSWx26zK (the skills seat) — independence pair holds; the seat's harness reading is the tier evidence.
    • PR shape: draft; base main; first line Fixes #17019; documentation + size/s + skip-changeset (no package under packages/** 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 the isDefault → everyone binding rule (after #17189) #17359's) untouched.
    • Path face by this seat on a detached worktree at 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 17476 exit 0 — declaration readable in the fixed spelling, carriers agree, no widening tell. check-skills-token-ratchet.mjs exit 0 on the head — security.md 2479/2480, SKILL.md 10006/10009, data-hooks.md 9781/12611: paid in-region, ⛔ no ceiling moved.
    • The contract, read sentence by sentence against its sources (the review this tier exists for): 「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), supportedPostures pinned ['group','isolated'] at open-only-wall-acceptance.test.ts:592; 「OS_TENANCY_POSTURE=group|isolated with @objectstack/organizations declared by the app」 = mdx :72–:77 + ADR-0132 D3; 「⛔ never single + 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 per SKILL.md:612). Every added sentence has its reader — an AI author choosing between tenancy on an object and a posture on the deployment.
    • Density payment audited bullet by bullet (砍点逐条核幸存): the removed 「Database-per-tenant isolation is not object metadata」 bullet survives as the 「environment / database-per-tenant isolation」 clause of the data-hooks blockquote this PR edits; 「at compile time」 folds into 「type-safe」; 「which is not a seed factory」 folds into 「the unrelated ADR-0021 analytics semantic layer」; the visibility-posture bullet keeps every fact (the filter, AND-composed ahead of business RLS, null/absent denied, the list renders empty, inert under single); the code comment keeps the no-default rule. ⛔ Nothing dropped without a home.
    • Deviations accepted as declared: the pointer lives in the Multi-tenancy paragraph, not appended to :210 — that line is ADR-0066's visibility posture, a different sense of the word, and appending would conflate the two for this exact reader (the 防错 axis decides; correct); the :629–:630 sentence in the same blockquote rewritten (same stale-edition defect, in-place-fix conditions stated in the PR); the docs pointer as the published URL. Zone 2: (a) held on 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) #16215 c677cda8 and test(organizations): prove an open-only install RAISES the wall — the matrix against a resolved posture, no stub (#16137) #16719 5e53d73d both merged — the open-core clause is earned; (c) After ADR-0132 the open tree still calls @objectstack/organizations enterprise/closed-source in 65 places — including tenancy-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 no skills/ file, so :623 was still stale — rewritten, not deleted (the two-axes distinction stays); (d) the three-dot list is the three files; main moved under the run without touching skills/.
    • Verified by this seat at f301e3ca: the card's re-check greps flipped exactly as the card asked (「For SaaS, set tenancy」 0, 「needs cloud」 0, 「one logical tenant」 → security.md:156); dev gates 25 derived / 25 run / 0 NOT-MEASURED (--ran reconciled), 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 three Type Check legs, Test Core 1/6 and 2/6).
    • noted, not filed (accepted as noted): ADR-0132's status line still reads Proposed although the file is on main (doc nit); tenancy-modes.mdx:35 vs ADR-0131 D9 on whether the stamp is written or derived under single — the skill relies only on the count, on which both agree (a docs-lane card if anyone needs the stamp semantics); rules/indexing.md:77 reads as intended now.
    • Terminal: governed four-piece — this ACCEPT; the PR stays draft; needs-user-decision on the PR; 速读终稿 on the PR; reviews requested from os-zhuang and hotlong (REST, ⛔ not update_pull_request — objectui#6596's incident). On MERGED: landing record here + pm:dispatched / assignee cleared; the maintainer's [Decision] Under single posture, which tenant wall is the platform's? driver-sql's posture-independent tenantId auto-scope answers a platform admin 0/0/0/0 on /data while 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

  9. github-actions commented on Sep 11, 2026

    @github-actions
    Contributor

    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.

    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 schedule

    Generated by Claude Code

  10. claude commented on Sep 12, 2026

    @claude
    Contributor

    Landing record — PR #17476 MERGED at 2026-09-11T06:26:03Z as 7d350a46 on main, merged_by os-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:dispatched was already absent at the 00:28Z read (priority:* + domain:skills remain, ownership not state). Read back after the write.

    Skills seat, session session_01MCLBsUgfykL74aU716rzVK (os-sales), 2026-09-12T00:36Z.


    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

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions