fix(orders): a pending order's age comes from the filename, not the mtime

`coord-order-done --return` rewrites the order file's mtime, and both age
surfaces read mtime, so putting an order back reset the very reading that
says how long it has waited. An order returned three times could never look
old - on the one surface that exists precisely so a repo nobody opens still
shows something.

Found by reading the board right after this repo returned an order of its
own, not by looking for it: a file whose name says 2026-09-02 rendered
`ORDRE 1:0d` and `pending, 0d old` minutes later. Verified live after the
fix: the same order now reads 1d.

Two questions, two sources, and only one of them moved. A PENDING order's
age is "how long has this sat with no owner" = now - delivery time, which
only the filename carries and nothing rewrites. A CLAIMED order's age is
"how long has it been in flight", which is the claim's own mtime and was
already right. So oldest_pending_age() sits BESIDE oldest_order_age(), and
pending_age_of() beside age_of() - switching FLY to the filename would
answer the delivery question in the column that asks the flight question.
An unparseable filename yields "?" for the whole reading, never a
fabricated 0, because an unmeasured order could be the oldest one.

TDD, red first: orders-selftest section 11 (110 -> 116) and board-selftest
section 30 (360 -> 368), each asserting its own ground truth before
anything depends on it, with controls that a freshly delivered order still
reads 0d and that FLY did not move. Mutation-verified in both files:
restoring the mtime read turns exactly the defect checks red and leaves
every control green.

Section 28's fixtures were rewritten as part of this rather than
incidentally: they encoded their ages in `touch -t` while their filenames
held fixed 2026-01/2026-08 dates, which a filename-based reading makes both
wrong and time-dependent. They now compute their stems from `date -v` and
the section asserts two ground truths, the filename for ORDRE and the mtime
for FLY.

Order 20260903T185736Z-1290610855 (.claude). Version 0.32.1 across all
seven files; no catalog change in this session.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-03 22:17:26 +02:00
commit 5316688844
13 changed files with 332 additions and 24 deletions

View file

@ -5,6 +5,45 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.32.1] - 2026-09-03
### Fixed
- **A pending order's age is read from the FILENAME, never the mtime.**
`coord-order-done --return` rewrites the order file's mtime, and both age
surfaces read mtime, so returning an order reset the very reading that says
how long it has waited. An order returned three times could never look old.
Found by reading the board immediately after this repo returned an order of
its own: a file whose name says 2026-09-02 rendered `ORDRE 1:0d` and
`pending, 0d old` minutes later. The filename is written once, at delivery,
and nothing rewrites it - which is exactly the fact "how long has this sat
with no owner" is asking about.
Two questions, two sources, and the second one does not move: a CLAIMED
order's age is "how long has it been in flight", which is the claim's own
mtime and was already right. `board.sh` gains `oldest_pending_age()` beside
`oldest_order_age()`; `coord-order-inbox.sh` gains `pending_age_of()` beside
`age_of()`. Switching FLY to the filename would answer the delivery question
in the column that asks the flight question.
An unparseable filename yields `?` for the whole reading, never a fabricated
`0` - the same fail-safe the mtime path already carried, and for the same
reason: an unmeasured order could be the oldest one.
Pinned by `orders-selftest.sh` section 11 (116 checks, up from 110) and
`board-selftest.sh` section 30 (368, up from 360), each with its ground truth
asserted before anything depends on it and with known-positive controls that
a freshly delivered order still reads `0d` and that FLY did not move.
Mutation-verified in both files: restoring the mtime read turns exactly the
defect checks red and leaves every control green.
Section 28's fixtures were rewritten as part of this, not incidentally: they
encoded their intended ages in `touch -t` with fixed 2026-01/2026-08
filenames, which a filename-based reading makes wrong and time-dependent.
They now compute their stems from `date -v`, and the section asserts two
ground truths - the filename for ORDRE, the mtime for FLY - because the two
columns no longer read the same source.
## [0.32.0] - 2026-09-01
Two commits, and the first of them was already written when this release