You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Chartered by maintainer, 2026-08-27, live PM chat, verbatim and untranslated — filed by PM session session_01SVYmuhHW6qZmNBqciaS7BN under the maintainer direct-dispatch channel (standing authorization 2026-08-10):
Need: 「我现在的真实需求,就是 hotcrm 这种元数据应用,在单库多组织下能正常使用。」 and 「我想搭一个 hotcrm 的saas 服务,因为是单库,除了内核的表和字段,客户肯定不能改。要评估哪些客户应该可以改。」
Posture: isolated — 「1同意」 (hard per-tenant wall, not the group shape).
Tenant data: 「2你说的产品目录是什么?每个租户应该各自使用各自的数据吧。」 — every tenant uses its own data, product catalog included.
No tenant custom fields: 「我觉得在单库多租户的情况下,可以不考虑让租户做自定义字段」 — single-DB multi-tenant does NOT offer per-tenant fields; operator-added shared field + per-org view overlays is the sanctioned shape when a need is real.
Seeds are per-tenant reference data: 「种子也不应该是全局的呀,因为种子数据不同的客户都是要改的呀,只是参考呀,租户要自己删除呀」 — each tenant gets its own editable, deletable copy.
Dispatch: 「按照你的建议,创建卡片,并使用项目经理技能派发完成所有相关的开放」, then 「开发」, then 「发版后把 tenant_admin 那格补上创建卡片,现在跑 isolated posture 的真机 dogfood」.
Where the evidence lives. The dogfood rig's database is in the chartering session's scratch container and does not survive it. Do not go looking for it — the reproduction recipe (env vars, the three drifted auth walls, the mail-transport stand-in) is written down on objectstack-ai/cloud#1683, and the run record is the 2026-08-27 comment on this epic.
Measured platform baseline (verified on origin/main @ 15bf9e8, 2026-08-27)
NULL-org rows are global rows. The driver compiles tenantId into (organization_id = :tenant OR organization_id IS NULL) (packages/objectql/src/engine.ts:3384) — an org-less business row is visible to every tenant, not hidden.
Per-org seed replay already exists: seed-datasets / seed-replayer (packages/runtime/src/seed-datasets.ts, app-plugin.ts:979-1049) replays the registered dataset union into each newly founded organization, stamped with that org's id; the enterprise @objectstack/organizations plugin invokes it on org creation. What does NOT exist is per-family selection — the replayer always replays the full union, so selection is made at composition time.
ADR-0126 activation ledger is install-level, operator-gated in walled postures (packages/runtime/src/domains/activation-gate.ts) — correct and sufficient for the SaaS operator; per-org disable stays the §5 reserved narrow channel.
Dogfood run — isolated posture, real machine (2026-08-27), 13/13 PASS
Full run record: the 2026-08-27 comment on this card. Verified live on a walled EE boot (composed artifact, minted enterprise licence, two self-serve tenant organizations): per-tenant catalog replay (13 own-org products each, demo objects empty), cross-tenant isolation with a proven-visible sentinel, tenant /meta write refused 403, tenant flow-toggle refused 403, operator toggle accepted with the durable sys_metadata_activation install-level row retained on re-enable — the first time ADR-0126's §4/§6-wall-3 semantics were observed on a walled deployment (the #12438 D2 environment gap).
Two stand-ins were used and are recorded as such: the artifact copy had the #12497 retired keys stripped (that is #12772), and sys_user.email_verified was set in the DB in place of a mail transport (that is cloud#1683).
Cloud EE acceptance boot of HOTCRM_COMPOSITION=saas: ruled deferred (verification strategy, recorded on hotcrm#1361) until a real SaaS deployment of that shape exists. The seat that stands one up files the cloud card then.
Deliberately not chartered (recorded so silence reads as decided)
Per-tenant custom fields (refused by the ruling above).
Per-tenant/per-family seed selection (e.g. trial tenants opting into demo data) — uniform catalog-only replay until real pull.
Per-org clone of packaged flows (env-wide artifact model stands, ADR-0126 §6.1 wall).
A3 org-scoping of schedule / time-relative / api trigger contexts (ADR-0126 §9, unchanged).
Chartered by maintainer, 2026-08-27, live PM chat, verbatim and untranslated — filed by PM session
session_01SVYmuhHW6qZmNBqciaS7BNunder the maintainer direct-dispatch channel (standing authorization 2026-08-10):groupshape).🤝 HANDOVER — read this first (2026-08-28)
The chartering PM session stands down here. Everything below is written so an incoming seat needs no context from that chat.
One thing is in flight and it is the only blocker to closing this epic:
priority:p0,target:v17,domain:cli) — PR feat(metadata): versioned ADR-0087 forward conversion at the artifact-ingestion door #12843 is code-complete: head7eff896, 32/32 CI green,mergeable_state: clean, ready (not draft), not enqueued. It carriesneeds:contract-reviewon both carriers (card + PR) because the head moved after the previous PASS conclusion, and the seat that reviewed it dropped belowCONTRACT_REVIEW_TIERmid-flight (machine reading:claude-opus-5). ⇒ The incoming PM must run atclaude-fable-5, review the delta, clear both labels, then ready → merge queue. The claim is RELEASED (assignee cleared) so the incoming seat can claim it cleanly — see the handover comment on Artifacts built by released 17.x tooling are REFUSED by the 17.2 runtime: retired-key tombstones fire at artifact parse, and no artifact-ingestion door runs the ADR-0087 conversion that exists for exactly this #12772 for the exact delta and the facts already established.Where the evidence lives. The dogfood rig's database is in the chartering session's scratch container and does not survive it. Do not go looking for it — the reproduction recipe (env vars, the three drifted auth walls, the mail-transport stand-in) is written down on objectstack-ai/cloud#1683, and the run record is the 2026-08-27 comment on this epic.
Measured platform baseline (verified on
origin/main@15bf9e8, 2026-08-27)tenantIdinto(organization_id = :tenant OR organization_id IS NULL)(packages/objectql/src/engine.ts:3384) — an org-less business row is visible to every tenant, not hidden.manage_metadatawas the only metadata-authoring capability and isscope: 'platform'; tier-A org-overlay writes and env-wide tier-B creates hung off the same key. Closed by Org-scoped presentation customization authority: a tenant org admin authors tier-A overlays without platform-widemanage_metadata#12702.seed-datasets/seed-replayer(packages/runtime/src/seed-datasets.ts,app-plugin.ts:979-1049) replays the registered dataset union into each newly founded organization, stamped with that org's id; the enterprise@objectstack/organizationsplugin invokes it on org creation. What does NOT exist is per-family selection — the replayer always replays the full union, so selection is made at composition time.packages/runtime/src/domains/activation-gate.ts) — correct and sufficient for the SaaS operator; per-org disable stays the §5 reserved narrow channel.Cards — all three chartered cards LANDED
manage_metadata#12702, MERGED via PR feat(security,meta): org-scoped presentation authoring capability for tenant org admins #12705. Newmanage_org_presentation(scope: 'org'); one shared registry-derived verdict (metaWriteCapabilityVerdict,@objectstack/metadata-core) run by all five/metaitem write doors on both transports; admits onlyallowOrgOverridetypes scoped to the caller's own active organization. Contract-review PASS at tier.HOTCRM_COMPOSITION=saas: catalog-only tenant replay,demo_bootstrapexcluded (measured: under the wall itsrunAs: 'system'sweep writes one tenant's user id onto another tenant's rows),tenant_adminprofile replacingsystem_admin. Community/default composition behaviorally unchanged.Dogfood run — isolated posture, real machine (2026-08-27), 13/13 PASS
Full run record: the 2026-08-27 comment on this card. Verified live on a walled EE boot (composed artifact, minted enterprise licence, two self-serve tenant organizations): per-tenant catalog replay (13 own-org products each, demo objects empty), cross-tenant isolation with a proven-visible sentinel, tenant
/metawrite refused 403, tenant flow-toggle refused 403, operator toggle accepted with the durablesys_metadata_activationinstall-level row retained on re-enable — the first time ADR-0126's §4/§6-wall-3 semantics were observed on a walled deployment (the #12438 D2 environment gap).Two stand-ins were used and are recorded as such: the artifact copy had the #12497 retired keys stripped (that is #12772), and
sys_user.email_verifiedwas set in the DB in place of a mail transport (that is cloud#1683).Findings the dogfood produced
pm:dispatched, PR #12843 green and awaiting the tier-gated review (see HANDOVER)crm_contracttenant-column false negative fail-closes a hierarchy scopefinding, awaiting first-touch gradingfinding, awaiting gradingcreate_recordnodes onlyfinding, awaiting that laneFollow-ups (carded, unlock conditions written down)
manage_org_presentationtotenant_adminonce the capability ships in a released @objectstack line hotcrm#1369 (pm:on-hold): grantmanage_org_presentationtotenant_admin.Restart-when:is executable — the capability must be present in a released@objectstack/specthat hotcrm can install (hotcrm tracks released versions, never git pins). Releases are a human act; this card wakes on one, it never asks for one.pm:blocked,Blocked-by:Artifacts built by released 17.x tooling are REFUSED by the 17.2 runtime: retired-key tombstones fire at artifact parse, and no artifact-ingestion door runs the ADR-0087 conversion that exists for exactly this #12772): the composed-artifact door (OS_COMPOSED_ARTIFACT_URL) must consume the same versioned conversion policy — it was deliberately landed in@objectstack/metadata-core(spec-only dependency) so that door can call it rather than reimplement. Unblocks the moment Artifacts built by released 17.x tooling are REFUSED by the 17.2 runtime: retired-key tombstones fire at artifact parse, and no artifact-ingestion door runs the ADR-0087 conversion that exists for exactly this #12772's PR merges (cloud consumes the framework via workspace links, so merged = installable there; no release wait).HOTCRM_COMPOSITION=saas: ruled deferred (verification strategy, recorded on hotcrm#1361) until a real SaaS deployment of that shape exists. The seat that stands one up files the cloud card then.Deliberately not chartered (recorded so silence reads as decided)