Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/knowledge_board.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@ on:
- "bibliography/**"
- "reading-queue.md"
- "arxiv-inbox.md"
- "arxiv-interests.md"
- "index.md"
- "scripts/board.py"
- "scripts/inbox_actions.py"
- "scripts/interests_actions.py"
schedule:
- cron: "45 5 * * 1"
workflow_dispatch:
Expand Down Expand Up @@ -69,6 +71,9 @@ jobs:
ensure queue-intake "5319e7" "reading queue: file this paper fully into the wiki"
ensure queue-add "fbca04" "arXiv inbox: move this paper into the reading queue"
ensure queue-dismiss "d4c5f9" "arXiv inbox: drop this suggestion"
ensure interests-add "fbca04" "arXiv interests: move this paper into the reading queue"
ensure interests-dismiss "d4c5f9" "arXiv interests: drop this suggestion"
ensure interests-clear "b60205" "arXiv interests: clear a whole day's batch"

# The family look (hero, palette, stylesheet) is defined once in the
# Brain and imported by the renderer — never copied in here.
Expand Down
69 changes: 55 additions & 14 deletions .github/workflows/queue_actions.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
name: Queue actions

# The dashboard's mechanical per-paper buttons land here. Three of them:
# The dashboard's mechanical buttons land here — five per-paper, one
# per-batch. Six of them:
#
# ✅ `queue-read` marks a reading-queue.md line `DONE <date> — <title>`
# (never deleted — the reading history)
# ➕ `queue-add` moves an arxiv-inbox.md line into its reading-queue
# section, unread
# ✖️ `queue-dismiss` drops an arxiv-inbox.md line — an un-acted suggestion
# is not reading history, and git history holds it
# ➕ `interests-add` the same move out of arxiv-interests.md, routed by
# the line's own `[Topic]` rather than to one section
# ✖️ `interests-dismiss` the same drop, out of arxiv-interests.md
# 🧹 `interests-clear` drops a whole day's batch from arxiv-interests.md,
# revealing the next day — the interests list is a
# backlog to walk, not a seven-day timer, so this is
# the button that moves it along
#
# Each commits the file it touched, re-renders the dashboard, and closes the
# issue. 📥 `queue-intake` and 📑 `queue-cite` are NOT handled here — they stay
Expand Down Expand Up @@ -35,12 +43,16 @@ concurrency:

