Skip to content

feat: arXiv inbox tier for the Memory reading queue #57

Closed

Description

@Jammy2211

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
    in validate_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. Neither board.py nor 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
    by git status --porcelain rather 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 existing PAT_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 validate green; 186 PyAutoMind tests green.
  • spawn.py dry-run: PyAutoMemory-template unmatched: 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.yml dispatch ran green and created queue-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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions