Repository navigation
Description
Escalated from #70 per triage's clause on that card: "⛔ The why.mdx fit-scenario row is a positioning claim — do NOT decide it in this PR; FLAG it back to triage for the decision inbox if simple deletion feels lossy." It does feel lossy. This is the flag.
What was removed, and why it could not simply be corrected
content/docs/why.mdx carried this row in "Common scenarios where it's a fit":
| Multi-tenant internal portal (one runtime, many small apps) | Per-project kernel + LRU cache designed for this |
Both cells are dead, but for different reasons, and that is the whole problem:
- The right cell names a mechanism that does not exist for a self-hosted deployment.
architecture.mdxnow says a deployment serves one app and that "there is no cache sizing to get right"; onobjectstack@origin/main, multi-kernel routing engages only when the host registers aKernelResolver, whose "strategy lives in the cloud distribution" (packages/runtime/src/http-dispatcher.ts). That half is a factual defect and PR docs: retire the multi-Environment runtime model from six pages outside Deploy #86 removed the row on those grounds. - The left cell is a positioning claim, and the scenario it names did not die with the mechanism. A walled multi-organization deployment is real, shipped and licensed:
OS_TENANCY_POSTUREwith the valuesisolatedandgroupputs up a per-organization isolation wall, andreference/environment-variables.mdxdocuments the two further decisions it forces.
So the honest state is "the fit may well survive under a different mechanism", and writing that down means deciding how the product is sold — which is the decision this card asks for, not something a docs PR should transcribe.
The decision
Which of these is true of ObjectOS today?
A. The scenario is still a fit, under the walled tenancy posture. Restore a row along the lines of "Multi-tenant internal portal (several organizations, one deployment) — walled tenancy posture, per-organization isolation enforced in the runtime". Requires a product answer to a question the docs cannot settle: this is a licensed capability appearing on the page that pitches the open-source-runtime story, and the row would sit next to five rows that need no licence. Also note what it does not buy — the organizations share one database and one metadata set, so a customer expecting schema isolation is still disappointed, just later.
B. The scenario changed shape and should be re-worded, not restored. "One runtime, many small apps" is exactly what architecture.mdx now rules out; the surviving shape is one app, many organizations. If the portal being pitched was really "many small apps", the fit genuinely is gone and the row should stay deleted — but the page should probably say so somewhere rather than going quiet, since the pitch previously made this promise.
C. Leave it deleted, silently. Cheapest. Costs a stated fit for a capability the product does sell, on the page whose entire job is telling a reader whether ObjectOS suits them.
Recommendation
A, with the licensing caveat stated in the row itself. The capability exists, is sold, and this page's stated purpose is "the honest pitch — when you should use it, when you shouldn't". Dropping a real fit because its old justification was wrong makes the page less honest, not more. But the row must not repeat the original's mistake of naming a mechanism as if it were free: whatever it says should make the licence and the shared-database limit visible, so a reader who picks ObjectOS for this reason is not surprised twice.
That said — this is a positioning judgement about how a commercial capability appears on the pitch page, and the recommendation above is a docs-side reading of the evidence, not a product decision. Needs the maintainer.
Blocked-by: nothing. PR #86 is safe to merge first; restoring a row afterwards is a one-line change.
Generated by Claude Code
Activity
os-warren commentedon Aug 19, 2026
Triage: standard facet block backfill (decision-inbox duty; the card predates the block standard on this repo). Assigned
os-zhuangper the 2026-08-19 notification-handover ruling (inbox routing, not a claim).<!-- os-decision-facets -->
① platform long-term coherence: A keeps the pitch page aligned with a shipped, licensed capability (walled tenancy via
OS_TENANCY_POSTURE) without naming a dead mechanism; B is coherent only if the "many small apps" pitch is judged genuinely gone; C leaves the page silently narrower than the product.② measured business pull: the capability is real, shipped and licensed (
isolated/grouppostures documented inreference/environment-variables.mdx); the page's stated job is fit guidance, and a deleted row on the page that decides adoption is a real loss channel.③ AI-agent error-resistance: prose either way; the guard is A's requirement that the row itself carries the licence + shared-database caveats, so no future docs-writing agent re-derives the dead per-project-kernel claim.
④ startup scope discipline: A is one table row; B one paragraph; C free but silently under-sells shipped capability. No engineering in any branch.
Recommendation: A — restore the row re-worded for the walled-tenancy shape, licence caveat visible in the row itself (matches the card's own recommendation).
Confidence gap: this is a positioning judgement about how a commercial/licensed capability appears on the open-source pitch page — commercial strategy is invisible to this analysis.
Generated by Claude Code
os-zhuang commentedon Aug 20, 2026
Maintainer ruling recorded (2026-08-20, live decision-inbox session with the triage seat, session
session_01PjAP6vbcsg2yMtvySPv1Qo)Ruled: A — restore the multi-tenant internal portal row, with the licensing caveat stated in the row itself. Provenance: maintainer accepted the batch, verbatim: 「其他接受你的建议。」The capability is real and sold (walled tenancy posture, per-organization isolation in the runtime); dropping a true fit because its old justification (per-project kernels) died makes the pitch page less honest. The restored row must not repeat the original's mistake: it names the walled posture as the mechanism, and makes the Enterprise licence and the shared-database boundary visible, so a reader choosing ObjectOS for this reason is not surprised twice.
State transition in the same stroke:
needs-user-decision→pm:queue.Generated by Claude Code
os-project-manager commentedon Aug 22, 2026
Claim: PM loop round 1
Session:
session_01V8AcCw8C1feB7b5kiaJd7bBranch:
claude/issue-90-why-multitenant-rowWorktree:
objectos-issue-90Domain:
repo:objectos(nodomain:*in this repo — sister-repo execution seat)File surface:
content/docs/why.mdx(the "Common scenarios where it's a fit" table only) (stop on breach; explain in the report)Container & model:
S,mode:subagent,model: opus— tier fromnode scripts/pm/dispatch-gates.mjs --tier content/docs/why.mdx: "no path-derived mandate: the surface hits none of the 3 declared glob(s) … the tier stays the PM's per-card judgment call". Judgedopusrather than thesonnetfloor: the ruling fixes which row to restore, not its wording, and the row must carry a licence + shared-database caveat without over- or under-claiming — that is positioning prose, not a mechanical edit.Clause-②: no
Serial constraints cleared:
none—content/docs/why.mdxcarries no other queued or in-flight card. Checked against the whole-lane read at round open and against the seat's hot-file serial queue (objectstack#9831 §4): the three files under contention this round arebuild/automation/approvals.mdx(#102→#131, serialised), the four Node-floor declaration files (#137+#138, folded) andconfigure/notifications.mdx(#132).why.mdxis on none of them.Premise re-verified on
origin/mainat514527b, not quoted forward from the card: the fit table is present with five rows and the multi-tenant row is absent — PR #86's deletion stands, so this is a restore and not an edit.Generated by Claude Code
docs(why): restore the multi-tenant internal portal fit row under the…
os-project-manager commentedon Aug 22, 2026
ACCEPT — PR #145
Reviewer of record:
repo:objectosPM seat (objectstack#9831), sessionsession_01V8AcCw8C1feB7b5kiaJd7b, round 1. Reviewed against GitHub andorigin/main, not against the dev's report.Form. Draft · base
mainatc6594ba(current head, not a stale base) · body first lineFixes #90· 1 file, +1/-0 · no changeset, correct for this repo · no locale siblings touched.Scope. The diff is exactly one table row, inserted in the original slot (after the air-gapped row). Nothing else in
why.mdxmoved. Path surface iscontent/docs/why.mdxalone — no governed surface touched, so this takes the ready → merge path rather than the human-merge fork.Spot-checks — every factual claim in the restored cell re-measured on
origin/mainrather than taken from the report:resources/license.mdx:70-71"ObjectOS Enterprise — … multi-organization self-host";:44editions row checked in the Enterprise column onlydeploy/air-gapped.mdx:17— the corpus's existing idiom, reused rather than inventedisolated/group, licence-gatedreference/environment-variables.mdx— "The walled values areisolatedandgroup. A walled posture requires a licence"resources/glossary.mdx(Tenant) — "share the deployment's app, its database and its metadata, so the wall separates their data and memberships rather than their schema"The link target
/docs/resources/licenseresolves to a real page and matches the spellingair-gapped.mdxalready uses.On the falsifiable assumption. The dispatch flagged "Enterprise licence" as a PM assumption I had not verified, with instructions to stop and report a fork if it turned out not to be licence-gated. The dev measured it and the assumption survived — with the tier's exact product name recovered from
license.mdxrather than approximated. That is the assumption doing its job: it was checked, not inherited.Deviations: none. File surface respected; the ruling's three required facts (walled-posture mechanism, licence, shared-database boundary) are all visible in the row; the dead per-project-kernel/LRU claim is not reintroduced.
Out-of-scope finding filed correctly: #144 — unassigned,
finding, back-linked, evidence at514527b, and it states the case for leaving it alone alongside the case for changing it. Recorded, not acted on, which is the right call for a positioning cell. It is a decision-shaped card, not a queue-shaped one; grading is triage's first touch, not this seat's.Release held until
buildreports green on the head commit —Node floorandOwnership & freshnessare already green;buildwas stillin_progressat review time, which is an honest reading, not a pass.Generated by Claude Code
docs(why): restore the multi-tenant internal portal fit row under the…
os-project-manager commentedon Aug 22, 2026
{ "issue": 90, "status": "done", "branch": "claude/issue-90-why-multitenant-row", "pr": "https://github.com/objectstack-ai/objectos/pull/145", "premise_still_valid": true, "files_changed": ["content/docs/why.mdx"], "summary": "Restored one row to the 'Common scenarios where it's a fit' table in content/docs/why.mdx per the 2026-08-20 ruling (option A), in its original slot (5th of 6). The row names the walled tenancy posture as the mechanism (per-organization isolation enforced inside the runtime), the ObjectOS Enterprise licence with a link to License & Pricing, and the shared-database/shared-metadata boundary; it does not name the per-project kernel or the LRU cache. One line, one file, English only, no locale siblings touched, no changeset (this repo has no changeset flow).", "issue_body_sanitizer_check": "Not truncated. Body read twice through independent paths (issue_read get, and the search_issues payload) and both end at the '_Generated by [Claude Code](.../session_01CJPxtTxoxTUnjNdTbiEaRa)_' footer with the Blocked-by and Related lines intact. Nothing cut.", "pm_assumptions_measured": { "OS_TENANCY_POSTURE_isolated_group": "CONFIRMED, unmoved on both sides. objectos content/docs/reference/environment-variables.mdx:69 documents it with the walled values `isolated` and `group`. objectstack@origin/main content/docs/deployment/tenancy-modes.mdx carries the same three-posture spectrum single(default)/group/isolated as the authorization kernel's Layer 0 wall. No rename, no value drift.", "licence_tier_name": "CONFIRMED licence-gated, and the product's own tier name is 'ObjectOS Enterprise' — no fork needed, no name invented. Evidence: resources/license.mdx:44 editions table row 'Clustering / HA, multi-org self-host, air-gap, SCIM' is checked in the Enterprise column ONLY; resources/license.mdx:71 'ObjectOS Enterprise — ... multi-organization self-host'; reference/environment-variables.mdx:69 'A walled posture requires a licence: without one the runtime exits at startup'. Row phrasing matches the corpus's existing idiom for gated capabilities (deploy/air-gapped.mdx:17, deploy/docker.mdx:149, deploy/kubernetes.mdx:71 all use 'is an Enterprise capability — see [License & Pricing](/docs/resources/license)').", "shared_database_and_metadata": "CONFIRMED by three independent places. resources/glossary.mdx (Tenant): 'Those organizations still share the deployment's app, its database and its metadata, so the wall separates their data and memberships rather than their schema.' resources/faq.mdx:48-59: same, plus the escape hatch 'a customer that must have its own database gets its own deployment'. reference/environment-variables.mdx (OS_AI_STUDIO_AGENTS): 'metadata is scoped to the deployment, not to an organization'.", "table_is_two_column": "CONFIRMED. Header is `| Scenario | Why it works |`, five rows on origin/main. Restored row fits with no third column. Removal commit identified: acc5b6a (PR #86), a one-line deletion of exactly this row from exactly this table — so this is a restore, not an edit." }, "tests": "Full gate union re-run AFTER the final commit, at sha c44bccc (git rev-parse --short HEAD captured inside the same locked run; worktree reported 0 modified paths, changed set = content/docs/why.mdx). All heavy steps ran through bash /home/user/objectstack/scripts/pm/os-verify-lock.sh (VERDICT command-exit 0 · held the lock 58s · waited 0s). turbo run with --force so no result is a cache replay. Exit codes captured by redirect-then-$? (never through a pipe); verdict lines quoted are the gates' own. RESULTS: `pnpm install --frozen-lockfile` -> 'Done in 2.9s'. `pnpm turbo run type-check --continue` -> '✓ Types generated successfully' / 'Tasks: 1 successful, 1 total' / 'Cached: 0 cached, 1 total'. `pnpm turbo run build` -> '✓ Compiled successfully in 32.5s' / '✓ Generating static pages using 3 workers (740/740) in 7.3s' / 'Cached: 0 cached, 1 total'. `pnpm turbo run test` -> '✓ 2 self-test(s) passed' / 'Tasks: 1 successful, 1 total'. `node .github/scripts/check-node-floor.mjs --self-test` -> '✓ self-test: 14 rule case(s) and 18 range case(s) — every rule demonstrated able to fail'. `node .github/scripts/check-node-floor.mjs` -> 'ℹ️ 1 note(s), reported and not blocking' (pre-existing 'ungoverned' note on tools/ci-scripts, untouched by this diff). `node .github/scripts/check-translation-ownership.mjs --actor os-project-manager --files changed.txt` -> 'This PR touches 0 translation artifact(s) and 1 other file(s)'. `node .github/scripts/check-translations.mjs` -> '✓ translations gate passed' (the six why.* siblings listed as stale = non-blocking by design). `node .github/scripts/check-translation-output.mjs --self-test` -> '✓ self-test: 29 rule case(s) and 9 split case(s)'. `node .github/scripts/check-translation-output.mjs --files changed.txt` -> '✓ translation output gate passed (138 pre-existing finding(s) reported)'. RENDER CHECK (not inferred): apps/docs/.next/server/app/en/docs/why.html contains the row as a real table row between the air-gapped row and the vibe-code row, licence anchor href resolving to /docs/resources/license. No ablation in this task — a one-line docs addition has no guard to mutate.", "gates_run": { "pnpm install --frozen-lockfile": "pass", "pnpm turbo run type-check --continue": "pass", "pnpm turbo run build": "pass", "pnpm turbo run test": "pass", "check-node-floor.mjs --self-test": "pass", "check-node-floor.mjs": "pass (1 non-blocking pre-existing note)", "check-translation-ownership.mjs": "pass", "check-translations.mjs": "pass", "check-translation-output.mjs --self-test": "pass", "check-translation-output.mjs --files": "pass (138 pre-existing findings reported, none in the changed file)" }, "ci_status": "in_progress — reported at draft-PR time per the 2026-08-10 ruling; CI convergence is the PM's read, not mine.", "deviations": [ "GATE LIST WIDENED, not narrowed. The dispatch named five gates; I re-derived from .github/workflows/ci.yml and translations.yml and added five more invocations that run on every PR and that the dispatch list did not carry: check-node-floor.mjs (self-test + check, the ci.yml `node-floor` job) and check-translation-ownership.mjs + check-translation-output.mjs (self-test + --files, two further steps of the translations.yml `Ownership & freshness` job). All ten green. No local check was narrowed or skipped.", "PM ASSUMPTION REFINED (does not change the ruled shape). objectstack@origin/main content/docs/deployment/tenancy-modes.mdx states BOTH walled postures — group as well as isolated — require the enterprise @objectstack/organizations runtime to activate, and that 'enabling a multi-organization posture is a commercial capability (ADR-0105 D12)'. An older objectstack CHANGELOG line frames `group` as 'enforced by the open engine', which would have suggested group is un-licensed; the current doc supersedes it (the wall's IMPLEMENTATION is open, its ACTIVATION is commercial). The row's single unqualified licence caveat is therefore correct for both walled values.", "BASE MOVED AFTER THE LOCAL UNION. Local gates ran at c44bccc, branched from 514527b. origin/main has since advanced to c6594ba (two dependency bumps: #47 react/@types/react, #58 actions/setup-node). content/docs/why.mdx is untouched between 514527b and c6594ba, and `git merge-tree` on the merge-base reports 0 conflict markers. CI runs the union on the merge; that half is the PM's read.", "MEASUREMENT-HYGIENE NOTE. The dispatch's corpus-sweep warning generalizes: on objectstack, `git grep <rev> -- 'packages/**/src'` returned zero for a term that is present, and the control probe (a symbol known to exist) also returned zero, exposing the pathspec — not the corpus — as the fault. Every zero result quoted above was control-probed before being believed; the 'no existing issue' result behind the finding below was control-probed with a query that returns #90 itself." ], "open_questions": [], "out_of_scope_findings": [ "filed as #144 (label `finding`, unassigned, no pm:queue): why.mdx's 'vs. rolling your own' comparison table still sells multi-tenancy as an unqualified 'Built in', with no licence or shared-schema caveat — the same two facts the restored fit row now carries. Out of this card's ruled scope (the fit table) and not a mechanical fix, so recorded, not touched." ] }Generated by Claude Code
os-project-manager commentedon Aug 22, 2026
os-dev-report
Marker repair. The previous comment (
#issuecomment-5380754291) carried the report with the standard HTML-comment marker as its first line. Read-back shows the sanitizer ate the marker outright — the stored body now begins\n\n```json, so that comment is invisible to a marker scan. Per the standing fallback this comment re-delivers the identical report leading with the marker as literal text, and supersedes it. (Same sanitizer also ate an angle-bracketedREVplaceholder inside one deviation string; spelled out here.) No comment-edit tool is exposed on this seat, so replacement was the only route — the superseded comment is left in place rather than removed.{ "issue": 90, "status": "done", "branch": "claude/issue-90-why-multitenant-row", "pr": "https://github.com/objectstack-ai/objectos/pull/145", "premise_still_valid": true, "files_changed": ["content/docs/why.mdx"], "summary": "Restored one row to the 'Common scenarios where it's a fit' table in content/docs/why.mdx per the 2026-08-20 ruling (option A), in its original slot (5th of 6). The row names the walled tenancy posture as the mechanism (per-organization isolation enforced inside the runtime), the ObjectOS Enterprise licence with a link to License & Pricing, and the shared-database/shared-metadata boundary; it does not name the per-project kernel or the LRU cache. One line, one file, English only, no locale siblings touched, no changeset (this repo has no changeset flow).", "issue_body_sanitizer_check": "Issue #90 body: NOT truncated. Read twice through independent paths (issue_read get, and the search_issues payload); both end at the '_Generated by [Claude Code](.../session_01CJPxtTxoxTUnjNdTbiEaRa)_' footer with the Blocked-by and Related lines intact. Nothing cut. Separately, the sanitizer DID eat the HTML-comment report marker on my first report comment — see the marker-repair note above.", "pm_assumptions_measured": { "OS_TENANCY_POSTURE_isolated_group": "CONFIRMED, unmoved on both sides. objectos content/docs/reference/environment-variables.mdx:69 documents it with the walled values `isolated` and `group`. objectstack@origin/main content/docs/deployment/tenancy-modes.mdx carries the same three-posture spectrum single(default)/group/isolated as the authorization kernel's Layer 0 wall. No rename, no value drift.", "licence_tier_name": "CONFIRMED licence-gated, and the product's own tier name is 'ObjectOS Enterprise' — no fork needed, no name invented. Evidence: resources/license.mdx:44 editions table row 'Clustering / HA, multi-org self-host, air-gap, SCIM' is checked in the Enterprise column ONLY; resources/license.mdx:71 'ObjectOS Enterprise — ... multi-organization self-host'; reference/environment-variables.mdx:69 'A walled posture requires a licence: without one the runtime exits at startup'. Row phrasing matches the corpus's existing idiom for gated capabilities (deploy/air-gapped.mdx:17, deploy/docker.mdx:149, deploy/kubernetes.mdx:71 all use 'is an Enterprise capability — see [License & Pricing](/docs/resources/license)').", "shared_database_and_metadata": "CONFIRMED by three independent places. resources/glossary.mdx (Tenant): 'Those organizations still share the deployment's app, its database and its metadata, so the wall separates their data and memberships rather than their schema.' resources/faq.mdx:48-59: same, plus the escape hatch 'a customer that must have its own database gets its own deployment'. reference/environment-variables.mdx (OS_AI_STUDIO_AGENTS): 'metadata is scoped to the deployment, not to an organization'.", "table_is_two_column": "CONFIRMED. Header is `| Scenario | Why it works |`, five rows on origin/main. Restored row fits with no third column. Removal commit identified: acc5b6a (PR #86), a one-line deletion of exactly this row from exactly this table — so this is a restore, not an edit." }, "tests": "Full gate union re-run AFTER the final commit, at sha c44bccc (git rev-parse --short HEAD captured inside the same locked run; worktree reported 0 modified paths, changed set = content/docs/why.mdx). All heavy steps ran through bash /home/user/objectstack/scripts/pm/os-verify-lock.sh (VERDICT command-exit 0 · held the lock 58s · waited 0s). turbo run with --force so no result is a cache replay. Exit codes captured by redirect-then-$? (never through a pipe); verdict lines quoted are the gates' own. RESULTS: `pnpm install --frozen-lockfile` -> 'Done in 2.9s'. `pnpm turbo run type-check --continue` -> 'Types generated successfully' / 'Tasks: 1 successful, 1 total' / 'Cached: 0 cached, 1 total'. `pnpm turbo run build` -> 'Compiled successfully in 32.5s' / 'Generating static pages using 3 workers (740/740) in 7.3s' / 'Cached: 0 cached, 1 total'. `pnpm turbo run test` -> '2 self-test(s) passed' / 'Tasks: 1 successful, 1 total'. `node .github/scripts/check-node-floor.mjs --self-test` -> 'self-test: 14 rule case(s) and 18 range case(s) — every rule demonstrated able to fail'. `node .github/scripts/check-node-floor.mjs` -> '1 note(s), reported and not blocking' (pre-existing 'ungoverned' note on tools/ci-scripts, untouched by this diff). `node .github/scripts/check-translation-ownership.mjs --actor os-project-manager --files changed.txt` -> 'This PR touches 0 translation artifact(s) and 1 other file(s)'. `node .github/scripts/check-translations.mjs` -> 'translations gate passed' (the six why.* siblings listed as stale = non-blocking by design). `node .github/scripts/check-translation-output.mjs --self-test` -> 'self-test: 29 rule case(s) and 9 split case(s)'. `node .github/scripts/check-translation-output.mjs --files changed.txt` -> 'translation output gate passed (138 pre-existing finding(s) reported)'. RENDER CHECK (not inferred): apps/docs/.next/server/app/en/docs/why.html contains the row as a real table row between the air-gapped row and the vibe-code row, licence anchor href resolving to /docs/resources/license. No ablation in this task — a one-line docs addition has no guard to mutate.", "gates_run": { "pnpm install --frozen-lockfile": "pass", "pnpm turbo run type-check --continue": "pass", "pnpm turbo run build": "pass", "pnpm turbo run test": "pass", "check-node-floor.mjs --self-test": "pass", "check-node-floor.mjs": "pass (1 non-blocking pre-existing note)", "check-translation-ownership.mjs": "pass", "check-translations.mjs": "pass", "check-translation-output.mjs --self-test": "pass", "check-translation-output.mjs --files": "pass (138 pre-existing findings reported, none in the changed file)" }, "ci_status": "in_progress — reported at draft-PR time per the 2026-08-10 ruling; CI convergence is the PM's read, not mine.", "deviations": [ "GATE LIST WIDENED, not narrowed. The dispatch named five gates; I re-derived from .github/workflows/ci.yml and translations.yml and added five more invocations that run on every PR and that the dispatch list did not carry: check-node-floor.mjs (self-test + check, the ci.yml `node-floor` job) and check-translation-ownership.mjs + check-translation-output.mjs (self-test + --files, two further steps of the translations.yml `Ownership & freshness` job). All ten green. No local check was narrowed or skipped.", "PM ASSUMPTION REFINED (does not change the ruled shape). objectstack@origin/main content/docs/deployment/tenancy-modes.mdx states BOTH walled postures — group as well as isolated — require the enterprise @objectstack/organizations runtime to activate, and that 'enabling a multi-organization posture is a commercial capability (ADR-0105 D12)'. An older objectstack CHANGELOG line frames `group` as 'enforced by the open engine', which would have suggested group is un-licensed; the current doc supersedes it (the wall's IMPLEMENTATION is open, its ACTIVATION is commercial). The row's single unqualified licence caveat is therefore correct for both walled values.", "BASE MOVED AFTER THE LOCAL UNION. Local gates ran at c44bccc, branched from 514527b. origin/main has since advanced to c6594ba (two dependency bumps: #47 react/@types/react, #58 actions/setup-node). content/docs/why.mdx is untouched between 514527b and c6594ba, and `git merge-tree` on the merge-base reports 0 conflict markers. CI runs the union on the merge; that half is the PM's read.", "MEASUREMENT-HYGIENE NOTE. The dispatch's corpus-sweep warning generalizes: on objectstack, `git grep REV -- 'packages/**/src'` (REV = a rev name, angle brackets omitted so the sanitizer does not eat it) returned zero for a term that is present, and the control probe (a symbol known to exist) also returned zero, exposing the pathspec — not the corpus — as the fault. Every zero result quoted above was control-probed before being believed; the 'no existing issue' result behind the finding below was control-probed with a query that returns #90 itself.", "REPORT DELIVERY. First report comment lost its HTML-comment marker to the GitHub body sanitizer; this comment re-delivers it leading with literal text. No comment-edit tool on this seat, so the superseded comment remains in place." ], "open_questions": [], "out_of_scope_findings": [ "filed as #144 (label `finding`, unassigned, no pm:queue): why.mdx's 'vs. rolling your own' comparison table still sells multi-tenancy as an unqualified 'Built in', with no licence or shared-schema caveat — the same two facts the restored fit row now carries. Out of this card's ruled scope (the fit table) and not a mechanical fix, so recorded, not touched." ] }Generated by Claude Code