jobs:
queue-action:
# One job, three labels. The gate is unchanged: this is a public repo, and
# a stranger's issue must never mutate the queue or the inbox.
# One job, six labels. The gate is unchanged: this is a public repo, and
# a stranger's issue must never mutate the queue, the inbox or the
# interests list.
if: >-
(contains(github.event.issue.labels.*.name, 'queue-read') ||
contains(github.event.issue.labels.*.name, 'queue-add') ||
contains(github.event.issue.labels.*.name, 'queue-dismiss')) &&
contains(github.event.issue.labels.*.name, 'queue-dismiss') ||
contains(github.event.issue.labels.*.name, 'interests-add') ||
contains(github.event.issue.labels.*.name, 'interests-dismiss') ||
contains(github.event.issue.labels.*.name, 'interests-clear')) &&
contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'),
github.event.issue.author_association)
runs-on: ubuntu-latest
Expand All @@ -67,6 +79,18 @@ jobs:
action=dismiss
status=$(python scripts/inbox_actions.py dismiss \
--body-file /tmp/issue_body.txt) || true ;;
*,interests-add,*)
action=interests-add
status=$(python scripts/interests_actions.py add \
--body-file /tmp/issue_body.txt) || true ;;
*,interests-dismiss,*)
action=interests-dismiss
status=$(python scripts/interests_actions.py dismiss \
--body-file /tmp/issue_body.txt) || true ;;
*,interests-clear,*)
action=interests-clear
status=$(python scripts/interests_actions.py clear \
--body-file /tmp/issue_body.txt) || true ;;
*)
action=read
status=$(python scripts/queue_mark_done.py \
Expand All @@ -76,14 +100,15 @@ jobs:
# normalise so the close step reports rather than mis-closing.
case "$status" in
marked|already-done|added|already-there|dismissed|already-gone) ;;
already-clear|cleared:*) ;;
*) status="${status:-error}" ;;
esac
echo "action=${action}" >> "$GITHUB_OUTPUT"
echo "status=${status}" >> "$GITHUB_OUTPUT"
echo "queue action ${action}: ${status}"
# Did anything actually change on disk? Cheaper and more honest than
# inferring it from the status token.
if [ -n "$(git status --porcelain -- reading-queue.md arxiv-inbox.md)" ]; then
if [ -n "$(git status --porcelain -- reading-queue.md arxiv-inbox.md arxiv-interests.md)" ]; then
echo "changed=yes" >> "$GITHUB_OUTPUT"
else
echo "changed=no" >> "$GITHUB_OUTPUT"
Expand All @@ -97,11 +122,14 @@ jobs:
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
case "$ACTION" in
add) msg="queue: add inbox paper to the reading queue" ;;
dismiss) msg="queue: dismiss inbox paper" ;;
*) msg="queue: mark paper read" ;;
add) msg="queue: add inbox paper to the reading queue" ;;
dismiss) msg="queue: dismiss inbox paper" ;;
interests-add) msg="interests: add paper to the reading queue" ;;
interests-dismiss) msg="interests: dismiss paper" ;;
interests-clear) msg="interests: clear the day's batch" ;;
*) msg="queue: mark paper read" ;;
esac
git add reading-queue.md arxiv-inbox.md
git add reading-queue.md arxiv-inbox.md arxiv-interests.md
git commit -m "${msg} (#${ISSUE}) [skip ci]"
for attempt in 1 2 3; do
if git push; then exit 0; fi
Expand All @@ -117,7 +145,14 @@ jobs:
- name: Close or report on the issue
env:
STATUS: ${{ steps.mark.outputs.status }}
ACTION: ${{ steps.mark.outputs.action }}
run: |
# Two suggestion tiers share these statuses, so the comment names
# the one the human actually tapped.
case "$ACTION" in
interests-*) tier="arXiv interests list" ;;
*) tier="arXiv inbox" ;;
esac
case "$STATUS" in
marked)
gh issue close "$ISSUE" --comment \
Expand All @@ -127,19 +162,25 @@ jobs:
"Already marked read in reading-queue.md — nothing to change." ;;
added)
gh issue close "$ISSUE" --comment \
"Added to the reading queue and cleared from the arXiv inbox. Dashboard refresh dispatched." ;;
"Added to the reading queue and cleared from the ${tier}. Dashboard refresh dispatched." ;;
already-there)
gh issue close "$ISSUE" --comment \
"Already in the reading queue — cleared the arXiv inbox line and left the queue alone." ;;
"Already in the reading queue — cleared the ${tier} line and left the queue alone." ;;
dismissed)
gh issue close "$ISSUE" --comment \
"Dropped from the arXiv inbox. Git history still holds the line. Dashboard refresh dispatched." ;;
"Dropped from the ${tier}. Git history still holds the line. Dashboard refresh dispatched." ;;
already-gone)
gh issue close "$ISSUE" --comment \
"Not in the arXiv inbox any more — nothing to change (it may already have lapsed)." ;;
"Not in the arXiv inbox or interests list any more — nothing to change (it may already have lapsed or been cleared)." ;;
cleared:*)
gh issue close "$ISSUE" --comment \
"Cleared ${STATUS#cleared:} paper(s) from the arXiv interests list — the next day's batch is now on the dashboard. Git history still holds the batch. Dashboard refresh dispatched." ;;
already-clear)
gh issue close "$ISSUE" --comment \
"That interests batch is already clear — nothing to change." ;;
no-section)
gh issue comment "$ISSUE" --body \
"Could not process this queue action — the target section does not exist in reading-queue.md. Handle manually; leaving the issue open." ;;
"Could not process this queue action — neither the named section nor the \`## Interests\` fallback exists in reading-queue.md. Handle manually; leaving the issue open." ;;
*)
gh issue comment "$ISSUE" --body \
"Could not process this queue action (status: ${STATUS:-error}) — the paper's line was not found. Handle manually; leaving the issue open." ;;
Expand Down
39 changes: 23 additions & 16 deletions .github/workflows/queue_filing.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
name: Queue filing

