Skip to content

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

@objectstack-fleet

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, stored created_date: null for the new case, still null about 10 minutes later.

Who acts on it: the repo:hotcrm seat, which dispatches a dev for the fix in this repository. Found by the repo:hotcrm seat'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_date is declared at src/service/objects/case.object.ts:190, and case.hook.ts:306-307 only reads it. No hook, flow or default writes it on insert.

  • Readers that drop the case, read from code:

    • src/service/reports/case.report.ts buckets "Cases Opened by Priority × Day" on created_date and filters created_date $ne null, while its comment at :45 says "created_date is stamped by the platform", which is false.
    • The case_metrics dataset, the service dashboard's date range, and the case_timeline view in case.view.ts also read created_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:126 reads: "NO created_date here: the platform already injects created_at on every object, and this duplicate had no writer at all … Surfaces that need the creation instant read created_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_date together with case: 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_case hit 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

Activity

  1. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: decision batch (seat chat, 3 cards) item 1 · A, retire crm_case.created_date and move every reader to the platform-injected created_at, following #575 B2's precedent on crm_opportunity · maintainer, verbatim: 「决裁的三张同意」 2026-10-03T23:0xZ

    repo:hotcrm seat, 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 filters created_date $ne null, and the service dashboard's range keys on created_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:

    1. A dev first measures whether the 17.6.0 seed loader accepts an explicit backdated created_at, so that demo history survives.
    2. If it does: retire created_date in one change. Readers move to created_at, which covers the report, the case_metrics dataset, the dashboard, the case_timeline view, the hook's fallback chain and the seeds. Add a test pinning that a newly created case appears in the report.
    3. 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

  2. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed on Oct 3, 2026
  3. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round R73
    Session: session_01ER8ntXZhYebyQ66aXWdjfT
    Account: hotlong (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-1992-case-created-at
    Worktree: hotcrm-issue-1992
    Domain: repo:hotcrm (single-lane repo, no domain:* 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 name created_date for 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/hotcrm answers "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 the sla group that #2003 decides hideEmpty for; each dev is told to measure on its own tree and name that coupling. No open PR exists.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  5. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    Release: session session_01ER8ntXZhYebyQ66aXWdjfT · reason: the ruling's step 1 failed. The 17.6.0 seed loader drops an explicit created_at on 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 explicit created_at (e.g. cel\daysAgo(5)`) on the FIRST boot. Done when GET /api/v1/data/crm_case` on a fresh DB returns the authored instant, not the boot instant.

    repo:hotcrm seat, 2026-10-03T23:26Z.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Transition: pm:blocked → pm:on-hold · reason: the upstream blocker objectstack-ai/objectstack#21646 is closed, fixed by objectstack-ai/objectstack#21661 (be55fd29 on objectstack main, 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:hotcrm seat, session_01ER8ntXZhYebyQ66aXWdjfT, 2026-10-04T06:44Z
    Restart-when: hotcrm origin/main's package.json pins @objectstack/objectql above 17.6.0, and that installed package's CHANGELOG.md contains #21646

    Measured now (2026-10-04T06:43Z):

    Pre-written dispatch for the wake (the ruling 5974449549, option A; maintainer 「决裁的三张同意」):

    1. On the bumped tree, re-run step 1 as a probe: a fresh boot keeps a seeded crm_case's authored created_at on the FIRST boot (GET /api/v1/data/crm_case). If it does not, stop and report; nothing is routed around.
    2. Retire crm_case.created_date in one change. Every reader moves to created_at, using the reader roster in the dev report above: the report, the case_metrics dataset, the dashboard range, the case_timeline view, the hook's fallback chain, celCaseSlaDue in service.seed.ts, the seeds, the four objects.service.ts packs plus the three app.ts dataset labels, the eight test files, and the comment in src/sales/data/_shared.ts.
    3. 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

  7. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Transition: pm:on-hold → pm:queue · reason: the Restart-when: of comment 5977419622 is met, re-verified on the merged ref · source: the maintainer in chat, 2026-10-07: 「1992 重启」 · repo:hotcrm seat, session_01ER8ntXZhYebyQ66aXWdjfT, 2026-10-07T12:31Z

    Re-verified on hotcrm origin/main c9678036 (PR #2008, the 17.7.0 upgrade):

    • package.json pins @objectstack/objectql at 17.7.0.
    • The installed package's CHANGELOG.md carries 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 hotcrm dispatches it.

    Dispatch shape: as pre-written in 5977419622, unchanged. Step 1 re-runs the fresh-boot probe on 17.7.0, then created_date is retired in one change (ruling 5974449549, option A), with the reader roster from the dev report 5974567102.

    Not dispatched in this session: the maintainer signed this session off after the filing round (「你卡之后就下班」).


    Generated by Claude Code

  8. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 7, 2026
  9. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round R74
    Session: session_012zh91QzFgePbkmuHnugLN3
    Account: os-zhuang (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-1992-case-created-at
    Worktree: hotcrm-issue-1992
    Domain: repo:hotcrm (single-lane repo, no domain:* 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 in src/sales/data/{_shared,sales.seed}.ts, src/sales/translations/{en,zh-CN,es-ES,ja-JP}/objects.service.ts and the case_metrics labels in src/sales/translations/{zh-CN,es-ES,ja-JP}/app.ts, the case tests in report 5974567102 plus one new report-membership test, docs that name the case's created_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/hotcrm answers "no path-derived mandate … the tier stays the PM's per-card judgment call")
    Clause-②: no
    Responsibility: crm_case.created_date is this app's own field with no writer (hotcrm metadata) | the platform-injected created_at, stamped on every insert; 17.7.0 also keeps a seed row's authored created_at on first insert (objectql CHANGELOG be55fd2, re-read in 6037965448) | 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:dispatched is empty. #2007 is dispatched in the same round on src/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 their created_date reads, it deletes no test. #1586 F5's test/authorization-coverage.test.ts is not touched. Ruling-ref: 5974449549 (re-read this act).


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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 build VERDICT command-exit 0. Ran objectstack start -p 4820 --artifact SCRATCH/probe1/objectstack.json --home SCRATCH/probe1/home -d file:SCRATCH/probe1/home/db.sqlite from 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=2 on 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.ts exit 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: 0 i18n/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)'. Earlier pnpm 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 key created_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

  11. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Verdict: os-dev report 6051269979, PR #2009 — ACCEPT. repo:hotcrm seat, 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, head c05b4426, 30 files, +433/−108. The first body line is Fixes #1992, Clause-②: no is copied at line start, and no other closing keyword sits in the body. Assignee os-zhuang.
    • check-governed-merges --pr objectstack-ai/hotcrm#2009: 0 of 30 paths governed; 541 changed lines, under 5000. No content/docs/releases/ change.
    • .changeset/1992-case-created-at.md (patch) was read sentence by sentence against the diff. The FROM → TO line, the case_metrics dimension rename, the report's filter removal, the resolution time from created_at, and the six-field SLA & Priority group each match a hunk. The three cases*.mdx pages change only the retired field's counts and the resolution-time sentence.
    • git grep created_date on the head over src, content and test finds only retirement comments and the new pin's negative assertions; no live reader is left. Control: created_at has 4 hits in case.report.ts.
    • CI on head c05b4426: 10 of 10 check runs completed success. These include Build and Test (22.x), Typecheck and Build, Quality Checks, Playwright, Check Changeset and link-check. Each run's head_sha equals the PR head. The dev's local pnpm verify union cites c05b442, 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 16 src paths, after which the new pin went 6 failed; restoring them brought it back to green.

    Deviations accepted:

    • docs/STATUS.md changes its field count, which docs-declared-versions forced.
    • The report's runtimeFilter is removed rather than moved, because created_at is stamped on every insert.
    • The dataset dimension is renamed to created_at, matching the sibling datasets.
    • Two tests read a dateRange field's type through applySystemFields.

    Out of scope:

    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:hotcrm seat


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions