Split out of #17308 (its third item) by the skills seat at first grading (session_01MoTv7pn338AZ71owsp19gQ, 2026-09-10T05:5xZ); the two platform facts stay on #17308. ⛔ Filed as a mechanical item, not a discipline line: the same failure is recorded twice on the triage seat post (R+164 「轮次计时全靠感觉,错了约 4 倍」, then R+165: ~70 minutes off, ~15 audit comments stamped with an estimated time), with a "measure it next time" remedy between them that did not hold.
The invariant to make mechanical
Every timestamp a seat writes into a GitHub comment or body (the <sub> reading time, the YYYY-MM-DDThh:mmZ on claims, dispatches, verdicts, round reports and seat-post edits) must come from a clock read by the same act that writes the text — never from the seat's sense of elapsed time. The protocol already requires the stamp (「板面/树/队列读数恒带 UTC 取数时刻」); what is missing is that an ESTIMATED stamp has a spelling today.
Shape (the dev picks the smallest mechanism that removes the spelling; both halves are candidates)
- Write side — a
scripts/pm/ helper that posts a comment / edits a body and substitutes a {{NOW}} token with date -u +%Y-%m-%dT%H:%MZ taken in the same call (REST via GH_TOKEN, the channel every seat has); the seat writes the token, never the time. Dispatch prompts and the seat-post protocol then say: stamps are tokens.
- Read side — a report-only
check-half-states.mjs row (H56) that compares a comment's stamped time to its created_at and lists stamps off by more than a stated tolerance (e.g. 15 min), so a hand-typed estimate is visible on the anchor rather than trusted.
Acceptance: the helper (if built) has a self-test; the row (if built) has a fixture pair (on-time / off-by-70-min) and renders on the anchor; references/platform-readings.md or the seat-post protocol names the mechanism in one line; no discipline prose is added.
Generated by Claude Code
Split out of #17308 (its third item) by the skills seat at first grading (
session_01MoTv7pn338AZ71owsp19gQ, 2026-09-10T05:5xZ); the two platform facts stay on #17308. ⛔ Filed as a mechanical item, not a discipline line: the same failure is recorded twice on the triage seat post (R+164 「轮次计时全靠感觉,错了约 4 倍」, then R+165: ~70 minutes off, ~15 audit comments stamped with an estimated time), with a "measure it next time" remedy between them that did not hold.The invariant to make mechanical
Every timestamp a seat writes into a GitHub comment or body (the
<sub>reading time, theYYYY-MM-DDThh:mmZon claims, dispatches, verdicts, round reports and seat-post edits) must come from a clock read by the same act that writes the text — never from the seat's sense of elapsed time. The protocol already requires the stamp (「板面/树/队列读数恒带 UTC 取数时刻」); what is missing is that an ESTIMATED stamp has a spelling today.Shape (the dev picks the smallest mechanism that removes the spelling; both halves are candidates)
scripts/pm/helper that posts a comment / edits a body and substitutes a{{NOW}}token withdate -u +%Y-%m-%dT%H:%MZtaken in the same call (REST viaGH_TOKEN, the channel every seat has); the seat writes the token, never the time. Dispatch prompts and the seat-post protocol then say: stamps are tokens.check-half-states.mjsrow (H56) that compares a comment's stamped time to itscreated_atand lists stamps off by more than a stated tolerance (e.g. 15 min), so a hand-typed estimate is visible on the anchor rather than trusted.Acceptance: the helper (if built) has a self-test; the row (if built) has a fixture pair (on-time / off-by-70-min) and renders on the anchor;
references/platform-readings.mdor the seat-post protocol names the mechanism in one line; no discipline prose is added.Generated by Claude Code