# The dashboard's 📥 `queue-intake` / 📑 `queue-cite` buttons open prefilled
# issues; this workflow has Claude file the named paper — bibliography entry,
# issues — from the reading queue or from either suggestion tier
# (`arxiv-inbox.md`, `arxiv-interests.md`), which the issue's `file:` names;
# this workflow has Claude file the named paper — bibliography entry,
# wiki sources section (minimal for cite, full stub for intake, the human's
# notes folded in), DONE-mark on the queue line — and opens a reviewable PR
# that closes the issue. Merge stays human.
Expand Down Expand Up @@ -97,12 +99,17 @@ jobs:

Read /tmp/issue_body.txt (a dashboard queue request). Extract:
- `file:` — which file the line lives in: `reading-queue.md`
(already queued to read) or `arxiv-inbox.md` (an overnight
suggestion, NOT yet in the queue). Absent means reading-queue.md.
(already queued to read), or one of the two overnight suggestion
tiers, NOT yet in the queue — `arxiv-inbox.md` (strong lensing)
and `arxiv-interests.md` (everything else). Absent means
reading-queue.md.
- `section:` — the reading-queue section header,
- `line:` — the exact line as written. An arxiv-inbox.md line is
prefixed `<YYYY-MM-DD> — `; that date is the inbox timestamp, not
part of the title. Strip it before using the title anywhere.
- `line:` — the exact line as written. A suggestion-tier line is
prefixed `<YYYY-MM-DD> — `, and an arxiv-interests.md one may
carry a further `[Topic] ` after that date. Neither is part of
the title: strip both before using the title anywhere. (The
topic is the same value as `section:`, kept on the line so the
file round-trips on its own.)
- `notes:` — the human's free-text notes; treat as absent if it
still holds the "(optional — replace this…)" placeholder.
Read /tmp/issue_label.txt: `queue-intake` (full filing) or
Expand All @@ -129,18 +136,18 @@ jobs:
4. Record it as read, which depends on `file:`:
- `reading-queue.md` → prefix the exact `line:` inside its
`## section` with `DONE <today's date> — ` (never delete it).
- `arxiv-inbox.md` → there is no queue line yet. Append
`DONE <today's date> — <title>[ — <ref>]` to the end of the
`## section` in reading-queue.md (the paper is being filed
now, so it enters the queue already read), then delete the
line from arxiv-inbox.md. An inbox line is a suggestion, not
reading history, so deleting it is correct — the DONE line it
becomes is the history.
- `arxiv-inbox.md` or `arxiv-interests.md` → there is no queue
line yet. Append `DONE <today's date> — <title>[ — <ref>]` to
the end of the `## section` in reading-queue.md (the paper is
being filed now, so it enters the queue already read), then
delete the line from whichever of those two files `file:`
names. A suggestion line is not reading history, so deleting
it is correct — the DONE line it becomes is the history.
5. Run `make validate` and `python -m pytest tests/ -q`; fix your
own filing mistakes until both are green.

Touch ONLY bibliography/, wiki/, reading-queue.md and
arxiv-inbox.md. Do not
Touch ONLY bibliography/, wiki/, reading-queue.md,
arxiv-inbox.md and arxiv-interests.md. Do not
commit — the workflow handles git. If the paper cannot be
identified confidently, write the reason to /tmp/filing_error.txt
and stop without editing anything.
Expand All @@ -164,7 +171,7 @@ jobs:
git config user.email "github-actions[bot]@users.noreply.github.com"
branch="queue-filing/issue-${ISSUE}"
git checkout -b "$branch"
git add bibliography/ wiki/ reading-queue.md arxiv-inbox.md
git add bibliography/ wiki/ reading-queue.md arxiv-inbox.md arxiv-interests.md
if git diff --cached --quiet; then
echo "::error::Claude produced no changes"; exit 1
fi
Expand Down
9 changes: 6 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,12 @@ Self-contained, shared schema:

[`bibliography/`](bibliography/README.md) holds the canonical BibTeX
metadata every wiki cites against; [`reading-queue.md`](reading-queue.md)
is what's waiting to be read and filed, and
[`arxiv-inbox.md`](arxiv-inbox.md) is the overnight suggestions tier in front
of it. New knowledge updates the metadata
is what's waiting to be read and filed. Two overnight tiers sit in front of it:
[`arxiv-inbox.md`](arxiv-inbox.md) (strong lensing, a seven-day timer) and
[`arxiv-interests.md`](arxiv-interests.md) (everything else — black holes,
dark matter, galaxy formation, statistics — as one day's ten at a time, a
backlog you clear a day at a time rather than a timer). New knowledge updates
the metadata
and the claim support together, then passes `make validate` (CI-enforced on
every push).

