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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions