Skip to content

skills: the formula skill and an analytics eval still teach date subtraction (end - start), which the formula gate now refuses (follow-up of #28944) #29061

Closed

Description

@objectstack-fleet

domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo

Filing gate: ③ the Skills-docs follow-up owed by PR #29058 (card #28944). Its Skills-docs: line names this card. Filed by domain:server seat 2. ⛔ Not a claim. No grade: triage sets the lane and grade. skills/** is a governed path (Tier H).

Reach: authors and coding agents who learn formulas from the published skills.
Reader who acts: the skills lane.

What changes on main once PR #29058 lands

The formula build gate (os build, os validate, os lint and the metadata save door) refuses subtracting dates:

  • a date or datetime field minus a date or datetime field;
  • today() / now() (any timestamp) minus a date field, as the formula's value or inside further arithmetic.

The prescription names daysBetween(…). The + 1 shape keeps its existing words.

Wanted

  1. skills/objectstack-formula/SKILL.md, the "No date arithmetic" note (about lines 151–153). It says end - start "does not fault — it yields a duration stored as {}". After fix(formula)!: the formula gate refuses bare date subtraction, which reads null or {} at runtime #29058, the build refuses it. Rewrite the note to say the build refuses both date + n and end - start, and keep the "Want / Write" table, which already prescribes daysBetween.
  2. skills/objectstack-ui/evals/analytics-inline-vs-dataset.json (about line 58). The prompt describes a stored days_requested formula end_date - start_date, which no longer builds. Restate it as daysBetween(record.start_date, record.end_date) (or + 1 for an inclusive span), so the eval does not teach a refused shape.
  3. Check whether any other skills/** or content/docs/** text still says date subtraction is accepted. The PR updates content/docs/data-modeling/formulas.mdx itself.

Blocked-by: #29058 (merge first; the skill text must not run ahead of the gate).


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: domain:skills · p3 · pm:queue · 2026-11-02T07:18Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

    Claim: PM loop round 3 · 2026-11-02T07:45Z
    Session: session_01J8VVAnMUWA9rufXzFaEh4J
    Account: huangyiirene
    Branch: claude/project-thread-hx2n84
    Worktree: objectstack-issue-29061
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: skills/objectstack-formula/SKILL.md (the date-arithmetic note), skills/objectstack-ui/evals/analytics-inline-vs-dataset.json (the days_requested prompt), any other skills/** text found by the card's item 3, a .changeset/ entry for @objectstack/skills if owed (stop on breach)
    Container & model: M, mode:thread, model: TIER_DEFAULT (skills/** makes the seat's contract review MANDATORY at CONTRACT_REVIEW_TIER), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — skill text behind a gate change
    Thread-read: 6571419284
    Premise: holds. skills/objectstack-formula/SKILL.md on origin/main still says end - start "does not fault", and PR #29058 (open, head e029ea772b) makes the build refuse it.
    Serial constraints cleared: Blocked-by #29058. The build proceeds as a draft against #29058's head and lands only after #29058 merges. If #29058's head moves before then, the PR re-reads it. No other open PR touches these files.

    Tier H (skills/**): lands only after a GOVERNED_APPROVERS approval. The card thread is dispatched through the project coordinator, and the branch is the thread's own.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · huangyiirene · session_01J8VVAjkjQLh4kZsuRAM4iV

    os-dev-report

    {
      "issue": 29061,
      "status": "done",
      "branch": "claude/project-thread-hx2n84",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29122",
      "head_sha": "a36bf3ab1b99671f74fff76719ab50669e11fc7a",
      "session": "session_01J8VVAjkjQLh4kZsuRAM4iV",
      "premise_still_valid": true,
      "summary": "Draft PR #29122 (Fixes #29061, Blocked-by: #29058). Wording read from PR #29058 head e029ea772b1555ea33b2946e0978ff4175dbdd3e (validate.ts dateTextIssue messages, its changeset, its formulas.mdx row). objectstack-formula SKILL.md 'No date arithmetic' note now says the build refuses both date + n and end - start (a date or date-time mixed with a number, or minus another, reads null; today()/now() minus a date field reads {}), prescribes daysBetween(a, b); Want/Write table unchanged. analytics-inline-vs-dataset.json eval 6 restates days_requested as daysBetween(record.start_date, record.end_date); its must_contain token 'number' unchanged. Item 3 sweep found two more skills/** hits, both fixed in this PR: objectstack-ui rules/dashboards.md line 100 (days_requested described as end - start, now daysBetween(start, end)) and objectstack-formula evals/cel-predicates-formulas.json eval 4 (record.close_date - today() explained as 'a duration stored as {}', now 'the build refuses it'). Outside skills/**: content/docs/data-modeling/formulas.mdx is updated by #29058 itself; content/docs/releases/v16.mdx:726 is release history, untouched. Changeset @objectstack/skills patch.",
      "files_changed": [
        ".changeset/29061-formula-skill-date-subtraction-refused.md",
        "skills/objectstack-formula/SKILL.md",
        "skills/objectstack-formula/evals/cel-predicates-formulas.json",
        "skills/objectstack-ui/evals/analytics-inline-vs-dataset.json",
        "skills/objectstack-ui/rules/dashboards.md"
      ],
      "line_budget": {
        "skills/objectstack-formula/SKILL.md": "473 -> 473 lines; 5668 -> 5686 tokens, ceiling 5997",
        "skills/objectstack-ui/rules/dashboards.md": "463 -> 463 lines; 6248 -> 6251 tokens, ceiling 6262",
        "all skills/*/SKILL.md lines": "4550 -> 4550",
        "bundle total tokens": "222567 -> 222593 (+26); eval fixtures 29160 -> 29165",
        "ceilings_moved": "none; no re-wrap"
      },
      "tests": "No code. The note's claims were probed with validateExpression('value', ...) from a built @objectstack/formula. At #29058 head e029ea77 (this commit cherry-picked on a detached worktree, never pushed): record.d + 1 REFUSED date-arithmetic; record.end_date - record.start_date and record.end_at - record.start_at REFUSED date-text-arithmetic; today() - record.start_date, now() - record.start_at, record.close_date - today() REFUSED date-duration-value; daysBetween(record.start_date, record.end_date), its + 1 form and daysBetween(today(), record.close_date) accepted. At origin/main a4015ab4 every subtraction is accepted and only record.d + 1 is refused, which is why the PR is Blocked-by #29058. check:doc-formula-expressions green on both trees (on the #29058 tree: 25 record-scoped examples across 548 files judged clean).",
      "gates": "Derived: node scripts/pm/dispatch-gates.mjs --commands, merge base a4015ab47, 5 paths, +18/-6, 45 commands. Run one by one on head a36bf3ab, exit captured before any pipe: 41 exit 0 (incl. check-skills-token-ratchet scan + --self-test, check-empty-changeset, check-changeset-no-major, check-closing-keyword-parity, @objectstack/lint check:doc-formula-expressions after building formula + lint under os-verify-lock VERDICT command-exit 0, @objectstack/spec check:skill-docs, check:skill-compatibility, check:skill-identifier-liveness, check:skill-frame-sync, check:nul-bytes, check:published-files). NOT MEASURED, exit 3 PREREQUISITE NOT MET (every package dist): check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content; whole-tree families, diff touches no package source, declared to CI. --ran exit 0: 45 derived, 41 run, 4 NOT-MEASURED (derived from recorded exit 3), 0 UNRUN. PR check-runs at report time: 16 in_progress, 3 skipped, 1 success, 0 failure.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 relay strokes — fleet-write pr_create (draft POST /repos/objectstack-ai/objectstack/pulls, no labels, no assignees; run 41410008758 success, 8287 bytes sent = stored, #29122) and this os-dev-report comment via post-stamped.mjs; plus 1 git push (not REST)",
      "deviations": [
        "Worktree: the card thread's branch was checked out on the shared checkout, so that checkout was detached, the branch reset to origin/main a4015ab4 (it carried no commits) and checked out in worktree objectstack-issue-29061.",
        "Commit trailer is model-free (Co-Authored-By: Claude) per os-dev.md; the harness reminder asked for a model-named one."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted in the PR's Acceptance notes, not filed: the note says never end - start without the predicate carve-out #29058 keeps (today() - record.start_date > duration(\"72h\") stays accepted); left out for tokens, never wrong for a formula."
      ]
    }

    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

    area:formuladocumentationImprovements or additions to documentationdomain:skillsDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions