Skip to content

docs(src): repoint the source comments that cite pre-ADR-0130 directories - #2040

Merged
objectstack-fleet[bot] merged 8 commits into
mainfrom
claude/issue-1919-source-comment-paths
Oct 9, 2026
Merged

objectstack-fleet[bot] merged 8 commits into
mainfrom
claude/issue-1919-source-comment-paths

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #1919
Clause-②: no

What this changes

Comment lines in src/**/*.ts that still cite the flat directories the ADR-0130 package move removed — src/flows/, src/translations/, src/objects/, src/actions/, src/profiles/, src/sharing/, src/data/, src/views/, src/dashboards/, src/pages/, plus three more the dispatch asked to look for (src/skills/, src/hooks/, src/apps/) — and the two retired-test citations carried over in comment 6055754509.

The rule, from comment 5686987990: a comment recording past state keeps the path it had then; a comment saying where something lives today must name the present path. Every site was read in context, not classified by grep. No non-comment line changes.

Counts (base ac162c9, head 6055671)

Command, per directory: git grep -n "src/DIR/" REV -- 'src/**/*.ts' | wc -l

directory before after what is left
src/flows/ 23 1 src/sales/flows/index.ts:9, past state ("used to be")
src/translations/ 36 0
src/objects/ 32 1 activity-actions.ts:381, inside a template literal (see below)
src/actions/ 17 2 both past state
src/profiles/ 14 0
src/sharing/ 8 0
src/data/ 18 8 all past state ("split out of the former monolithic", "used to be", "were authored in")
src/views/ 19 2 both past state
src/dashboards/ 1 0
src/pages/ 1 0
src/skills/, src/hooks/, src/apps/ 3 1 src/sales/objects/hooks.ts:4, past state ("used to hold")

The dead set was checked, not assumed: git ls-tree -d HEAD src/ lists docs marketing revenue sales service, and grouping every src/NAME token in src/ by its first segment found the ten names plus skills, hooks and apps, one line each. The 18 sites kept are each in the per-site table with the reason.

Evidence that only comments changed

  • git diff -U0 origin/main...HEAD -- 'src/**/*.ts' | grep -E '^[+-]' | grep -vE '^(\+\+\+|---) ' | grep -vE '^[+-][[:space:]]*(//|/?\*)' prints nothing (exit 1, 0 lines). The only other file in the diff is the changeset.
  • That filter goes by line prefix, so it cannot see a // line that sits inside a template literal. The stronger check: parse each of the 94 changed .ts files at base and head with the TypeScript 6.0.2 compiler API and compare every non-comment token (template literal text included). All 94 have the same token stream. Positive controls: editing the template-literal line in activity-actions.ts, or changing one const to let, are both reported as a difference (exit 1).
  • In the built dist/objectstack.json, none of the new comment strings appear (for example, src/sales/objects/event.hook.ts has 0 hits). The template-literal text does ship: src/objects/event.hook.ts has 30 hits, from the activity actions' source bodies. That is why that one site is kept.

Choices worth a reviewer's eye

  • The nine object files that say "scheduled status flips and notifications live in …" (the card counted six; there are nine now) all get the same new text, src/*/flows/*.flow.ts. These are // line comments, so the glob is safe there, and AGENTS.md uses the same spelling.
  • Globs inside block comments. Writing src/, then an asterisk, then a slash inside a block comment ends the comment early (TS1005). The two block-comment globs (crm.app.ts:20, _thresholds.ts:77) use a placeholder segment instead: in the source it is the word pkg between angle brackets, the same placeholder style AGENTS.md and executive.dashboard.ts already use. The table writes it as PKG.
  • The 32 locale-pack docblocks. Each one pointed at its own locale's file before the move, and each now points at its own locale's file in src/sales/translations/: 8 files for each of en, es-ES, ja-JP and zh-CN. Each of the four target files carries the SPLIT AXIS (#1311) rule the docblock refers to.
  • billing-handoff.flow.ts split in two. Both quote.hook.ts sites talk about what is POSTed "when the contract activates" (payment_terms, contract_type), so both now name src/revenue/flows/billing-handoff-contract-activated.flow.ts. That flow's http node posts both fields.
  • Successors outside the commenting file's own package, or under a different name: global.actions.ts was renamed src/sales/actions/activity-actions.ts in the move (its own docblock records this). The crm_case log_call is created in src/service/actions/case-activity.actions.ts. Forecast seed rows now live in src/sales/data/forecast.seed.ts, not in revenue.seed.ts. Task seed rows now live in src/sales/data/activity.seed.ts, not in service.seed.ts. contract-renewal.flow.ts is in the revenue package.
  • No single successor: src/objects/_campaign-metrics.ts no longer exists anywhere. Its recompute is inlined in four hooks, so the seed note names them. The "a seed cannot name a user" note that was at the foot of src/data/index.ts now lives in objectstack.composition.ts at the repo root. It is cited the same way activity.seed.ts line 628 already cited it, and checked with test -f (it is not under src/, so find src cannot find it).
  • Retired-test carry-over (6055754509). Both test files still exist, but the two rows these comments cited are gone. Their tombstones say objectstack lint --strict now reports field-group-shadowed and flow-inert-node-condition, and pnpm lint fails on them. Both rule ids are present in the pinned @objectstack/lint, so each comment now names the rule and pnpm lint.

Every newly written path or glob resolves: 66 distinct new path strings, each expanded with compgen -G (placeholders expanded as wildcards), 0 missing.

Verification

OS_VERIFY_LOCK_SLOT=hotcrm-1919 bash …/scripts/pm/os-verify-lock.sh -c 'pnpm verify' on head 6055671:

os-verify-lock: VERDICT command-exit 0 · held the lock 515s (8m35s) · waited 0s
✓ Validation passed (2483ms)
18 suggestion(s) (2214ms)          (objectstack lint --strict)
✓ i18n lint gate: 0 `i18n/missing-*` issues (18 total lint issue(s) reported, unaffected by this gate)
✓ source hygiene clean
✓ source token ratchet clean
Artifact: dist/objectstack.json (2319.2 KB)
Test Files  173 passed (173)
     Tests  3609 passed | 1 skipped (3610)

The token ratchet does not count comments, and this diff does not move it. For example, revenue reads ~15,641 business semantics and ~18,752 authored total, the same figures #2037's changeset recorded.

Changeset

This adds an empty-frontmatter changeset (.changeset/1919-source-comment-paths.md). The diff is comment lines only and puts nothing new in the built artifact, so it releases nothing. An empty-frontmatter changeset is how this repo has recently declared "releases nothing", including the sibling ADR-0130 dead-link repoint (2030-changelog-dead-links.md, landed in #2033) and #2037. changeset-check.yml counts it as a changeset, so no skip-changeset label is needed.

Acceptance notes

These were found while sweeping. They are outside this card's claimed surface, so they are not changed here. Each one is named in the dev report for the seat to place.

  • src/docs/crm_admin.md:106: "The business rules are defined in the flows under src/flows/". The card body counted this site, but the claim limits the surface to src/**/*.ts comment lines. It is an in-product page, and pnpm build puts the sentence into the artifact's top-level docs[] (1 hit in dist/objectstack.json), so changing it ships text to users and needs a real changeset.
  • Seven broken relative paths in comments, from the same move: ./_shared.ts in src/marketing/data/marketing.seed.ts:10, src/revenue/data/catalog.seed.ts:8 and src/revenue/data/revenue.seed.ts:7 (the file is src/sales/data/_shared.ts). ./_refusal.ts in src/marketing/objects/campaign.hook.ts:54, src/revenue/objects/contract.hook.ts:27, src/revenue/objects/product.hook.ts:23 and src/revenue/objects/quote.hook.ts:33 (the file is src/sales/objects/_refusal.ts).
  • 22 comment lines in about 17 src/ files cite five test files that test: run the hook, flow and action suites on @objectstack/verify and retire the five hand-built harnesses #2013 (9451b6d) deleted: test/action-sandbox.test.ts (14), test/hook-write-shape.test.ts (3), test/hook-input-shape.test.ts (2), test/hook-query-predicate.test.ts (2) and test/activity-actions.test.ts (1). This is the same kind of problem as the 6055754509 carry-over, one PR later.
  • Three bare mentions of global.actions.ts without a directory (opportunity.actions.ts:60, activity.seed.ts:550, event_attendee.object.ts:348) name a file the move renamed.
  • activity-actions.ts:381 (kept, see the table) is a present-tense pointer inside the shipped action source. Fixing it is a metadata change, not a comment change.

Per-site table

Base line numbers. Every site from the dispatch's measurement, plus the two carry-over sites.

# Site (base line) Cited Decision
1 src/docs/crm_admin.md:106 src/flows/ kept — outside the claimed surface (src/**/*.ts comment lines): an in-product .md page compiled into the artifact's docs[], so editing it ships text to users. Named in the report for the seat
2 src/marketing/data/marketing.seed.ts:9 src/data/index.ts kept — past state: "Split out of the former monolithic src/data/index.ts (#635)"
3 src/marketing/data/marketing.seed.ts:140 src/objects/_campaign-metrics.ts changed → the four refresh hooks, by name, in src/marketing/objects/ and src/sales/objects/ — the module is gone from every package: the recompute is inlined in four hooks (campaign.hook.ts, campaign_member.hook.ts, lead.campaign-metrics.hook.ts, opportunity.campaign-metrics.hook.ts), so the note names them
4 src/marketing/flows/campaign-enrollment.flow.ts:210 src/flows/campaign-member-enroll.flow.ts changed → src/marketing/flows/campaign-member-enroll.flow.ts — says where it lives today
5 src/marketing/objects/campaign.object.ts:311 src/flows/*.flow.ts changed → src/*/flows/*.flow.ts — says where it lives today
6 src/marketing/objects/campaign_member.object.ts:56 src/profiles/marketing-user.profile.ts changed → src/sales/profiles/marketing-user.profile.ts — says where it lives today
7 src/marketing/objects/campaign_member.object.ts:203 src/actions/campaign.actions.ts changed → src/marketing/actions/campaign.actions.ts — says where it lives today
8 src/marketing/sharing/campaign.sharing.ts:8 src/objects/campaign.object.ts changed → src/marketing/objects/campaign.object.ts — says where it lives today
9 src/revenue/data/catalog.seed.ts:7 src/data/index.ts kept — past state: "Split out of the former monolithic … (#635)"
10 src/revenue/data/revenue.seed.ts:6 src/data/index.ts kept — past state: "Split out of the former monolithic … (#635)"
11 src/revenue/objects/contract.object.ts:235 src/objects/index.ts changed → src/sales/objects/index.ts — says where it lives today
12 src/revenue/objects/contract.object.ts:287 src/flows/*.flow.ts changed → src/*/flows/*.flow.ts — says where it lives today
13 src/revenue/objects/quote.hook.ts:351 src/flows/billing-handoff.flow.ts changed → src/revenue/flows/billing-handoff-contract-activated.flow.ts — split successor chosen by context: "POSTs to billing when the contract activates" is the contract-activated flow, which POSTs payment_terms
14 src/revenue/objects/quote.hook.ts:379 src/flows/billing-handoff.flow.ts changed → src/revenue/flows/billing-handoff-contract-activated.flow.ts — split successor chosen by context: same flow, which POSTs contract_type on activation
15 src/revenue/objects/quote.object.ts:279 src/objects/index.ts changed → src/sales/objects/index.ts — says where it lives today
16 src/revenue/objects/quote.object.ts:372 src/flows/*.flow.ts changed → src/*/flows/*.flow.ts — says where it lives today
17 src/sales/actions/activity-actions.ts:9 src/actions/global.actions.ts kept — past state: "It was src/actions/global.actions.ts until the ADR-0130 layout"
18 src/sales/actions/activity-actions.ts:381 src/objects/event.hook.ts kept — not a TypeScript comment: the line is inside the source: template literal (the shipped action body), so editing it changes metadata bytes, outside the comment-only surface. The hook is named in the same sentence (event_activity_bubble)
19 src/sales/actions/contact.actions.ts:48 src/views/contact.view.ts changed → src/sales/views/contact.view.ts — says where it lives today
20 src/sales/actions/contact.actions.ts:66 src/data/marketing.seed.ts changed → src/marketing/data/marketing.seed.ts — says where it lives today
21 src/sales/actions/lead.actions.ts:10 src/flows/ changed → src/sales/flows/ — says where it lives today
22 src/sales/actions/lead.actions.ts:35 src/objects/lead.object.ts changed → src/sales/objects/lead.object.ts — says where it lives today
23 src/sales/actions/lead.actions.ts:116 src/flows/schedule-followup.flow.ts changed → src/sales/flows/schedule-followup.flow.ts — says where it lives today
24 src/sales/actions/lead.actions.ts:148 src/views/lead.view.ts changed → src/sales/views/lead.view.ts — says where it lives today
25 src/sales/apps/crm.app.ts:20 src/views/*.view.ts changed → src/PKG/views/*.view.ts — says where it lives today
26 src/sales/apps/crm.app.ts:45 src/skills/ changed → src/*/skills/ — says where it lives today
27 src/sales/dashboards/crm.dashboard.ts:11 //github.com/objectstack-ai/objectui/tree/main/examples/crm/src/dashboards not a site — an objectui GitHub URL (examples/crm/src/dashboards), not a hotcrm path
28 src/sales/dashboards/executive.dashboard.ts:24 src/translations/LOCALE/objects.pipeline.ts changed → src/sales/translations/LOCALE/objects.pipeline.ts — says where it lives today
29 src/sales/dashboards/executive.dashboard.ts:26 src/translations/ja-JP/_shared.ts changed → src/sales/translations/ja-JP/_shared.ts — says where it lives today
30 src/sales/dashboards/sales.dashboard.ts:282 src/views/forecast.view.ts changed → src/sales/views/forecast.view.ts — says where it lives today
31 src/sales/data/_shared.ts:6 src/data/index.ts kept — past state: "The seed data used to be one 100KB src/data/index.ts"
32 src/sales/data/activity.seed.ts:10 src/data/service.seed.ts kept — past state: "Their rows were authored in src/data/service.seed.ts"; the next line names today's home
33 src/sales/data/activity.seed.ts:173 src/actions/global.actions.ts changed → src/sales/actions/activity-actions.ts — says where it lives today
34 src/sales/data/activity.seed.ts:532 src/data/index.ts changed → objectstack.composition.ts, "A seed can't name a user" — the note moved to the composition file (repo root, so test -f, not find src); spelled as line 628 of the same file already cites it
35 src/sales/data/forecast.seed.ts:8 src/data/revenue.seed.ts kept — past state: "they were authored in src/data/revenue.seed.ts"
36 src/sales/data/forecast.seed.ts:113 src/objects/forecast.object.ts changed → src/sales/objects/forecast.object.ts — says where it lives today
37 src/sales/data/forecast.seed.ts:173 src/objects/forecast.object.ts changed → src/sales/objects/forecast.object.ts — says where it lives today
38 src/sales/data/sales.seed.ts:6 src/data/index.ts kept — past state: "Split out of the former monolithic … (#635)"
39 src/sales/data/sales.seed.ts:44 src/objects/_territory.ts changed → src/sales/objects/_territory.ts — says where it lives today
40 src/sales/data/sales.seed.ts:91 src/objects/event.hook.ts changed → src/sales/objects/event.hook.ts — says where it lives today
41 src/sales/data/sales.seed.ts:356 src/objects/_territory.ts changed → src/sales/objects/_territory.ts — says where it lives today
42 src/sales/flows/index.ts:9 src/flows/index.ts kept — past state: "which used to be the allFlows array at the bottom of src/flows/index.ts"; the same comment names today's home (appFlows in objectstack.composition.ts)
43 src/sales/flows/lead-conversion.flow.ts:199 src/translations/*.ts changed → src/sales/translations/*.ts — says where it lives today
44 src/sales/flows/lead-conversion.flow.ts:279 src/translations/*.ts changed → src/sales/translations/*.ts — says where it lives today
45 src/sales/mappings/_shared.ts:24 src/objects/_picklists.ts changed → src/sales/objects/_picklists.ts — says where it lives today
46 src/sales/mappings/account_import.mapping.ts:64 src/objects/account.hook.ts changed → src/sales/objects/account.hook.ts — says where it lives today
47 src/sales/mappings/lead_import.mapping.ts:19 src/objects/lead.hook.ts changed → src/sales/objects/lead.hook.ts — says where it lives today
48 src/sales/objects/_hook-api.ts:157 src/actions/contact.actions.ts changed → src/sales/actions/contact.actions.ts — says where it lives today
49 src/sales/objects/_picklists.ts:206 src/views/lead.view.ts changed → src/sales/views/lead.view.ts — says where it lives today
50 src/sales/objects/_thresholds.ts:8 src/flows/ changed → src/sales/flows/ — says where it lives today
51 src/sales/objects/_thresholds.ts:9 src/sharing/opportunity.sharing.ts changed → src/sales/sharing/opportunity.sharing.ts — says where it lives today
52 src/sales/objects/_thresholds.ts:77 src/data/*.seed.ts changed → src/PKG/data/*.seed.ts — says where it lives today
53 src/sales/objects/account.object.ts:96 src/data/sales.seed.ts changed → src/sales/data/sales.seed.ts — says where it lives today
54 src/sales/objects/account.object.ts:662 src/flows/contract-renewal.flow.ts changed → src/revenue/flows/contract-renewal.flow.ts — contract-renewal lives in the revenue package, not the commenting file's
55 src/sales/objects/account.object.ts:718 src/objects/index.ts changed → src/sales/objects/index.ts — says where it lives today
56 src/sales/objects/account.object.ts:732 src/flows/*.flow.ts changed → src/*/flows/*.flow.ts — says where it lives today
57 src/sales/objects/contact.object.ts:298 src/objects/index.ts changed → src/sales/objects/index.ts — says where it lives today
58 src/sales/objects/contact.object.ts:334 src/flows/*.flow.ts changed → src/*/flows/*.flow.ts — says where it lives today
59 src/sales/objects/event.hook.ts:271 src/objects/task.hook.ts changed → src/sales/objects/task.hook.ts — says where it lives today
60 src/sales/objects/event_attendee.object.ts:112 src/views/lead.view.ts changed → src/sales/views/lead.view.ts — says where it lives today
61 src/sales/objects/event_attendee.object.ts:244 src/actions/global.actions.ts changed → src/sales/actions/activity-actions.ts — says where it lives today
62 src/sales/objects/event_attendee.object.ts:358 src/views/ changed → src/*/views/ — says where it lives today
63 src/sales/objects/forecast.object.ts:15 src/flows/forecast-snapshot.flow.ts changed → src/sales/flows/forecast-snapshot.flow.ts — says where it lives today
64 src/sales/objects/forecast.object.ts:96 src/data/revenue.seed.ts changed → src/sales/data/forecast.seed.ts — forecast rows moved to src/sales/data/forecast.seed.ts, not to revenue.seed.ts
65 src/sales/objects/forecast.object.ts:228 src/data/index.ts changed → objectstack.composition.ts, "A seed can't name a user" — same note, same successor
66 src/sales/objects/forecast.object.ts:343 src/data/revenue.seed.ts:339,378,393 changed → src/sales/data/forecast.seed.ts — forecast rows moved to the sales package (forecast.seed.ts line 8 records it); the stale line numbers are dropped, not renumbered
67 src/sales/objects/hooks.ts:4 src/hooks/index.ts kept — past state: "the list src/hooks/index.ts used to hold whole"
68 src/sales/objects/lead.hook.ts:690 src/views/lead.view.ts changed → src/sales/views/lead.view.ts — says where it lives today
69 src/sales/objects/lead.object.ts:632 src/flows/*.flow.ts changed → src/*/flows/*.flow.ts — says where it lives today
70 src/sales/objects/opportunity.object.ts:642 src/objects/index.ts changed → src/sales/objects/index.ts — says where it lives today
71 src/sales/objects/opportunity.object.ts:717 src/flows/*.flow.ts changed → src/*/flows/*.flow.ts — says where it lives today
72 src/sales/objects/task.hook.ts:96 src/data/service.seed.ts changed → src/sales/data/activity.seed.ts — the task rows moved to src/sales/data/activity.seed.ts (its line 10 records it); service.seed.ts holds no completed_date
73 src/sales/objects/task.hook.ts:299 src/objects/event.hook.ts changed → src/sales/objects/event.hook.ts — says where it lives today
74 src/sales/objects/task.hook.ts:409 src/actions/contact.actions.ts changed → src/sales/actions/contact.actions.ts — says where it lives today
75 src/sales/objects/task.hook.ts:421 src/actions/global.actions.ts changed → src/sales/actions/activity-actions.ts — says where it lives today
76 src/sales/objects/task.hook.ts:498 src/objects/event.hook.ts changed → src/sales/objects/event.hook.ts — says where it lives today
77 src/sales/objects/task.object.ts:314 src/flows/*.flow.ts changed → src/*/flows/*.flow.ts — says where it lives today
78 src/sales/pages/account_detail.page.ts:85 src/actions/global.actions.ts changed → src/sales/actions/activity-actions.ts — says where it lives today
79 src/sales/pages/home.page.ts:24 src/views/lead.view.ts changed → src/sales/views/lead.view.ts — says where it lives today
80 src/sales/pages/home.page.ts:30 src/apps/crm.app.ts changed → src/sales/apps/crm.app.ts — says where it lives today
81 src/sales/pages/lead_detail.page.ts:84 src/actions/lead.actions.ts changed → src/sales/actions/lead.actions.ts — says where it lives today
82 src/sales/pages/lead_detail.page.ts:85 src/actions/global.actions.ts changed → src/sales/actions/activity-actions.ts — says where it lives today
83 src/sales/pages/opportunity_detail.page.ts:60 src/actions/opportunity.actions.ts changed → src/sales/actions/opportunity.actions.ts — says where it lives today
84 src/sales/pages/opportunity_detail.page.ts:61 src/actions/global.actions.ts changed → src/sales/actions/activity-actions.ts — says where it lives today
85 src/sales/profiles/guest-portal.profile.ts:31 src/profiles/index.ts changed → src/sales/profiles/index.ts — says where it lives today
86 src/sales/profiles/marketing-user.profile.ts:8 src/profiles/index.ts changed → src/sales/profiles/index.ts — says where it lives today
87 src/sales/profiles/marketing-user.profile.ts:21 src/actions/lead.actions.ts changed → src/sales/actions/lead.actions.ts — says where it lives today
88 src/sales/profiles/sales-manager.profile.ts:15 src/profiles/index.ts changed → src/sales/profiles/index.ts — says where it lives today
89 src/sales/profiles/sales-manager.profile.ts:17 src/profiles/index.ts changed → src/sales/profiles/index.ts — says where it lives today
90 src/sales/profiles/sales-rep.profile.ts:39 src/profiles/index.ts changed → src/sales/profiles/index.ts — says where it lives today
91 src/sales/profiles/service-agent.profile.ts:14 src/profiles/index.ts changed → src/sales/profiles/index.ts — says where it lives today
92 src/sales/profiles/service-agent.profile.ts:27 src/profiles/index.ts changed → src/sales/profiles/index.ts — says where it lives today
93 src/sales/profiles/service-agent.profile.ts:86 src/sharing/positions.ts changed → src/sales/sharing/positions.ts — says where it lives today
94 src/sales/profiles/system-admin.profile.ts:17 src/profiles/index.ts changed → src/sales/profiles/index.ts — says where it lives today
95 src/sales/profiles/system-admin.profile.ts:20 src/profiles/index.ts changed → src/sales/profiles/index.ts — says where it lives today
96 src/sales/sharing/account.sharing.ts:22 src/objects/_territory.ts changed → src/sales/objects/_territory.ts — says where it lives today
97 src/sales/sharing/demo-staffing.ts:67 src/data/index.ts changed → the "A seed can't name a user" note in objectstack.composition.ts — same note, same successor
98 src/sales/sharing/demo-staffing.ts:83 src/objects/_case-assignment.ts changed → src/service/objects/_case-assignment.ts — says where it lives today
99 src/sales/sharing/demo-staffing.ts:158 src/profiles/service-agent.profile.ts changed → src/sales/profiles/service-agent.profile.ts — says where it lives today
100 src/sales/sharing/demo-staffing.ts:321 src/objects/_territory.ts changed → src/sales/objects/_territory.ts — says where it lives today
101 src/sales/translations/en/_shared.ts:12 src/translations/en.ts changed → src/sales/translations/en.ts — says where it lives today
102 src/sales/translations/en/app.ts:15 src/translations/en.ts changed → src/sales/translations/en.ts — says where it lives today
103 src/sales/translations/en/objects.activity.ts:17 src/translations/en.ts changed → src/sales/translations/en.ts — says where it lives today
104 src/sales/translations/en/objects.commerce.ts:17 src/translations/en.ts changed → src/sales/translations/en.ts — says where it lives today
105 src/sales/translations/en/objects.customer.ts:19 src/translations/en.ts changed → src/sales/translations/en.ts — says where it lives today
106 src/sales/translations/en/objects.marketing.ts:17 src/translations/en.ts changed → src/sales/translations/en.ts — says where it lives today
107 src/sales/translations/en/objects.pipeline.ts:19 src/translations/en.ts changed → src/sales/translations/en.ts — says where it lives today
108 src/sales/translations/en/objects.pipeline.ts:92 src/views/lead.view.ts changed → src/sales/views/lead.view.ts — says where it lives today
109 src/sales/translations/en/objects.service.ts:19 src/translations/en.ts changed → src/sales/translations/en.ts — says where it lives today
110 src/sales/translations/es-ES/_shared.ts:12 src/translations/es-ES.ts changed → src/sales/translations/es-ES.ts — says where it lives today
111 src/sales/translations/es-ES/app.ts:17 src/translations/es-ES.ts changed → src/sales/translations/es-ES.ts — says where it lives today
112 src/sales/translations/es-ES/objects.activity.ts:17 src/translations/es-ES.ts changed → src/sales/translations/es-ES.ts — says where it lives today
113 src/sales/translations/es-ES/objects.commerce.ts:17 src/translations/es-ES.ts changed → src/sales/translations/es-ES.ts — says where it lives today
114 src/sales/translations/es-ES/objects.customer.ts:19 src/translations/es-ES.ts changed → src/sales/translations/es-ES.ts — says where it lives today
115 src/sales/translations/es-ES/objects.marketing.ts:17 src/translations/es-ES.ts changed → src/sales/translations/es-ES.ts — says where it lives today
116 src/sales/translations/es-ES/objects.pipeline.ts:19 src/translations/es-ES.ts changed → src/sales/translations/es-ES.ts — says where it lives today
117 src/sales/translations/es-ES/objects.pipeline.ts:138 src/views/lead.view.ts changed → src/sales/views/lead.view.ts — says where it lives today
118 src/sales/translations/es-ES/objects.service.ts:19 src/translations/es-ES.ts changed → src/sales/translations/es-ES.ts — says where it lives today
119 src/sales/translations/ja-JP/_shared.ts:12 src/translations/ja-JP.ts changed → src/sales/translations/ja-JP.ts — says where it lives today
120 src/sales/translations/ja-JP/app.ts:17 src/translations/ja-JP.ts changed → src/sales/translations/ja-JP.ts — says where it lives today
121 src/sales/translations/ja-JP/objects.activity.ts:17 src/translations/ja-JP.ts changed → src/sales/translations/ja-JP.ts — says where it lives today
122 src/sales/translations/ja-JP/objects.commerce.ts:17 src/translations/ja-JP.ts changed → src/sales/translations/ja-JP.ts — says where it lives today
123 src/sales/translations/ja-JP/objects.customer.ts:19 src/translations/ja-JP.ts changed → src/sales/translations/ja-JP.ts — says where it lives today
124 src/sales/translations/ja-JP/objects.marketing.ts:17 src/translations/ja-JP.ts changed → src/sales/translations/ja-JP.ts — says where it lives today
125 src/sales/translations/ja-JP/objects.pipeline.ts:19 src/translations/ja-JP.ts changed → src/sales/translations/ja-JP.ts — says where it lives today
126 src/sales/translations/ja-JP/objects.pipeline.ts:124 src/views/lead.view.ts changed → src/sales/views/lead.view.ts — says where it lives today
127 src/sales/translations/ja-JP/objects.service.ts:19 src/translations/ja-JP.ts changed → src/sales/translations/ja-JP.ts — says where it lives today
128 src/sales/translations/zh-CN/_shared.ts:12 src/translations/zh-CN.ts changed → src/sales/translations/zh-CN.ts — says where it lives today
129 src/sales/translations/zh-CN/app.ts:17 src/translations/zh-CN.ts changed → src/sales/translations/zh-CN.ts — says where it lives today
130 src/sales/translations/zh-CN/objects.activity.ts:17 src/translations/zh-CN.ts changed → src/sales/translations/zh-CN.ts — says where it lives today
131 src/sales/translations/zh-CN/objects.activity.ts:51 src/views/task.view.ts changed → src/sales/views/task.view.ts — says where it lives today
132 src/sales/translations/zh-CN/objects.commerce.ts:17 src/translations/zh-CN.ts changed → src/sales/translations/zh-CN.ts — says where it lives today
133 src/sales/translations/zh-CN/objects.customer.ts:19 src/translations/zh-CN.ts changed → src/sales/translations/zh-CN.ts — says where it lives today
134 src/sales/translations/zh-CN/objects.marketing.ts:17 src/translations/zh-CN.ts changed → src/sales/translations/zh-CN.ts — says where it lives today
135 src/sales/translations/zh-CN/objects.pipeline.ts:19 src/translations/zh-CN.ts changed → src/sales/translations/zh-CN.ts — says where it lives today
136 src/sales/translations/zh-CN/objects.pipeline.ts:111 src/views/lead.view.ts changed → src/sales/views/lead.view.ts — says where it lives today
137 src/sales/translations/zh-CN/objects.service.ts:19 src/translations/zh-CN.ts changed → src/sales/translations/zh-CN.ts — says where it lives today
138 src/sales/translations/zh-CN/objects.service.ts:57 src/views/task.view.ts changed → src/sales/views/task.view.ts — says where it lives today
139 src/sales/views/forecast.view.ts:66 src/dashboards/sales.dashboard.ts changed → src/sales/dashboards/sales.dashboard.ts — says where it lives today
140 src/sales/views/lead.view.ts:212 src/pages/lead_detail.page.ts changed → src/sales/pages/lead_detail.page.ts — says where it lives today
141 src/sales/views/opportunity.view.ts:96 src/actions/opportunity.actions.ts changed → src/sales/actions/opportunity.actions.ts — says where it lives today
142 src/sales/views/opportunity.view.ts:276 src/views/knowledge_article.view.ts kept — past state: stale_articles "carried the same expired premise … that tab was then DELETED" (#769, #781)
143 src/sales/views/task.view.ts:222 src/flows changed → src/*/flows — says where it lives today
144 src/service/actions/case.actions.ts:8 src/flows/case-actions.flow.ts changed → src/service/flows/case-actions.flow.ts — says where it lives today
145 src/service/actions/case.actions.ts:45 src/sharing/case.sharing.ts changed → src/service/sharing/case.sharing.ts — says where it lives today
146 src/service/actions/case.actions.ts:67 src/actions/ kept — past state: what the #1890 sweep did; it landed as 1c8cceb (#1894, 2026-09-11), an ancestor of the move 36b27dd (#1910, 2026-09-14), when the directory was src/actions/
147 src/service/actions/case.actions.ts:73 src/sharing/case.sharing.ts changed → src/service/sharing/case.sharing.ts — says where it lives today
148 src/service/actions/knowledge_article.actions.ts:14 src/objects/article_feedback.object.ts changed → src/service/objects/article_feedback.object.ts — says where it lives today
149 src/service/data/service.seed.ts:17 src/data/index.ts kept — past state: "Split out of the former monolithic … (#635)"
150 src/service/flows/case-actions.flow.ts:65 src/flows/case-escalation-stamp.flow.ts changed → src/service/flows/case-escalation-stamp.flow.ts — says where it lives today
151 src/service/flows/case-actions.flow.ts:138 src/flows/case-escalation-stamp.flow.ts changed → src/service/flows/case-escalation-stamp.flow.ts — says where it lives today
152 src/service/flows/case-actions.flow.ts:189 src/objects/case.hook.ts changed → src/service/objects/case.hook.ts — says where it lives today
153 src/service/flows/case-actions.flow.ts:224 src/objects/_case-assignment.ts changed → src/service/objects/_case-assignment.ts — says where it lives today
154 src/service/flows/case-escalation.flow.ts:106 src/objects/_case-assignment.ts changed → src/service/objects/_case-assignment.ts — says where it lives today
155 src/service/flows/case-sla-monitor.flow.ts:171 src/objects/_case-assignment.ts changed → src/service/objects/_case-assignment.ts — says where it lives today
156 src/service/objects/_case-assignment.ts:96 src/flows/case-sla-monitor.flow.ts changed → src/service/flows/case-sla-monitor.flow.ts — says where it lives today
157 src/service/objects/_case-assignment.ts:159 src/views/case.view.ts changed → src/service/views/case.view.ts — says where it lives today
158 src/service/objects/_case-assignment.ts:246 src/sharing/positions.ts changed → src/sales/sharing/positions.ts — says where it lives today
159 src/service/objects/_case-assignment.ts:284 src/sharing/demo-staffing.ts changed → src/sales/sharing/demo-staffing.ts — says where it lives today
160 src/service/objects/_case-assignment.ts:438 src/profiles/service-agent.profile.ts changed → src/sales/profiles/service-agent.profile.ts — says where it lives today
161 src/service/objects/_case-assignment.ts:513 src/sharing/case.sharing.ts changed → src/service/sharing/case.sharing.ts — says where it lives today
162 src/service/objects/_case-sla.ts:18 src/views/account.view.ts kept — past state: "crm_account.tier was the other half of the same gap", written in #595 (d8f5eee, 2026-08-11)
163 src/service/objects/_case-sla.ts:65 src/data/service.seed.ts changed → src/service/data/service.seed.ts — says where it lives today
164 src/service/objects/article_feedback.object.ts:21 src/flows/case-actions.flow.ts changed → src/service/flows/case-actions.flow.ts — says where it lives today
165 src/service/objects/case.hook.ts:59 src/hook-wrappers.ts not a site — the platform path @objectstack/objectql src/hook-wrappers.ts
166 src/service/objects/case.hook.ts:122 src/views/case.view.ts changed → src/service/views/case.view.ts — says where it lives today
167 src/service/objects/case.hook.ts:353 src/profiles/service-agent.profile.ts changed → src/sales/profiles/service-agent.profile.ts — says where it lives today
168 src/service/objects/case.hook.ts:354 src/profiles/index.ts changed → src/sales/profiles/index.ts — says where it lives today
169 src/service/objects/case.object.ts:209 src/objects/event.hook.ts changed → src/sales/objects/event.hook.ts — says where it lives today
170 src/service/objects/case.object.ts:403 src/objects/index.ts changed → src/sales/objects/index.ts — says where it lives today
171 src/service/objects/case.object.ts:473 src/flows/*.flow.ts changed → src/*/flows/*.flow.ts — says where it lives today
172 src/service/pages/case_detail.page.ts:57 src/actions/case.actions.ts changed → src/service/actions/case.actions.ts — says where it lives today
173 src/service/pages/case_detail.page.ts:58 src/actions/global.actions.ts changed → src/service/actions/case-activity.actions.ts — the crm_case log_call is instantiated in case-activity.actions.ts from the sales factory
174 src/service/views/case.view.ts:158 src/objects/_case-assignment.ts changed → src/service/objects/_case-assignment.ts — says where it lives today
175 src/service/views/case.view.ts:203 src/sharing/case.sharing.ts changed → src/service/sharing/case.sharing.ts — says where it lives today
176 src/service/views/case.view.ts:325 src/objects/case.object.ts changed → src/service/objects/case.object.ts — says where it lives today
177 src/revenue/objects/opportunity_line_item.object.ts:69 test/field-groups-coverage.test.ts changed → the platform rule field-group-shadowed, which pnpm lint fails on — carry-over 6055754509: that test row was retired by #2012 (99d290a)
178 src/service/flows/case-escalation.flow.ts:122 test/flow-decision-authority.test.ts changed → the platform rule flow-inert-node-condition, which pnpm lint fails on — carry-over 6055754509: that test row was retired by #2012 (99d290a)

Patch round 1

The seat amended the claim surface in 6083234145 and chose option A. Head 98cd002, which merges origin/main c75dd42 (#2041) into the round-0 branch; the merge base for every reading below is c75dd42.

What changed in this round

  • src/docs/crm_admin.md:106, the in-product admin guide. "The business rules are defined in the flows under src/flows/" now reads "The business rules are defined in the flows, and each package keeps its own flows in its flows/ directory." The rest of that paragraph and the knobs table are unchanged.
  • src/sales/actions/activity-actions.ts:381: the // comment inside the activity actions' source script body now names src/sales/objects/event.hook.ts (find src -name event.hook.ts finds exactly that one file). The template literal's escaped-backtick spelling is kept byte for byte.
  • Seven relative paths now name the real files. ./_shared.ts becomes src/sales/data/_shared.ts in src/marketing/data/marketing.seed.ts, src/revenue/data/catalog.seed.ts and src/revenue/data/revenue.seed.ts. ./_refusal.ts becomes src/sales/objects/_refusal.ts in src/marketing/objects/campaign.hook.ts, src/revenue/objects/contract.hook.ts, src/revenue/objects/product.hook.ts and src/revenue/objects/quote.hook.ts.
  • Stale bare names:
    • global.actions.ts becomes activity-actions.ts (one file in the tree) in src/sales/actions/opportunity.actions.ts:60, src/sales/data/activity.seed.ts:551 and src/sales/objects/event_attendee.object.ts:348. The opportunity.actions.ts line is inside the clone_opportunity script body, the same kind of site as activity-actions.ts:381.
    • (campaign.hook.ts) for campaign_lead_conversion_refresh becomes src/sales/objects/lead.campaign-metrics.hook.ts, in src/marketing/objects/campaign_member.object.ts:205 and in the comment above test/seed-consistency.test.ts:304. That comment now lists all four hooks in their real files.
    • Every other campaign.hook.ts mention was already correct and is untouched.
  • .changeset/1919-source-comment-paths.md is now 'hotcrm': patch, written for the release-notes reader, because the admin guide sentence and the two script-body comments ship.

Evidence (merge base c75dd42 vs head 98cd002)

  • Line filter: git diff -U0 c75dd42...HEAD -- '*.ts' | grep -E '^[+-]' | grep -vE '^(\+\+\+|---) ' | grep -vE '^[+-][[:space:]]*(//|/?\*)' prints 0 lines. The two non-.ts files in the diff are src/docs/crm_admin.md (the one guide sentence) and the changeset.

  • Token streams: I compared all 102 changed .ts files with the TypeScript compiler API, reporting every differing token as its minimal changed slice. 100 files are identical. The other 2 each differ in exactly one template token, and the slice is inside a // comment of the script body:

    • activity-actions.ts: empty becomes sales/, on the line src/sales/objects/event.hook.ts;
    • opportunity.actions.ts: global. becomes activity-.
    • Positive control: changing const to let is reported (exit 1).
  • Artifact dist/objectstack.json, built by the verify run below:

    string hits
    src/flows/ 0
    new guide sentence 1
    src/sales/objects/event.hook.ts 30
    old src/objects/event.hook.ts 0
    activity-actions.ts (#548) 2
    global.actions.ts 0
  • Paths: 73 distinct new path strings across the whole PR diff, each expanded with compgen -G, 0 missing. The bare names (activity-actions.ts, campaign.hook.ts, campaign_member.hook.ts) each match exactly 1 file with find src -name.

  • The feat(accounts): the account record page header draws the company logo (#1199) #2041 merge was a clean text merge. account.object.ts keeps both sides, and the new imageField comment cites no path.

  • grep -rn "src/flows" src/ now finds one line, src/sales/flows/index.ts:9: "which used to be the allFlows array at the bottom of src/flows/index.ts". It is kept as past state under acceptance 3 of 5686987990 (row 42 of the table).

OS_VERIFY_LOCK_SLOT=hotcrm-1919 bash …/scripts/pm/os-verify-lock.sh -c 'pnpm verify' on head 98cd002:

os-verify-lock: VERDICT command-exit 0 · held the lock 575s (9m35s) · waited 0s
✓ Validation passed (2576ms)
18 suggestion(s) (2398ms)          (objectstack lint --strict)
✓ i18n lint gate: 0 `i18n/missing-*` issues
✓ source hygiene clean
✓ source token ratchet clean
Artifact: dist/objectstack.json (2319.4 KB)
Test Files  173 passed (173)
     Tests  3609 passed | 1 skipped (3610)

Still not in this PR: the 22 comment lines citing test files deleted by #2013. They stay in Acceptance notes.

Superseded by this round (the round-0 text above is left as written; where they disagree, this section holds):

  • The 'What this changes' paragraph ends with 'No non-comment line changes.'. That is now true for the .ts files only: the one guide sentence in src/docs/crm_admin.md and the comments inside two script bodies (activity-actions.ts, opportunity.actions.ts) ship. Suggested replacement: 'No non-comment line changes in any .ts file (round 1 adds one sentence in the in-product admin guide; see Patch round 1).'
  • Counts table row src/objects/ reads '| 32 | 1 | activity-actions.ts:381, inside a template literal (see below) |'. It is now 32 → 0.
  • Evidence bullet 3 ends 'That is why that one site is kept.' Superseded: that site is now changed (see Patch round 1, artifact check).
  • The '## Changeset' section (empty frontmatter, 'releases nothing') is superseded: the changeset is now 'hotcrm': patch.
  • These Acceptance-notes bullets are superseded (fixed in round 1): '- src/docs/crm_admin.md:106: …', '- Seven broken relative paths in comments, from the same move: …', '- Three bare mentions of global.actions.ts without a directory …', '- activity-actions.ts:381 (kept, see the table) …'. The bullet on the 22 lines citing tests deleted by test: run the hook, flow and action suites on @objectstack/verify and retire the five hand-built harnesses #2013 stays.
  • Per-site table: row 1 (src/docs/crm_admin.md:106) and row 18 (src/sales/actions/activity-actions.ts:381) were 'kept'. They are now 'changed', to the guide sentence and to src/sales/objects/event.hook.ts respectively.

Seat decision on round 1's open question: the one remaining src/flows/ line, src/sales/flows/index.ts:9, records where the flow order USED to live. Under the card's criterion (5686987990: a past-state comment keeps its path) and its acceptance 3 (a kept site says why), it stays, and Fixes #1919 holds.


Generated by Claude Code

claude added 5 commits October 9, 2026 14:23
…tories

Comment lines only. A comment that says where something lives today now names
the package path; one that records a past state ("used to be", "split out of
the former") keeps the path it had then. The 32 locale-pack docblocks each
point at their own locale's entry file under src/sales/translations/.

Claude-Session: https://claude.ai/code/session_018Mk4tab2eCyY41UTWK7y7V
Co-authored-by: Claude <noreply@anthropic.com>
…ectories

Comment lines only, same rule as the sales commit. The case-escalation flow's
note names the platform lint rule instead of the test row #2012 retired.

Claude-Session: https://claude.ai/code/session_018Mk4tab2eCyY41UTWK7y7V
Co-authored-by: Claude <noreply@anthropic.com>
…ectories

Comment lines only. quote.hook.ts's two billing-handoff notes name the
contract-activated flow, the one of the two split successors that POSTs a
contract's payment_terms and contract_type; the line-item note names the
platform lint rule instead of the test row #2012 retired.

Claude-Session: https://claude.ai/code/session_018Mk4tab2eCyY41UTWK7y7V
Co-authored-by: Claude <noreply@anthropic.com>
…irectories

Comment lines only. The seed note that cited the retired _campaign-metrics
module now names the four refresh hooks whose inlined recompute it mirrors.

Claude-Session: https://claude.ai/code/session_018Mk4tab2eCyY41UTWK7y7V
Co-authored-by: Claude <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
hotcrm Ignored Ignored Oct 9, 2026 3:05pm UTC

Request Review

@github-actions github-actions Bot added metadata Declarative metadata — schema, security posture, UI surfaces backend Server-side behaviour — hooks, flows, actions labels Oct 9, 2026
claude added 2 commits October 9, 2026 14:49
…tory grep misses

Patch round 1. The admin guide's Automation knobs sentence names each
package's flows directory instead of the removed src/flows/. The comment in
the activity actions' script body names src/sales/objects/event.hook.ts; the
escaped-backtick spelling of that template literal is kept. Seven relative
./_shared.ts and ./_refusal.ts citations name the sales files they mean; the
bare global.actions.ts mentions name activity-actions.ts; and two comments
name the file that now holds campaign_lead_conversion_refresh.

Claude-Session: https://claude.ai/code/session_018Mk4tab2eCyY41UTWK7y7V
Co-authored-by: Claude <noreply@anthropic.com>
…n guide sentence and one script-body comment

Claude-Session: https://claude.ai/code/session_018Mk4tab2eCyY41UTWK7y7V
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added documentation Improvements or additions to documentation ci/cd CI plumbing and the verification pipeline labels Oct 9, 2026
@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 9, 2026 15:21
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 9, 2026
Merged via the queue into main with commit 4fbfde1 Oct 9, 2026
10 checks passed
zhuangjianguo pushed a commit that referenced this pull request Oct 9, 2026
…ssue-2042-account-page-defects

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Mk4tab2eCyY41UTWK7y7V
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend Server-side behaviour — hooks, flows, actions ci/cd CI plumbing and the verification pipeline documentation Improvements or additions to documentation metadata Declarative metadata — schema, security posture, UI surfaces

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] 26 source comments in src/ cite src/flows/ — a directory ADR-0130 removed (blocked on Track A: file surface collides)

2 participants