Skip to content

mind: date every active and issued task, and give the dashboard a Recent table - #270

Merged
Jammy2211 merged 1 commit into
mainfrom
claude/pyautomind-task-dates-recent-06v1g7
Aug 23, 2026
Merged

mind: date every active and issued task, and give the dashboard a Recent table#270
Jammy2211 merged 1 commit into
mainfrom
claude/pyautomind-task-dates-recent-06v1g7

Conversation

@Jammy2211

Copy link
Copy Markdown
Collaborator

The Mind dated only what it finished. Every complete/ record carries completed:, but a task that had merely been picked up carried no date a reader could parse — active.md said it in prose when a session remembered to (- issue: …/1501 (issued 2026-08-19)), which nothing could read back. So the Mind could answer "what shipped in July?" and not "what did we start?".

The convention

One machine-readable date field per registry entry, whose key names the event, plus the prompt's own copy in its light header:

Where Field The event it dates
active.md - issued: YYYY-MM-DD the day the task got its GitHub issue
planned.md - filed: YYYY-MM-DD the day it was scoped
parked.md - parked: YYYY-MM-DD the day it stopped
active/<name>.md Issued: YYYY-MM-DD the prompt's own copy, so an orphan stays dated

Reading is tolerant — registered:, started:, planned:, found: and shipped: all count, because the registries are hand-edited by many sessions and an entry that says when it happened should count however it said it. A date sitting in another field's prose deliberately does not: that is the un-parseable habit this replaces. Full schema in REFERENCE.md → "Task dates".

Retroactive backfill

scripts/lifecycle.py dates reports every entry and issued prompt carrying no date; dates --write reconstructs them from evidence the repo already holds, in order:

  1. the commit that introduced the entry, or moved the prompt into active/
  2. the dated registry entry that claims the prompt
  3. a date the entry already stated in its own prose

Nothing is guessed — an entry with no evidence is reported for a human to date by hand. Every inferred date says where it came from, so a wrong backfill is auditable rather than anonymous:

Issued: 2026-08-18 (backfilled from parked.md `parked:`)

Shallow clones are not evidence. A shallow checkout (CI, a cloud session) reports its boundary commit as the day everything older appeared, so every backfill in one clone would come out the same wrong date. Git dates at or before the boundary are discarded and the chain falls through to the Mind's own records — which is exactly what happened writing this change: git offered 2026-08-21 for all four prompts, and the fallback produced 2026-08-08/18/19.

All four issued prompts are backfilled and active.md carries its canonical issued:; lifecycle.py dates now reports OK.

Where the dates get written from now on

/create_issue writes both the registry issued: and the prompt's Issued: header at the one moment anyone knows the date for certain, rather than leaving it to be reconstructed later.

The dashboard payoff

Regenerated dashboard.md / dashboard.html pick up the new Recent table (between Backlog and Epics) and the date facet now carried by In flight / Parked / Planned rows. The renderer itself is the paired PyAutoBrain change.

Testing

  • tests/test_lifecycle_dates.py — 17 new tests: the key naming the event, the most-specific event winning, prose not counting, the backfill's sources and its refusal to guess, insertion that never splits a wrapped header value or a Repos: bullet list, and a real shallow-clone fixture proving the boundary is refused.
  • python3 -m pytest tests/ — 176 passed.
  • lifecycle.py check, lifecycle.py dates, repos_sync.py --check — all clean.

Generated by Claude Code

…ent table

The Mind dated only what it FINISHED. Every complete/ record carries
`completed:`, but a task that had merely been picked up carried no date a
reader could parse — active.md said it in prose when a session remembered to
("- issue: …/1501 (issued 2026-08-19)"), which nothing could read back. So the
Mind could answer "what shipped in July?" and not "what did we start?".

The convention (REFERENCE.md "Task dates"): one machine-readable date field per
registry entry, whose KEY names the event — `issued:` in active.md, `filed:` in
planned.md, `parked:` in parked.md — plus an `Issued:` header on every issued
prompt, its own copy of the registry date so an orphan stays dated. Reading is
tolerant (`registered:`, `started:`, `found:`, `shipped:` all count); a date
buried in another field's prose deliberately does not.

- scripts/lifecycle.py grows `dates`: report every entry and issued prompt
  carrying no date, `--write` to backfill retroactively from the evidence the
  repo already holds — the commit that introduced the entry or moved the prompt
  into active/, the registry entry that claims the prompt, a date the entry
  already stated. Nothing is guessed; an inferred date says where it came from
  ("Issued: 2026-08-18 (backfilled from parked.md `parked:`)"). A shallow clone
  cannot see past its boundary commit, so git dates at or before it are
  discarded rather than stamping every task with the day the clone was made.
- Backfilled all four issued prompts and added active.md's canonical `issued:`.
- create_issue writes both dates at the one moment anyone knows them for
  certain, rather than leaving them to be reconstructed.

The dashboard's new Recent table (between Backlog and Epics, generated by the
intake conductor) is the payoff: the 20 newest task events across every bucket.
Live rows now also wear their date where the task is — a status line reads very
differently against a row issued yesterday than one issued in May.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01L4HPWjv5rdzBAkKpfW1SbR
@Jammy2211
Jammy2211 merged commit 0c8c24a into main Aug 23, 2026
4 of 5 checks passed
Jammy2211 pushed a commit that referenced this pull request Aug 23, 2026
The merge commit regenerated dashboard.md/.html from a PyAutoBrain checkout
that was 5 commits behind origin/main, three of which changed the dashboard
generator (#249/#250/#251 — the Recent-feed work that PyAutoMind #270/#271/#272
landed). That reverted the paged Recent feed: dashboard.html lost 119 lines.

PyAutoBrain updated to ad927eb and both files regenerated. The diff against
main is now +24/-6 — the two new prompts entering the backlog, and nothing
else. `intake dashboard --check` reports current.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_015Mw2KC1M1HKrvTqe5zcEZn
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants