Repository navigation
feat: arXiv inbox tier for the Memory reading queue #57
Description
Overview
The nightly strong-lensing digest ended in a Slack paste-block: the human copied
it into a Claude Code session, which appended the papers to reading-queue.md.
This replaces that hand-off with an inbox tier — the digest writes its
surviving papers straight into a new arxiv-inbox.md, the knowledge board
renders them with the one-tap actions the reading queue already has, and
un-acted lines lapse after seven days.
The ingest gate does not disappear, it moves: nothing reaches reading-queue.md
without a human tap. This is a deliberate reversal of the "the digest never
commits" constraint set by the paper-management pipeline (#35), and is recorded
as intentional rather than left to read as drift.
Shipped
Pushed straight to main on both repos at the author's direction — no PR on
either leg.
| Repo | Commits |
|---|---|
| PyAutoMemory | 0e4e551 (the tier), 7b94805 (label guarantee) |
| PyAutoMind | ff93809 (digest step + spawn rule), c9bb7cc (completion record) |
arxiv-inbox.md— new root file, format documented in-file, allowlisted
invalidate_structure.py.scripts/inbox_actions.py— the single owner of the line format, the
window and all four transitions (append / sweep / add / dismiss). Stdlib-only
and idempotent. Neitherboard.pynor any workflow's shell re-expresses the
format, and PyAutoMind's digest runs this script inside a checkout rather than
writing the format itself.board.py— collects the inbox, renders it above the reading queue with a
days-left column, and grows the ➕/✖️ tiers. Every action URL now emits
file:, including the reading-queue ones, so the workflows never guess which
file a tap refers to; the older scripts ignore the extra key.queue_actions.yml— one job, three labels. Whether to commit is decided
bygit status --porcelainrather than inferred from a status token, so a
script that dies before printing cannot mis-close the issue.queue_filing.yml— an intake/cite tap on an inbox paper has no queue line
to DONE-mark, so filing appends it to the queue already DONE-prefixed and
clears the inbox line.arxiv_papers.yml— the survivors step runs after the Slack POST on
purpose: the digest is the product, and a cross-repo failure must never cost
the morning's post. Uses the existingPAT_PYAUTOLABS.
Decisions taken
- Lapse semantics: a lapsed line is deleted, not DONE-marked. The
never-delete rule protects reading history; an un-acted suggestion is not
history, and git holds it either way. - Section routing: the digest is strong-lensing-only, so every paper routes
to## Strong Lensing. A multi-section inbox is deferred.
The label trap, hit again
A prefilled issues/new?…&labels=x URL silently drops x when the label does
not exist, and queue_actions.yml gates on the label — so a tapped button on a
missing label looks like it worked and does nothing. This is already recorded
from #42. Fixed structurally rather than by hand: the board now guarantees the
five labels its own buttons reference, on every render.
Worth knowing: knowledge_board.yml's on: push paths filter does not list the
workflow file itself, so the label step did not run on its own push and needed a
manual dispatch.
Validation
- 69 PyAutoMemory tests (35 new) +
make validategreen; 186 PyAutoMind tests green. spawn.pydry-run: PyAutoMemory-templateunmatched: none, canary clean.- Rehearsed end to end against a real clone with today's two survivors: append →
board renders 7d-left rows → re-run adds nothing → sweep drops both on day eight. - The
knowledge_board.ymldispatch ran green and createdqueue-add/queue-dismiss.
Not yet proven live: the digest's own inbox step first runs on the
2026-08-25 02:00 UTC cron, and no button has been tapped yet.
Mind record: complete/2026/08/arxiv-inbox-tier.md.
Activity