Repository navigation
Move quote_generation, the two campaign member-enroll flows and product_metrics back to their modules once a released @objectstack/* carries objectstack#25514, and empty both exception lists #2276
Description
Filing gate ③ a task the maintainer directed, follow-up still owed by landed work: #2270 (landed by PR #2272, squash 5cba770 on main), ruling comment 6382429507. The maintainer answered 「1」 on 2026-10-24T08:34:47Z. Option 1, as the ruling records it: "once a released @objectstack/* carries #25514, register the four items in their modules and empty both lists. #25514 stays the platform card." Filed by the repo:hotcrm seat 1 (os-elon-musk, session session_014xanhPEmGTMTfVH4UokwJT). ⛔ Not a claim.
维护者速读
- 事由: Package src/revenue and src/marketing as their own modules inside the one HotCRM artifact, the way src/service is: navigation by contribution, permission sets and cross-domain dashboards stay in the app (objectstack#25403 B′, step one) #2270 已把 revenue 和 marketing 做成独立模块包,但有四项暂时仍由应用包代为注册:报价生成流程
quote_generation、两条市场活动成员登记流程,以及 CRM Overview 里 Top Products 图表用的数据集product_metrics。原因是平台按单个包检查引用,跨包引用会被拒(objectstack#25514)。 - 要做(解锁后): 平台修复发布、HotCRM 升级到该版本后,把这四项注册回各自的模块,并清空两份例外名单。只改注册位置,不移动文件。
- 完成标准:
pnpm validate/build通过,四项归 revenue 和 marketing 所有;Top Products 图表照常出数据;商机上的「生成报价」、线索和联系人上的两个「加入市场活动」按钮照常启动各自的流程。
Grade: priority:p3. Nothing user-visible breaks today; the four items work from the app package. The card removes a recorded deviation from the assignment rule (AGENTS.md rule 11). The maintainer can overrule the grade here in one word.
Size: S. A registration move in two files plus their tests. No file moves, no src/sales/ file gains a module import.
Reader (who acts): the repo:hotcrm lane. ⛔ Not dispatchable while the line below is unmet.
Blocked-by: objectstack-ai/objectstack#25514
- Unlock = released, not merged. #25514 is already closed (fix feat(spec,lint): resolve action → flow and widget → dataset references against the release artifact objectstack#25617, merge commit
cc10e74, 2026-10-24T11:14Z). That alone does not unlock this card. The unlock criterion is that a published@objectstack/*release carriescc10e74and HotCRM installs it. - Reading at filing (2026-10-24): npm
latestfor@objectstack/specis18.1.0, released at 09:12Z frome649c2d. RESTcompare e649c2d...cc10e74answersaheadby 13, so 18.1.0 does not carry the fix. HotCRMorigin/mainpins@objectstack/*at18.0.0. - Re-check commands:
curl -s https://registry.npmjs.org/@objectstack/spec | jq '."dist-tags"', thengh api repos/objectstack-ai/objectstack/compare/<release-sha>...cc10e74fefc6ca104b0d9159b23783b94499a119 --jq .status(behindoridentical= carried). - When #25514 shows closed to the unlock scan, the seat checks the release first. If it is not released yet, the seat moves the card to
pm:on-holdwith aRestart-when:line naming the release check, ⛔ not topm:queue. When the release exists, the pin bump that brings it here is the step before this card. - Downstream: Ship the revenue module as its own installable artifact once the platform pre-install check is released: revenue brings its own permission sets, and the app runs with revenue absent (objectstack#25403 B′ first consumer) #2271 (ship revenue as its own installable artifact) starts from the shape this card leaves. With the four items still in the app package, revenue shipped alone would lack
quote_generationandproduct_metrics. Ship the revenue module as its own installable artifact once the platform pre-install check is released: revenue brings its own permission sets, and the app runs with revenue absent (objectstack#25403 B′ first consumer) #2271 depends on this card.
The four items, read on origin/main 5cba770
| Item | Module | Consumer in the app package |
|---|---|---|
quote_generation (flow) |
revenue | generate_quote on crm_opportunity, src/sales/actions/opportunity.actions.ts:234 |
campaign_lead_member_enroll (flow) |
marketing | create_campaign on crm_lead, src/sales/actions/lead.actions.ts:184 |
campaign_contact_member_enroll (flow) |
marketing | add_contact_to_campaign on crm_contact, src/sales/actions/contact.actions.ts:82 |
product_metrics (dataset, on crm_product) |
revenue | CRM Overview top_products widget, src/sales/dashboards/crm.dashboard.ts:131/:144 |
The two lists to empty
appRegisteredModuleItemsinobjectstack.composition.ts:196(flows: 3, datasets: 1). It is spread intoappFlows(:248) andappDatasets(:286). Imports at :69–71.APP_REGISTERED_MODULE_ITEMSintest/package-ownership.test.ts:53(the assignment-rule roster, asserted at :138). Today it names onlyproduct_metrics; the three flows carry no top-level object, so the sweep cannot see them.- Prose that names the deviation and goes with it: the docblocks at
src/revenue/index.ts:37,src/marketing/index.ts:33,src/sales/index.ts:43,test/flow-registration-completeness.test.ts:33,docs/architecture/module-split-plan.md:576, and thedocs/architecture/module-split-inventory.json:50entry (the two edge classes move from REFUSED to ACCEPTED, measured).
Done when
- The four items are registered by their modules:
quote_generationinrevenueFlows(src/revenue/index.ts:39),product_metricsas a dataset ofcreateHotCrmRevenueStack(which registers no datasets today,src/revenue/index.ts:77), the two enroll flows inmarketingFlows.appRegisteredModuleItemsis removed (or empty) andAPP_REGISTERED_MODULE_ITEMSis[]. pnpm validateandpnpm buildpass with the items owned by revenue and marketing (nowidget-dataset-unknown, nodefineStackflow-target refusal).- CRM Overview's Top Products tile still returns its rows, compared against the same seed before the change.
generate_quote,create_campaignandadd_contact_to_campaignstill launch their flows.- ⛔ If the released platform still refuses either reference class, stop and report. No workaround in this repo (AGENTS.md).
Dedupe
#25514's timeline cross-references in hotcrm: Package src/revenue and src/marketing as their own modules inside the one HotCRM artifact, the way src/service is: navigation by contribution, permission sets and cross-domain dashboards stay in the app (objectstack#25403 B′, step one) #2270, Ship the revenue module as its own installable artifact once the platform pre-install check is released: revenue brings its own permission sets, and the app runs with revenue absent (objectstack#25403 B′ first consumer) #2271, feat(packaging): revenue and marketing are modules of their own in the one HotCRM artifact (#2270) #2272 only.- REST listing of all hotcrm issues updated since 2026-10-01 (174 cards, open and closed), grepped for
appRegisteredModuleItems,25514,campaign_lead_member_enroll,campaign_contact_member_enroll,package-ownership,APP_REGISTERED: 3 hits (Package src/revenue and src/marketing as their own modules inside the one HotCRM artifact, the way src/service is: navigation by contribution, permission sets and cross-domain dashboards stay in the app (objectstack#25403 B′, step one) #2270 parent, Ship the revenue module as its own installable artifact once the platform pre-install check is released: revenue brings its own permission sets, and the app runs with revenue absent (objectstack#25403 B′ first consumer) #2271 downstream, [Decision] Sales reps and sales managers can enroll campaign members although their profiles grant no create and say "Enrollment belongs to marketing_user": enforce the profile (A) or grant it (B)? #2167 unrelated decision on enroll permissions). None carries this follow-up.
Governing text
- Package src/revenue and src/marketing as their own modules inside the one HotCRM artifact, the way src/service is: navigation by contribution, permission sets and cross-domain dashboards stay in the app (objectstack#25403 B′, step one) #2270 ruling comment
6382429507(quoted above). objectstack.composition.ts:170–195docblock: "move them back to their modules once a PUBLISHED platform release carries #25514 — a registration move, no file moves."- AGENTS.md rule 11 (assignment rule), and: a platform defect means you WAIT for the platform fix.
docs/architecture/module-split-plan.md, Decisions recorded (2026-09-14) items 5–7.
Activity
objectstack-fleet commentedon Oct 25, 2026
Half-state closed: the blocker is closed but not yet released · triage seat (objectstack-wide, objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-25T01:56Zpm:blocked→pm:on-hold, on the maintainer's go (「同意」). Grade unchanged. ⛔ Not a claim.cc10e74fefis on objectstackmainbut not in 18.1.0 (compare:behind), so it is not installable yet. Merged is not installable (AGENTS.md §2).Restart-when:
npm view @objectstack/spec@latest versionprints 18.2.0 or later, and objectstack's compare fromcc10e74fefto that release's version commit readsaheadoridentical. The pin bump that brings it here comes first.Generated by Claude Code