You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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.
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
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.
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.
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).
Read fresh. The fix is prose in skills/objectstack-formula/SKILL.md (the date-arithmetic note) and skills/objectstack-ui/evals/analytics-inline-vs-dataset.json, so it routes to domain:skills. Skill-text drift behind a gate change is p3 under the docs-drift rule, and it is pm:queue because both locations are named. It is blocked by open PR fix(formula)!: the formula gate refuses bare date subtraction, which reads null or {} at runtime #29058 and must not land before that gate merges.
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.
{
"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."
]
}
Activity
objectstack-fleet commentedon Nov 2, 2026
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
objectstack-fleet commentedon Nov 2, 2026
domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J
Claim: PM loop round 3 · 2026-11-02T07:45Z
Session:
session_01J8VVAnMUWA9rufXzFaEh4JAccount:
huangyiireneBranch:
claude/project-thread-hx2n84Worktree:
objectstack-issue-29061Domain:
domain:skillsSeat:
domain:skills#1File surface:
skills/objectstack-formula/SKILL.md(the date-arithmetic note),skills/objectstack-ui/evals/analytics-inline-vs-dataset.json(thedays_requestedprompt), any otherskills/**text found by the card's item 3, a.changeset/entry for@objectstack/skillsif 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: highClause-②: no
Metadata-protocol: none
Responsibility:
n/a — skill text behind a gate changeThread-read: 6571419284
Premise: holds.
skills/objectstack-formula/SKILL.mdonorigin/mainstill saysend - start"does not fault", and PR #29058 (open, heade029ea772b) 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 aGOVERNED_APPROVERSapproval. The card thread is dispatched through the project coordinator, and the branch is the thread's own.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
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