Repository navigation
crm_case.created_date has no writer — a user-created case stores null and drops out of the "Cases Opened by Priority × Day" report and the service dashboard's date range (#575 B2's shape, on the case object) #1992
Description
Activity
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsRuling: decision batch (seat chat, 3 cards) item 1 · A, retire
crm_case.created_dateand move every reader to the platform-injectedcreated_at, following #575 B2's precedent oncrm_opportunity· maintainer, verbatim: 「决裁的三张同意」 2026-10-03T23:0xZrepo:hotcrmseat,session_01ER8ntXZhYebyQ66aXWdjfT. The card was presented in the seat's chat with the recommendation A, fallback B, and the maintainer agreed.What was presented, so the next reader does not need the chat:
- The symptom: a case created through the UI or REST stores
created_date: null. The "Cases Opened by Priority × Day" report filterscreated_date $ne null, and the service dashboard's range keys oncreated_date. So every real new case drops out of both, and managers see only the 38 seeded cases. - A (ruled): one creation timestamp, the platform's, as in Salesforce CreatedDate and Dynamics createdon. Remove the duplicate the app maintains.
- B (fallback): keep the field and stamp it in the hook on insert. That leaves two creation timestamps, permanently.
Execution:
- A dev first measures whether the 17.6.0 seed loader accepts an explicit backdated
created_at, so that demo history survives. - If it does: retire
created_datein one change. Readers move tocreated_at, which covers the report, thecase_metricsdataset, the dashboard, thecase_timelineview, the hook's fallback chain and the seeds. Add a test pinning that a newly created case appears in the report. - If it does not: the seat files it upstream and this card waits (AGENTS.md §2). It does not route around the platform. B comes back only on a new word from the maintainer.
Generated by Claude Code
- The symptom: a case created through the UI or REST stores
- addedpm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3Medium: important, M3and removed
on Oct 3, 2026 objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsClaim: PM loop round R73
Session:session_01ER8ntXZhYebyQ66aXWdjfT
Account:hotlong(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-1992-case-created-at
Worktree:hotcrm-issue-1992
Domain:repo:hotcrm(single-lane repo, nodomain:*taxonomy)
Seat:repo:hotcrm#1
File surface:src/service/objects/case.{object,hook}.ts,src/service/reports/case.report.ts,src/service/datasets/case.dataset.ts,src/service/dashboards/service.dashboard.ts,src/service/views/case.view.ts,src/service/data/service.seed.ts, the service translation packs, docs that namecreated_datefor cases, affected tests, one.changeset/1992-*.md(stop on breach; explain in the report)
Container & model:M,mode:subagent,model: default(dispatch-gates --tier --repo objectstack-ai/hotcrmanswers "no path-derived mandate … the tier stays the PM's per-card judgment call")
Clause-②: no. This is app metadata; it touches no published schema and no accept set.
Thread-read: 5974449549
Serial constraints cleared: three cards are dispatched together under the maintainer's 「决裁的三张同意」: #1992 (src/service/{objects/case.*,reports,datasets,dashboards,views,data}), #2003 (src/sales/pages/lead_detail.page.ts,src/service/pages/case_detail.page.ts) and #2004 (src/sales/objects/opportunity.hook.ts, the 立项 gate test, the qualification docs). Their files are disjoint. #1992 shrinks theslagroup that #2003 decideshideEmptyfor; each dev is told to measure on its own tree and name that coupling. No open PR exists.
Generated by Claude Code
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 1992,
"status": "blocked",
"branch": "claude/issue-1992-case-created-at",
"pr": null,
"session": "session_01ER8ntXZhYebyQ66aXWdjfT",
"premise_still_valid": true,
"summary": "STEP ONE failed, so I stopped there as the dispatch and the ruling 5974449549 require: no code commit, no PR. On a fresh 17.6.0 boot the seed loader does NOT keep an explicit backdated created_at. A seeded crm_case carrying created_at: cel daysAgo(5) came back with the boot instant, and so did a literal ISO value. Retiring created_date now would collapse all 38 demo cases onto the boot day in Cases Opened by Priority x Day and the service dashboard range. The defect is in the platform. objectql's builtin beforeInsert hook sys_stamp_audit_insert overwrites created_at unless session.preserveAudit is true, and SEED_WRITE_EXECUTION_CONTEXT ({ isSystem, skipTriggers, seedReplay }) never sets preserveAudit. The defineSeed shape (object, externalId, mode, env, locale, records) has no option for it. Per AGENTS.md section 2 the card waits for the upstream fix; the seat files it. The card's own premise still holds: created_date has no writer.",
"tests": "STEP ONE probe, no gate run because there is no code change. Scratch artifact = dist/objectstack.json built from origin/main 9466837 (pnpm build under os-verify-lock, VERDICT command-exit 0), copied to scratchpad and edited in the copy only. Two crm_case seed rows were changed: 'Data export timing out for large datasets' got created_at {dialect: cel, source: daysAgo(5)}, and 'How to configure SSO with Okta?' got created_at '2026-09-01T12:00:00.000Z'. Booted with node_modules/.bin/objectstack start -p 4820 --artifact SCRATCH/objectstack.json --home SCRATCH/home -d file:SCRATCH/home/db.sqlite, cwd = the scratch dir, which has no objectstack.config.ts, so objectstack#21501 cannot override the artifact. The boot banner printed 'Artifact: objectstack.json' and the database was fresh. I signed up the first user and read each row with GET /api/v1/data/crm_case. FRESH BOOT (insert path), readings: daysAgo(5) row created_at 2026-10-03T23:16:44.160Z with created_date 2026-09-28T00:00:00.000Z; literal row created_at 2026-10-03T23:16:44.289Z with created_date 2026-09-30T00:00:00.000Z; control row (no created_at supplied) created_at 2026-10-03T23:16:44.033Z. All three carry the seed-time instant, so both explicit values were OVERWRITTEN with the boot time and none was refused. A second boot on the SAME db (seed upsert, update path) moved the same rows to created_at 2026-09-28T00:00:00.000Z and 2026-09-01T12:00:00.000Z, while the control stayed 2026-10-03T23:16:44.033Z. So the seed loader is inconsistent: insert drops an explicit created_at, and a later replay on restart writes it. That reading is for the upstream filing; it is not a usable demo path, because a fresh DB (demo:reset) shows the collapse until a restart. Code readings, all @objectstack 17.6.0: objectql dist/index.js:21491 'record.created_at = preserveAudit ? record.created_at ?? now : now;' inside sys_stamp_audit_insert (beforeInsert, priority 10); spec dist/kernel/index.js:29033 SEED_WRITE_EXECUTION_CONTEXT = { isSystem: true, skipTriggers: true, seedReplay: true }; sys_stamp_audit_update stamps only updated_at, which explains the restart reading. Servers: I stopped my two node PIDs (1467, then 4187) by PID. One deviation: my first restart attempt failed with 'Port 4820 is already in use', because I had killed the nohup subshell PID 1465 and not its node child 1467. I stopped 1467 by PID and re-ran the restart; that first failed restart produced no reading. Token ratchet and pnpm verify: NOT MEASURED, reason: no edit was made, because the stop condition fired before the first edit.",
"mcp_calls": "0",
"api_writes": "1 — POST /repos//issues/1992/comments (this os-dev-report, via post-stamped.mjs). git push of the empty branch claude/issue-1992-case-created-at at 9466837 is not a REST write. No pr_create, no label-write: there is no PR.",
"open_questions": [],
"out_of_scope_findings": [
"Upstream blocker for the seat to file in objectstack (class a, reach: public door, measured above): a seed row's explicit created_at is overwritten on INSERT (sys_stamp_audit_insert, no preserveAudit in SEED_WRITE_EXECUTION_CONTEXT) but written on the upsert UPDATE of a later boot. One card covers both halves, because they are one inconsistency. Dedupe words: seed created_at overwritten · preserveAudit seed context · sys_stamp_audit_insert seed · backdated created_at seed",
"Coupling for #2003, measured on origin/main 9466837: the case object's sla fieldGroup has 7 members (priority, created_date, closed_date, first_response_date, resolution_time_hours, sla_due_date, is_sla_violated). Once #1992 resumes and created_date retires, 6 remain: priority, closed_date, first_response_date, resolution_time_hours, sla_due_date, is_sla_violated. carrier: #2003's dev · noted, not filed",
"Reader roster for the resume dispatch, from git grep on origin/main 9466837. Beyond the dispatch's list it includes: translations in src/sales/translations/{en,zh-CN,es-ES,ja-JP}/objects.service.ts plus the case_metrics dataset-dimension label created_date in {zh-CN,es-ES,ja-JP}/app.ts at about lines 218-220; test/{case-create-form-narrowing,dashboard-agent-global-filter,dashboard-date-range-window,dataset-granularity,docs-service-index-analytics,opportunity-creation-date,seed-consistency,action-references}.test.ts; the celCaseSlaDue derivation in service.seed.ts, which keys on created_date; and the comment in src/sales/data/_shared.ts:45. No hit under content/docs. carrier: the #1992 resume dispatch · noted, not filed"
]
}
Generated by Claude Code
- added and removedpm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatch
on Oct 3, 2026 objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsRelease: session
session_01ER8ntXZhYebyQ66aXWdjfT· reason: the ruling's step 1 failed. The 17.6.0 seed loader drops an explicitcreated_aton INSERT (dev report on this card) · destination:pm:blocked, unassigned, assignee cleared in the same act
Blocked-by: objectstack-ai/objectstack#21646
Restart-when: a fresh boot on the installed@objectstack/*keeps a seed row's explicitcreated_at(e.g.cel\daysAgo(5)`) on the FIRST boot. Done whenGET /api/v1/data/crm_case` on a fresh DB returns the authored instant, not the boot instant.repo:hotcrmseat, 2026-10-03T23:26Z.- Why this waits: the ruling
5974449549(maintainer 「决裁的三张同意」, option A) made step 1 a precondition, so that retiringcreated_datedoes not collapse the 38 demo cases onto one day. The measured cause is in the platform:sys_stamp_audit_insertoverwritescreated_atunlesspreserveAuditis set;SEED_WRITE_EXECUTION_CONTEXTnever sets it;- a second boot's upsert then writes the authored value, an inconsistency filed upstream as A seed row's explicit
created_atis overwritten with the boot instant on INSERT (seed context sets nopreserveAudit), yet written on the upsert UPDATE of a later boot — seeds cannot backdate creation time consistently objectstack#21646.
- Not done here, per AGENTS.md §2: no app-side workaround and no half landing. Option B (stamp
created_datein the hook) returns only on a new word from the maintainer. - Carried for the restart dispatch: the dev's full reader roster is in the report above. It covers the translations in four
objects.service.tspacks plus threeapp.tsdataset labels, eight test files, and thecelCaseSlaDuederivation inservice.seed.ts. Theslagroup's remaining members after the retirement were handed to Lead and case detail pages: show the sections a user is expected to fill even while empty (hideEmpty: false), the way #1211 did for the opportunity page #2003. - The empty claim branch
claude/issue-1992-case-created-at(at94668373, no commits) is left as a marker, not a live claim.
Generated by Claude Code
- Why this waits: the ruling
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsTransition:
pm:blocked→pm:on-hold· reason: the upstream blocker objectstack-ai/objectstack#21646 is closed, fixed by objectstack-ai/objectstack#21661 (be55fd29on objectstackmain, merged 2026-10-04T02:35Z), but no published@objectstack/*release carries it yet. hotcrm consumes published packages, so the unlock criterion is "installable", not "merged" (pm-dispatch SKILL, cross-repo unlock) · source: seat grading,repo:hotcrmseat,session_01ER8ntXZhYebyQ66aXWdjfT, 2026-10-04T06:44Z
Restart-when: hotcrmorigin/main'spackage.jsonpins@objectstack/objectqlabove 17.6.0, and that installed package'sCHANGELOG.mdcontains#21646Measured now (2026-10-04T06:43Z):
- npm
@objectstack/objectqldist-tags:latestis17.6.0. hotcrmmain(4054ec26) pins17.6.0forcli,objectql,runtimeandspec. - The published
17.6.0tarball'sCHANGELOG.mdhas 0 hits for21646, so the probe reads negative today. The fix's changeset (.changeset/21646-seed-created-at.md,@objectstack/objectqlpatch) ends its summary with(#21646), so the next release's changelog will carry it. - Re-derived for new blockers: none. The fix keys the insert stamp on
seedReplay, and the upstream dev measured that all three seed writers pass that context, includingSeedLoaderService, whichobjectstack startuses.celvalues are resolved before the insert/update decision, socel`daysAgo(5)`is covered. The follow-up the upstream lane filed (A system-context write skips value-shape validation for readonly fields: a seed's malformed readonly datetime ('yesterday', an unresolvedcelenvelope) is stored verbatim, while the same value on a non-readonly field is refused objectstack#21663, readonly value-shape validation skipped on system writes) does not gate this card.
Pre-written dispatch for the wake (the ruling
5974449549, option A; maintainer 「决裁的三张同意」):- On the bumped tree, re-run step 1 as a probe: a fresh boot keeps a seeded
crm_case's authoredcreated_aton the FIRST boot (GET /api/v1/data/crm_case). If it does not, stop and report; nothing is routed around. - Retire
crm_case.created_datein one change. Every reader moves tocreated_at, using the reader roster in the dev report above: the report, thecase_metricsdataset, the dashboard range, thecase_timelineview, the hook's fallback chain,celCaseSlaDueinservice.seed.ts, the seeds, the fourobjects.service.tspacks plus the threeapp.tsdataset labels, the eight test files, and the comment insrc/sales/data/_shared.ts. - Pin with a test that a newly created case appears in "Cases Opened by Priority × Day". One
.changeset/1992-*.md.
The
@objectstack/*bump itself is not this card's work. It arrives the way #1982 brought 17.6.0.
Generated by Claude Code
- npm
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsTransition:
pm:on-hold→pm:queue· reason: theRestart-when:of comment5977419622is met, re-verified on the merged ref · source: the maintainer in chat, 2026-10-07: 「1992 重启」 ·repo:hotcrmseat,session_01ER8ntXZhYebyQ66aXWdjfT, 2026-10-07T12:31ZRe-verified on hotcrm
origin/mainc9678036(PR #2008, the 17.7.0 upgrade):package.jsonpins@objectstack/objectqlat17.7.0.- The installed package's
CHANGELOG.mdcarries the fix:be55fd2: A seed row's authored created_at is kept when the row is first inserted, the same as when a later boot replays it (#21646)., in its 17.7.0 section.
The standing hold does not apply to this card. The maintainer's 「hotcrm延后,先处理平台」 holds back new hotcrm dispatches, and 「1992 重启」 names this one. The next
/pm-dispatch hotcrmdispatches it.Dispatch shape: as pre-written in
5977419622, unchanged. Step 1 re-runs the fresh-boot probe on 17.7.0, thencreated_dateis retired in one change (ruling5974449549, option A), with the reader roster from the dev report5974567102.Not dispatched in this session: the maintainer signed this session off after the filing round (「你卡之后就下班」).
Generated by Claude Code
- addedpm:queueReady for the PM dispatch loopReady for the PM dispatch looppm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatchand removedpm:queueReady for the PM dispatch loopReady for the PM dispatch loop
on Oct 7, 2026 objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsClaim: PM loop round R74
Session:session_012zh91QzFgePbkmuHnugLN3
Account:os-zhuang(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-1992-case-created-at
Worktree:hotcrm-issue-1992
Domain:repo:hotcrm(single-lane repo, nodomain:*taxonomy)
Seat:repo:hotcrm#1
File surface:src/service/objects/case.{object,hook}.ts,src/service/reports/case.report.ts,src/service/datasets/case.dataset.ts,src/service/dashboards/service.dashboard.ts,src/service/views/case.view.ts,src/service/data/service.seed.ts, the comments insrc/sales/data/{_shared,sales.seed}.ts,src/sales/translations/{en,zh-CN,es-ES,ja-JP}/objects.service.tsand thecase_metricslabels insrc/sales/translations/{zh-CN,es-ES,ja-JP}/app.ts, the case tests in report5974567102plus one new report-membership test, docs that name the case'screated_date, one.changeset/1992-*.md(stop on breach; explain in the report)
Container & model:M,mode:subagent,model: default(dispatch-gates --tier --repo objectstack-ai/hotcrmanswers "no path-derived mandate … the tier stays the PM's per-card judgment call")
Clause-②: no
Responsibility:crm_case.created_dateis this app's own field with no writer (hotcrm metadata) | the platform-injectedcreated_at, stamped on every insert; 17.7.0 also keeps a seed row's authoredcreated_aton first insert (objectql CHANGELOGbe55fd2, re-read in6037965448) | every user who creates a case through the UI or REST, and every manager reading "Cases Opened by Priority × Day" and the service dashboard range, today
Thread-read: 6037965448
Serial constraints cleared: no open PR in the repo;pm:dispatchedis empty. #2007 is dispatched in the same round onsrc/marketing/**, disjoint. Epic #1579 F3 (#1584) names the analytics tests as territory; it has no claim, no branch and no activity since 2026-09-06, and this card only moves theircreated_datereads, it deletes no test. #1586 F5'stest/authorization-coverage.test.tsis not touched. Ruling-ref: 5974449549 (re-read this act).
Generated by Claude Code
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 1992,
"status": "done",
"branch": "claude/issue-1992-case-created-at",
"pr": "#2009",
"session": "session_012zh91QzFgePbkmuHnugLN3 (subagent; the parent PM seat's session)",
"premise_still_valid": true,
"summary": "STEP ONE passed before any edit. On c967803 (@objectstack/* 17.7.0), a fresh-database boot of an edited copy of the built artifact kept both authored seed instants on the first insert, so I executed ruling 5974449549 option A in one change. crm_case.created_date is retired, and every reader now uses the platform's created_at: the report column (its created_date $ne null runtimeFilter is removed), the case_metrics day dimension (renamed created_date to created_at), the dashboard dateRange and the daily_case_volume chart, case_timeline, the case_sla_defaults resolution-time chain, the seeds and celCaseSlaDue, the 4 objects.service packs and the 3 app.ts dimension keys, the docs and 8 tests. A new kernel-executed pin shows that a case created with no date is counted by Cases Opened by Priority x Day and inside the dashboard range, and that a seed-context row keeps its authored created_at. files_changed (30): .changeset/1992-case-created-at.md; content/docs/service/cases{,.zh-Hans,.zh-Hant}.mdx; docs/STATUS.md; src/sales/data/{_shared,sales.seed}.ts; src/sales/translations/{en,zh-CN,es-ES,ja-JP}/objects.service.ts; src/sales/translations/{zh-CN,es-ES,ja-JP}/app.ts; src/service/{dashboards/service.dashboard,data/service.seed,datasets/case.dataset,objects/case.hook,objects/case.object,reports/case.report,views/case.view}.ts; test/{action-references,case-create-form-narrowing,case-creation-date(new),dashboard-agent-global-filter,dashboard-date-range-window,dataset-granularity,docs-service-index-analytics,opportunity-creation-date,seed-consistency}.test.ts. Deviations from the dispatch: (1) docs/STATUS.md is outside the claim's file surface. test/docs-declared-versions forced it: the validate transcript reads 358 fields, not 359. (2) The report's runtimeFilter is removed rather than moved to created_at, because the platform stamps created_at on every insert and nothing is left to exclude. (3) The dataset dimension is renamed as well as re-pointed, matching account_metrics and lead_metrics. The changeset states it FROM → TO. (4) action-references and dashboard-date-range-window now read a dateRange field's type through applySystemFields. Without that, created_at (injected, never declared) fails the dangling-range guard and empties datetimeWindowed. (5) Changeset bump is patch, the same as #575 B2. (6) Non-readings: the first two step-one boots failed sign-up (403 MISSING_OR_NULL_ORIGIN, then INVALID_ORIGIN for 127.0.0.1), and the first post-change REST POST returned 400 'Description is required'. Each was re-run after fixing the probe; none produced a reading. (7) The first pnpm verify, on 0e354fa, was red only on docs-declared-versions. c05b442 is green. (8) The repo's labeler applied the PR labels documentation, ci/cd, metadata and backend; I wrote none. Coupling with #2003: the sla group now has 6 members (priority, closed_date, first_response_date, resolution_time_hours, sla_due_date, is_sla_violated). The case_detail.page.ts hideEmpty note already names exactly the 3 non-strip members, so it reads right. The worktree and its node_modules are removed; every probe server was stopped by PID (port 4820 has no listener).",
"tests": "STEP ONE (fresh boot, tree c967803, before any edit):pnpm buildVERDICT command-exit 0. Ranobjectstack start -p 4820 --artifact SCRATCH/probe1/objectstack.json --home SCRATCH/probe1/home -d file:SCRATCH/probe1/home/db.sqlitefrom a dir with no objectstack.config.ts (dbExistedBefore=false; banner 'No objectstack.config.ts found — booting from artifact'). GET /api/v1/data/crm_case returned 38 rows. 'Data export timing out for large datasets' authored created_at cel daysAgo(5) read back 2026-10-03T00:00:00.000Z. 'How to configure SSO with Okta?' authored 2026-09-01T12:00:00.000Z read back 2026-09-01T12:00:00.000Z. The control 'Login issues after platform upgrade' read back 2026-10-08T02:31:17.592Z (seed-time instant). Probe VERDICT command-exit 0. TARGETED (working tree = 9440aec):vitest run --maxWorkers=2on 10 files (the 8 roster tests, case-creation-date, hooks-runtime-service) gave 'Test Files 10 passed (10)', 'Tests 243 passed | 1 skipped (244)', VERDICT command-exit 0. REVERSE VERIFICATION at HEAD 9440aec: 16 src paths of f7b9192 checked out from c967803. On-disk proof: case.object 'created_date: Field.datetime' count=1, report "columns: ['created_date']" count=1, 16 paths differ from HEAD.vitest run test/case-creation-date.test.tsexit 1, 'Tests 6 failed | 2 passed (8)'. The executed legs failed with 'the report dropped a case: []: expected +0 to be 2' and 'the last-7-days range left a case out: expected +0 to be 2'. Restore: git checkout HEAD -- 16 paths; git diff HEAD empty; 16 blob hashes = HEAD. Predicted direction red, observed red. POST-CHANGE FRESH BOOT (artifact built from 0e354fa, unedited): POST /api/v1/data/crm_case 201, CASE-00039, created_at 2026-10-08T02:47:06.056Z. GET crm_case returned 39 rows on 31 distinct created_at days (2026-09-08..2026-10-08). The only 2026-10-08 row is the REST case. POST /api/v1/analytics/dataset/query on case_metrics: [priority, created_at] x case_count gave 39 cells, total 39, with {High, 2026-10-08, 1}. created_at last_90_days = 39; last_7_days = 15. GATE:pnpm verify@ c05b442 (rev-parse printed by the run), VERDICT command-exit 0. validate '✓ Validation passed'. typecheck exit 0. lint '1 warning(s), 18 suggestion(s)' (the pre-existing sales_home_page page:card warning). lint:i18n-gate '✓ i18n lint gate: 0i18n/missing-*issues'. hygiene '✓ source hygiene clean'. hygiene:tokens '✓ source token ratchet clean' (src/service authored 20,549 → 20,478). build '✓ Build complete', 9 author-time warnings (base 9). test 'Test Files 178 passed (178)', 'Tests 3803 passed | 1 skipped (3804)'. Earlierpnpm verify@ 0e354fa: VERDICT command-exit 1, one failure, docs-declared-versions 'Fields: page says 359, the stack registers 358'; fixed in c05b442. TYPO PROBE (trap-restored, tree c05b442): seed key created_atx on crm_case; tsc --noEmit exit 0; pnpm validate exit 0 '✓ Validation passed'; restore: diff HEAD empty, blob hash = HEAD. CI (ci.yml, code-quality.yml, e2e.yml, docs-app.yml, link-check.yml, changeset-check.yml): in_progress, not awaited.",
"mcp_calls": "0",
"api_writes": "3, each executed by the fleet-write relay as objectstack-fleet[bot] (each relay hop is one POST /repos/objectstack-ai/objectstack/dispatches): (1) POST /repos/objectstack-ai/hotcrm/pulls, pr_create, draft #2009, body read back 11233/11233 bytes identical; (2) POST /repos//issues/2009/assignees, label-write --assign os-zhuang, read back MATCHES; (3) POST /repos//issues/1992/comments, this os-dev-report via post-stamped.mjs. Not REST writes: four git push commands of claude/issue-1992-case-created-at, the first a fast-forward 9466837..c967803 and the last landing at c05b442.",
"open_questions": [],
"out_of_scope_findings": [
"class: b · reach: os validate (pnpm validate) exit 0 '✓ Validation passed' and tsc --noEmit exit 0 on a crm_case seed record carrying the undeclared keycreated_atx, measured on hotcrm c05b442 (trap-restored); the runtime fate of the key is NOT MEASURED · evidence: @objectstack/spec 17.7.0 defineSeed JSDoc, verbatim: 'Infers valid field keys from the object definition passed in, so typos in record field names are caught at compile time.' Seam: spec:defineSeed / SeedRecord(TObj fields) → consumer: tsc over hotcrm src//data/.seed.ts with objects built by ObjectSchema.create, plus os validate (no seed-key check). The cause (a field-key type widened to string) is not measured. Platform-side: it belongs upstream in objectstack, never fixed in hotcrm (AGENTS.md §1-§3) · dedupe words: defineSeed typo not caught · SeedRecord keyof fields · seed record unknown key validate · defineSeed compile-time field check",
"carrier: 承接者:无 · noted, not filed — content/docs/service/cases{,.zh-Hans,.zh-Hant}.mdx 'The detail screen' still says the Details tab declares three authored sections (Case Information / Status & SLA / Description, 10 fields), while case_detail.page.ts has declared six{ group }sections since #970. Pre-existing and not touched beyond the retired field's counts; recorded in the PR's Acceptance notes.",
"carrier: 承接者:无 · noted, not filed — pre-existing token-ratchet advisory 'src/service interaction layer … re-anchor this ceiling to ~6,000' (headroom 1,403 on base, 1,405 here); not acted on, outside this card."
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsVerdict: os-dev report
6051269979, PR #2009 — ACCEPT.repo:hotcrmseat,session_012zh91QzFgePbkmuHnugLN3, 2026-10-08T03:03Z.Checked on GitHub and on the tree, not taken from the report:
- PR fix(service): retire crm_case.created_date — cases use the platform's created_at #2009: draft, base
main, headc05b4426, 30 files, +433/−108. The first body line isFixes #1992,Clause-②: nois copied at line start, and no other closing keyword sits in the body. Assigneeos-zhuang. check-governed-merges --pr objectstack-ai/hotcrm#2009: 0 of 30 paths governed; 541 changed lines, under 5000. Nocontent/docs/releases/change..changeset/1992-case-created-at.md(patch) was read sentence by sentence against the diff. The FROM → TO line, thecase_metricsdimension rename, the report's filter removal, the resolution time fromcreated_at, and the six-field SLA & Priority group each match a hunk. The threecases*.mdxpages change only the retired field's counts and the resolution-time sentence.git grep created_dateon the head oversrc,contentandtestfinds only retirement comments and the new pin's negative assertions; no live reader is left. Control:created_athas 4 hits incase.report.ts.- CI on head
c05b4426: 10 of 10 check runs completedsuccess. These include Build and Test (22.x), Typecheck and Build, Quality Checks, Playwright, Check Changeset and link-check. Each run'shead_shaequals the PR head. The dev's localpnpm verifyunion citesc05b442, the same head.
The ruling's precondition, read from the report: step one ran before any edit, on a fresh-database boot of
c9678036.cel`daysAgo(5)`was kept as 2026-10-03T00:00Z, and the literal 2026-09-01T12:00Z was kept; the control row carries the seed instant. The reverse verification reverted 16srcpaths, after which the new pin went 6 failed; restoring them brought it back to green.Deviations accepted:
docs/STATUS.mdchanges its field count, whichdocs-declared-versionsforced.- The report's
runtimeFilteris removed rather than moved, becausecreated_atis stamped on every insert. - The dataset dimension is renamed to
created_at, matching the sibling datasets. - Two tests read a
dateRangefield's type throughapplySystemFields.
Out of scope:
defineSeedlets a misspelled key pass bothtscandos validate, against its own docblock. Class (b); filed upstream as spec:defineSeedaccepts a misspelled record key at compile time andos validatepasses it, although its JSDoc promises "typos in record field names are caught at compile time" objectstack#22149.- The "detail screen" paragraph in
cases*.mdxis stale, and the token-ratchet advisory stands. Both are pre-existing and are left in the PR's Acceptance notes.
Landing: the PR is not governed, under the size threshold and fully green, so it goes ready, then auto-merge through the merge queue.
Implemented-by: os-dev subagent of this session (branch
claude/issue-1992-case-created-at) · Reviewed-by:repo:hotcrmseat
Generated by Claude Code
- PR fix(service): retire crm_case.created_date — cases use the platform's created_at #2009: draft, base
- removedpm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatch
on Oct 8, 2026
Filing gate: ① product defect with reach measured. Class (a). reach: public door.
POST /api/v1/data/crm_case, as an admin on 17.6.0, storedcreated_date: nullfor the new case, still null about 10 minutes later.Who acts on it: the
repo:hotcrmseat, which dispatches a dev for the fix in this repository. Found by therepo:hotcrmseat's dev while measuring #1211 (session_01ER8ntXZhYebyQ66aXWdjfT). ⛔ Not a claim. First-touch grading is pending.Measured (hotcrm
1e47470e,@objectstack/*17.6.0)A case created through the REST data API (CASE-00039) stores
created_date: null. All 38 seeded cases carry the field, because the seed sets it. On the probe database, 1 of 39 cases is null: the REST-created one.No writer, checked by the seat on
origin/main:crm_case.created_dateis declared atsrc/service/objects/case.object.ts:190, andcase.hook.ts:306-307only reads it. No hook, flow or default writes it on insert.Readers that drop the case, read from code:
src/service/reports/case.report.tsbuckets "Cases Opened by Priority × Day" oncreated_dateand filterscreated_date $ne null, while its comment at:45says "created_dateis stamped by the platform", which is false.case_metricsdataset, the service dashboard's date range, and thecase_timelineview incase.view.tsalso readcreated_date.So every user-created case falls out of that report and that dashboard range. The rendered consequence was not screenshotted; it follows from the
runtimeFilter/startDateField.Precedent
#575 B2 retired exactly this shape on
crm_opportunity.src/sales/objects/opportunity.object.ts:126reads: "NOcreated_datehere: the platform already injectscreated_aton every object, and this duplicate had no writer at all … Surfaces that need the creation instant readcreated_at." The case object kept its copy.Duplicate check
All hotcrm issues, open and closed: 745 issues over 19 REST pages, read to the short page. Title and body were grepped for
created_datetogether withcase: 16 hits, all closed and none on this defect. #575 is the opportunity precedent; the rest are docs, dashboard, dataset-granularity and seed cards. Positive control:crm_casehit 76.Dedupe words: case created_date null · created_date no writer · cases opened by day priority · created_at vs created_date.
Generated by Claude Code