Expand Down
39 changes: 39 additions & 0 deletions arxiv-interests.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# arXiv interests

The day's ten most relevant arXiv papers that are **not** strong lensing —
black holes, dark matter, galaxy formation, statistics and inference, and
whatever else the digest judges worth a look. Strong lensing has its own tier
(`arxiv-inbox.md`); nothing appears on both.

Format:

- One paper per line: `<YYYY-MM-DD> — [<Topic>] <title>`, optionally followed
by ` — <arXiv id or URL>` (the same title/ref convention as
`reading-queue.md`, plus the topic).
- The date is the arXiv **announcement** date the digest ran against, and it is
what groups the file into **day batches**.
- `[<Topic>]` names the `reading-queue.md` section the ➕ button files the paper
into — these papers span domains, so unlike the strong-lensing inbox there is
no single destination. A topic naming no real section falls back to
`## Interests` (`FALLBACK_SECTION` in `scripts/interests_actions.py`).
- **A backlog, not a timer.** Nothing here lapses. The Dashboard shows the
**oldest un-cleared batch only**, and its 🧹 *clear* button drops that whole
day and reveals the next — so a fortnight away is a fortnight of batches to
cycle through, one tap each, not a fortnight of lost recommendations. This is
the one way this list differs from `arxiv-inbox.md`, which lapses after seven
days.
- Each paper carries the same one-tap actions as the inbox: 📄 straight to the
PDF, ➕ add to the reading queue, 📥 intake into memory, 📑 make citeable,
✖️ dismiss.
- A cleared batch is not lost: git history holds it. Same reasoning as the
inbox sweep — the never-delete rule in `reading-queue.md` protects *reading
history*, and an un-acted suggestion is not history.
- One `last digest: <YYYY-MM-DD>` line, directly below the `---`, records the
last run of the nightly digest — **papers or none** — so an empty list says
*which* kind of empty it is: dated today it is a genuinely quiet day, four
days stale it means the filing is broken and papers were lost. Replaced,
never accumulated.
- Written by PyAutoMind's `arxiv_interests.yml`. Hand edits are safe but will
race a nightly run; prefer the Dashboard buttons.

---
10 changes: 10 additions & 0 deletions index.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ the schema in [`wiki/CLAUDE.md`](wiki/CLAUDE.md).
(`INBOX_WINDOW_DAYS` in `scripts/inbox_actions.py`). Nothing here has been
chosen yet: a suggestion is not reading history, so a lapsed line is dropped
rather than DONE-marked, and git history keeps it.
- [`arxiv-interests.md`](arxiv-interests.md) — the same tier for everything
that is **not** strong lensing: black holes, dark matter, galaxy formation,
statistics. One line per paper as `<YYYY-MM-DD> — [<Topic>] <title>[ — <ref>]`,
where the topic names the reading-queue section ➕ files it into. It differs
from the inbox in one way: it is a **day-batched backlog, not a timer**. Each
run appends that day's ten, the dashboard shows the **oldest un-cleared batch
only**, and one 🧹 *clear* button drops that whole day and reveals the next —
so a fortnight away is a fortnight of batches to cycle through, not a
fortnight of lost recommendations. Same five per-paper actions as the inbox.
Format and transitions live in `scripts/interests_actions.py`.
- [`reading-queue.md`](reading-queue.md) — the paper queue AND the reading
history: `## ` section headers group papers by domain, one title per line,
and a read paper is never deleted — its line gains a `DONE <date> — `
Expand Down
4 changes: 4 additions & 0 deletions reading-queue.md
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,10 @@ Bayesian Computation in Astronomy: Novel methods for parallel and gradient-free
Finding reproducible cluster partitions for the k-means algorithm
Scalable hierarchical BayeSN inference: Investigating dependence of SN Ia host galaxy dust properties on stellar mass and redshift — 2401.08755

## Interests
NOTE Where an `arxiv-interests.md` paper lands when its `[Topic]` names no
NOTE section above — the fallback, not a domain. Re-file from here.

## SETI
Imagining the Alien: Human Projections and Cognitive Limitations — 2602.07284
Results of ten years of UCLA SETI searches with the Green Bank Telescope — 2605.05408
Expand Down
Loading
Loading