Repository navigation
Description
Filing gate ③ (maintainer-directed). The maintainer in this session, 2026-10-27, verbatim: 「Company Core 共享本体放 objectstack 单仓。创建 issue 决策卡」 and 「你应该使用 pm-dispatch 技能创建issue」. The card records the options the maintainer's wording leans against, with premises and re-checks, so the ruling exists once on the board rather than as a chat line.
Filed by session_01J8VVAjRKqdoEYQ4hXxtBuf on the maintainer's instruction. ⛔ Not a claim. No domain:* label: triage routes the execution cards after the ruling (candidate lanes: domain:server for the package; domain:spec only if a namespace rule changes).
Business reason. Three downstream apps each define "a company we deal with" on their own: HotCRM crm_account / crm_contact, HotCLM clm_party, ATS ats_employer. A customer who installs two of them gets two unrelated customer tables, and an agent operating across them has no shared meaning of "this counterparty". A shared Company Core (party, contact, legal entity, department, address, currency, document, task, approval contract) is the base package every functional app would depend on (ADR-0141). Where that package lives decides its release cadence, who gates changes to it, and whether a platform PR can break every app at once without noticing.
维护者速读
- 一句话问题:所有业务应用共用的基础本体(往来单位与联系人、法人实体与部门、地址、币种、文档、任务、审批契约)放在哪里开发与发版。
- 谁撞上了(实测):hotcrm、hotclm、ats 三个仓各自定义了"公司/联系人"对象(
crm_account、clm_party、ats_employer),同装两个应用即两张互不相通的客户表。 - 选项:A 平台单仓内作为独立 App 工件、随平台发版;B 独立仓
objectstack-ai/company-core;C 并入 platform-objects 作sys_*常驻对象;D 不建共享核心,各应用自带、靠 ADR-0141 依赖 HotCRM。 - 推荐 A。 回退 B。
- 请回:
A / B / C / D,并一并裁定命名空间(见「After the ruling」第 1 条)。
Background
- The marketplace survey of 2026-10-27 (this session) found the only v18-current listed app is HotCRM; HotCLM, ATS, Duly and the templates repository each pin an older platform and each model the counterparty independently. Readings on
objectstack-ai/hotcrm@9464673,objectstack-ai/hotclm@3b7364f,objectstack-ai/ats(head of 2026-09-09),objectstack-ai/duly(head of 2026-10-26), this repository atc3fb185a. - ADR-0141 D7 names the first dependency consumer: a HotCRM module shipping on its own. A Company Core package is the second shape of the same mechanism: a base that many apps declare.
- Nothing in the platform defines a business party today.
sys_organizationis the tenant organization (ADR-0029 D2's identity hub), not a customer or supplier.
Governing text
- ADR-0029 D2: "Core-mandatory — referenced by (almost) everything and has no meaningful 'disabled' state: the identity/org hub (
sys_user,sys_organization) and the metadata store … Capability — has a coherent on/off boundary … Independently installable/disablable; each owns itssys_*objects." Re-check:git grep -n "Small core; everything else is a capability plugin" origin/main -- docs/adr. - ADR-0029 D4: "a
scope:'project'/type:'app'package attempting to own/define an object in a reserved kernel namespace is rejected (thesys_-prefix exemption becomes a prohibition for apps). Apps may still extend kernel objects." Re-check:git grep -n "apps reference but cannot define kernel objects" origin/main -- docs/adr. - ADR-0019 D2: "Only
type: appis consumer-installable; everything else is invisible." Re-check:git grep -n "is consumer-installable; everything else is invisible" origin/main -- docs/adr. - ADR-0141 D1 / D2 / D5: dependencies are declared in
ManifestSchema.dependencies, checked once before install, and "A declared dependency is namespace co-ownership, one-way". Re-check:git grep -n "A declared dependency is namespace co-ownership" origin/main -- docs/adr. - AGENTS.md Prime Directive Migrate from npm to pnpm #6: "For module prefixes, embed in the name (
sys_user,ai_conversations)"; ADR-0129: an object name carries its module prefix literally. packages/spec/src/kernel/manifest.zod.tslines 531–532: "Platform-reserved namespaces: "base", "system", "sys". Object names starting withsys_are reserved for the platform". Re-check:git grep -n "Platform-reserved namespaces" origin/main -- packages/spec/src/kernel/manifest.zod.ts.- pm-dispatch
references/decision-analysis.md〈应用仓推荐序特例〉: 「能力先建在平台(spec、objectstack 运行时、objectui 渲染器);应用仓(cloud、hotcrm)不自建替代。」
Protocol statement. No spec key changes under A, B or D. C changes what sys_* means (ADR-0029 D2 would gain a third tier) and needs an ADR amendment first. Under A, B or D the core's namespace is an ordinary app namespace and cannot be sys, base or system (reserved); the ruling should name it (candidate: core, objects core_party, core_contact, core_legal_entity, …), because ADR-0129 makes the prefix literal and permanent.
Premises (each with a re-check)
- No platform object models a business party. Re-check:
git grep -n -i "counterparty\|core_party\|business party" origin/main -- packages/platform-objects/src(expected 0 hits). - Three downstream apps each own a party-like object. Re-check:
ls hotcrm/src/*/objects | grep -E "account|contact";ls hotclm/src/objects | grep party;ls ats/src/objects | grep employer. - The ADR-0141 D2 pre-install dependency check is live, so a base package can be declared and its absence refused. Re-check:
git grep -n "checkDeclaredDependencies" origin/main -- packages/cloud-connection/src. - A metadata app package in this monorepo is an existing shape (
packages/apps/setup,packages/apps/studio,packages/apps/accountare manifest packages;examples/app-multi-packagebuilds two packages in one artifact). Re-check:ls packages/apps examples/app-multi-package/src. - Apps must not define
sys_*objects (ADR-0029 D4). Re-check:git grep -n "RESERVED_NAMESPACES" origin/main -- packages/objectql/src/registry.ts(the set currently holdsbaseandsystem; the enforcement site of thesysprohibition for apps is not re-verified here).
Options
| Option | What it does | What a customer or app author sees | Effort |
|---|---|---|---|
| A monorepo app package | New package under packages/ (for example packages/apps/company-core): a type: 'app' package with its own manifest id, namespace and semver, built and published as its own artifact on the platform release train; every platform PR's CI builds and installs it. Apps depend on it through manifest.dependencies. |
One "Company Core" app in the marketplace, installed once; CRM, CLM, procurement attach to its party. A platform change that breaks it is red in the platform PR. | domain:server · 1 PR (package) + 1 PR (CI install leg) · no precedent measured for a business-metadata package under packages/; nearest shape packages/apps/setup. |
| B own repository | objectstack-ai/company-core with its own PM loop and release; this repository runs it in a downstream canary. |
Same marketplace shape as A. A platform change that breaks it surfaces in the canary after the platform merge, not in the platform PR. | 1 new repository + repo kit + canary workflow here · precedent: hotcrm (separate repository, own loop) · no measured PR. |
C fold into platform-objects as sys_* |
Party, address, currency, document become kernel objects: always present, not installable, not removable. | No separate app; every environment carries a party table whether or not any business app is installed. | domain:server · 1–2 PRs + an ADR amending 0029 D2/D4 (Tier H). |
| D no shared core | Each app keeps its own party; a second app depends on HotCRM and reuses crm_account (the ADR-0141 D7 route). |
Installing CLM or procurement requires CRM. "Customer" means CRM's account everywhere. | 0 PRs now; each later app pays its own party model or a CRM dependency. |
In business terms.
- A: one shared address book, shipped and tested with the platform, installed as an app.
- B: the same address book kept by a separate team with its own release calendar.
- C: the address book is part of the operating system; you cannot not have it.
- D: no shared address book; every app copies the CRM's or keeps its own.
四维分析(业务立场)
- 项目长远合理性(领起)。 两年后的样子:一家公司在平台上的"往来单位、法人、地址、币种"只有一份定义,每个职能应用声明依赖它(ADR-0141),对应 Salesforce 的 Account/Contact 标准对象、SAP 的业务伙伴(Business Partner)、Palantir 的共享本体。A 与 B 都到达这个终态,差别只在谁为它的契约负责:A 把它放在平台 PR 的 CI 半径内,契约与 spec 同级受护,缩小特例;B 多一个仓与一条异步金丝雀,破坏在平台合并之后才被看见。C 把业务本体塞进
sys_*,违反 ADR-0029 D2/D4 的两层划分(身份枢纽 + 能力插件),是永久特例。D 让"客户"永久等于 CRM 的账户,CLM、采购、GRC 都要先装 CRM,契约随 CRM 的产品节奏漂移。 - 实际业务拉动。 有实测拉动:hotcrm
crm_account、hotclmclm_party、atsats_employer三份互不相通的"公司"定义;hotclm DESIGN 已为"相对方"单独建模,并把 CRM 交接做成一条同步流程(F15)。有拉动 ⇒ 一次付清长远形态。 - 防 AI 犯错。 出错时谁看到什么:A/B 下,写 CLM 元数据的 AI 引用
core_party而核心未装时,在安装门被响亮拒绝(ADR-0141 D2);C 下对象常驻,无法拒绝"没装核心",也无法卸载;D 下 AI 要在每个应用里重写一遍 party,批量犯错的面最大。A 比 B 多一道门:平台 PR 改坏核心时 CI 当场红,而非金丝雀事后红。 - 创业阶段不扩散。 A 不加新门禁、不加协议键,复用现有 manifest 包与
dependencies;B 多一个仓的运营成本;C 要改 ADR(Tier H)并让每个环境背一张用不到的表;D 零工作量但把扩散推给每个新应用。
os-decision-facets
- ① 项目长远合理性:A 缩小特例(一份业务本体,契约在平台 CI 半径内,合 ADR-0029 两层划分与 ADR-0141 依赖);B 同终态但契约护栏异步;C 扩大
sys_*的含义,违 ADR-0029 D2/D4;D 让"客户"永久等于 CRM 账户。 - ② 实际业务拉动:今天 hotcrm、hotclm、ats 各自定义公司对象(
crm_account、clm_party、ats_employer),hotclm 还为此写了一条 CRM 交接流程。 - ③ 防 AI 犯错:A/B 缺核心时安装门响亮拒绝;C 无法拒绝也无法卸载;D 每个应用重写一遍 party,错面最大。
- ④ 创业阶段不扩散:A 无新门禁无新键;B 多一仓;C 需改 ADR 且每环境常驻一表;D 零工作量但扩散后置。
Prior rulings read: "shared base objects party organization person company core package every app depends" → 1 hit (#26131, an unrelated console check, closed); "company core ontology master data counterparty vendor customer same object across apps" → 1 hit (#14599, multi-package artifact attribution defect, closed); ADR-0141 D7, ADR-0029 D2/D4; thread: none.
Recommendation
- A, fallback B.
- 只看①选 A;②③④ 是否翻转:否。
- Confidence gap: (i) whether a
type: 'app'metadata package underpackages/is published as its own marketplace artifact by the existing release workflow was not measured (premise 4 shows the package shape exists, not the publish leg); (ii) the enforcement site of thesysprohibition for apps (ADR-0029 D4) was not re-verified, which matters only for C; (iii) the object roster of the core is a proposal from the 2026-10-27 survey, not a ruled list — this card asks only where it lives; the roster is a follow-up card.
After the ruling
- The ruling names the namespace and manifest id in the same breath (candidate
core/com.objectstack.core);sys,baseandsystemare reserved and not candidates. - A: triage files one
domain:servercard: the package skeleton underpackages/with manifest, namespace, one anchor-safe default permission set (ADR-0090 D5), build and publish wiring, and a CI leg that installs it on every platform PR; a second card for the object roster, filed after the maintainer reviews the proposed list. - B: triage files a cross-repo coordination parent: a new repository from the app-repo kit, a canary workflow in this repository, the same roster card.
- C: an ADR amending 0029 D2/D4 first (Tier H), then the package work.
- D: close this card not_planned; the HotCRM module split (ADR-0141 D7) continues as the only dependency route.
- HotCRM, HotCLM and ATS each get a follow-up card to re-point their party objects at the core once it is published; those cards are filed in their own repositories.
Related
ADR-0019, ADR-0029, ADR-0129, ADR-0130, ADR-0141 (D7), #25403 (the dependency rulings), #25747 (e-sign connector, a cross-app consumer), #25098.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 27, 2026
Triage: decision card, intake labels · triage seat ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-27T09:02Z⛔ Not a claim.
priority:p2·pm:awaiting-maintaineradded. Nodomain:*until the ruling, as the card says. Triage routes the execution cards after the letter.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Brief-claimed-by: session_01KrKXQVvgYk2AJ4VkqMobyb · batch #411 · 2026-10-27T10:11Z
Director seat, summon #51 continuation (ledger objectstack#12708). Presented to the maintainer in batch #411 as item 2 of 3. The maintainer's filing words already lean: 「Company Core 共享本体放 objectstack 单仓」 — the card asks for the letter on the board and the namespace in the same breath. Seat increment (re-verified on
origin/main500bc9d5):packages/platform-objects/srchas no party/counterparty object (0 hits);packages/apps/{account,setup,studio}are the manifest-package shape underpackages/;RESERVED_NAMESPACESinobjectql/src/registry.ts:400holdsbaseandsystem, and :1722 addssysto the prohibition (the enforcement site the card left unverified — it exists);manifest.zod.ts:531names the three reserved namespaces;checkDeclaredDependencieslives incloud-connection/src/marketplace-install-local-plugin.ts(ADR-0141 D2 live).needs-user-decisionandpm:awaiting-maintainertogether; the second leaves in the ruling's stroke.sys_*against ADR-0029 D2/D4; D makes "customer" equal CRM's account forever. ② three apps already model the party three ways. ③ A/B refuse loudly at the install gate when the core is missing; C cannot refuse or uninstall; D multiplies the error surface. ④ A adds no key or gate.core/ manifest idcom.objectstack.core(objectscore_party,core_contact, …): short, literal per ADR-0129, not reserved, and reads as what it is. Not C (ADR amendment to put business data in the kernel) and not D. Workload: server · 1 PR (package skeleton, manifest, default permission set, publish wiring) + 1 PR (CI install leg) · M; the object roster is a follow-up card after the maintainer reviews the proposed list.Prior rulings read: ADR-0029 D2/D4, ADR-0141 D1/D2/D5/D7, ADR-0129, ADR-0019 D2; [Decision] 一个应用能否声明依赖另一个应用并引用其对象(ADR-0019 推迟的应用间依赖) #25403; thread: none.
objectstack-fleet commentedon Oct 27, 2026
Director note · the maintainer takes this card directly · 2026-10-27T10:23Z
Recorded by the director seat (summon #51 continuation,
session_01KrKXQVvgYk2AJ4VkqMobyb, ledger objectstack#12708). Presented in batch #411 (brief 6439146257, seat letter A with namespacecore); the maintainer's reply: 「26582 交维护者处理」 — the maintainer rules this card by hand, on the card or in the project thread, not through the director batch. The card keepsneeds-user-decisionandpm:awaiting-maintaineruntil that ruling lands; the director seat does not re-present it. Triage routes the execution cards once the letter and the namespace are on the board (the card's "After the ruling" 1–2).objectstack-fleet commentedon Oct 28, 2026
Ruled: closed as not planned · 2026-10-28T06:45Z
Maintainer ruling (this session, 2026-10-28, verbatim, not translated): 「所以 core 几乎没有价值了呀」 → 「26582 关卡」.
What was decided. None of the four options is taken. A shared Company Core is not built as a package at this stage. The value of a shared party (one "company" record for several apps installed in one environment) exists only for a customer running two or more products in one environment, and none exists today; the cost would fall on HotCRM (identity fields moved off
crm_account, duplicate detection, import, MCP tools, reports re-pointed) and on three platform mechanisms that do not exist (record-page slot contributions from dependent packages, uninstall protection for dependents — ADR-0141 D3 deferred — and a conformance check of an unmanaged core). Under the North Star priority rule, work that is on no road step and in no checklist item is p3 or not done.What replaces it. Core is demoted from a package to a convention: one page for AI authors naming the standard object shapes (party, contact, legal entity: names, minimal fields, identifiers as a typed registry rather than scattered fields, region-neutral rules, the names of the shared picklists). Each product writes its own objects to it; no table is shared. Cross-product references keep today's shape (ADR-0141 dependency plus a sync flow, as HotCLM's hand-off does). That convention page is a separate small card when the maintainer asks for it; it is not filed by this closure.
Restart condition (for the record, not a hold): the first paying customer that installs two products into one environment. Then party is promoted from convention to package and this question is re-opened with that customer's shapes as the premise.
Side conclusions this thread settled, unrelated to the closure: repositories split by product, not by market; a market is expressed as a distribution (a composition of product versions, region packs, a plugin set and a demo company), not as a merged repository; the China line starts with platform plugins (DingTalk / WeCom / Feishu channels, login, directory sync) before any second app.
Closed by
session_01J8VVAjRKqdoEYQ4hXxtBufon the maintainer's instruction. The director note 6439370659 recorded 「26582 交维护者处理」; this is that ruling.pm:awaiting-maintainer(triage 6437799530) was removed in the same stroke so the card leaves through one state.Generated by Claude Code