From 86326c1f2677484b2906d8142891e8d023ba803e Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sat, 30 May 2026 16:07:39 -0500 Subject: chore(ai): archive session record + lint follow-ups --- .ai/session-context.org | 81 ------------- ...6-drill-deck-anki-buildout-and-script-tests.org | 129 +++++++++++++++++++++ inbox/lint-followups.org | 4 + 3 files changed, 133 insertions(+), 81 deletions(-) delete mode 100644 .ai/session-context.org create mode 100644 .ai/sessions/2026-05-30-16-06-drill-deck-anki-buildout-and-script-tests.org create mode 100644 inbox/lint-followups.org diff --git a/.ai/session-context.org b/.ai/session-context.org deleted file mode 100644 index 7d32f3b..0000000 --- a/.ai/session-context.org +++ /dev/null @@ -1,81 +0,0 @@ -#+TITLE: Session — lint-followups inbox pass -#+DATE: 2026-05-30 - -* Summary - -** Active Goal -** Decisions -** Data Collected / Findings -** Files Modified -** Next Steps - -* Session Log - -** 2026-05-30 07:30 CDT — startup + inbox - -Startup ran clean: both repos current, no crashed session, no reminders/pending decisions, no cross-agent messages, no stale tasks, language bundle clean. One inbox item: =lint-followups.org=, five lint findings on =todo.org= from the lint-org pipeline (script source). - -Triaged the five against the actual lines: -- 1213 invalid-custom-id-link — link points to nonexistent CUSTOM_ID =#16 Generic agent runtime support=; target heading (1165) has no CUSTOM_ID. Real. Fix: fuzzy heading link. -- 1176, 2429 obsolete-properties-drawer — two =LAST_REVIEWED= drawers sit at the bottom of their task bodies, detached from the heading, so org treats them as inert text. Real. Fix: relocate each drawer to directly under its heading (1165 and 2415). -- 2371, 1718 misplaced-heading — both flag verbatim org markup inside prose (=** DONE=, =** Startup Pull Ordering=). Verbatim-marker false-positive class (seen 2026-05-25). No change. - -Craig chose: fix the 3 real findings, dismiss the 2 false positives, clear the inbox file in one commit. - -Applied: relocated both =LAST_REVIEWED= drawers to directly under their headings (Generic-agent-runtime TODO and Iteration-history-backfill DONE); converted the =#16= custom-id link to a fuzzy heading link. Verified with =lint-org --check todo.org= — the three findings are gone; only the two false-positive misplaced-heading items remain (now at lines 2370/1717). =.ai/session-context.org= stays out of the commit (live anchor, renamed at wrap-up). - -Reconciled (0 behind / 0 ahead), reviewed staged diff inline (Approve, no findings), drafted the commit message, ran =/voice personal= (em-dash fix only), committed as =e305924= "chore(todo): fix lint findings on todo.org" — todo.org + inbox deletion. Author confirmed Craig Jennings. Inbox now empty. Stamped =:LAST_INBOX_PROCESS: 2026-05-30= in notes.org. Pushed to origin/main (=0c16004..e305924=) after a clean pre-push reconcile (0 behind, 1 ahead). - -** 2026-05-30 ~12:47 CDT — second inbox pass (drill-to-anki handoffs) - -Checked inbox on Craig's request. Two handoffs had arrived from health + work, both about drill-to-anki. Discovered the work session had committed 80e76cb + 23d87c1 to rulesets cross-project (drill-deck-review workflow + drawer-stripping script extension); already integrated, HEAD was at 23d87c1. - -Health handoff-1: two drill-to-anki default tweaks. Craig picked option 1 (implement now, raw basename for deck name; file work's helper scripts as a [#C] TODO). - -Implemented handoff-1 TDD-style: wrote test_drill_to_anki.py red-first (genanki stubbed in sys.modules so the uv-only dep doesn't block import), then changed default_output_path → ~/sync/phone/anki/ and default_deck_name → raw input basename (dropped title_from_org as now-dead). Updated docstring + arg help. Mirror-synced, sync-check clean, full suite green (331/1skip + 54 hooks + 24 + 23 ERT + bats). Committed 038d59b (feat(drill-to-anki): ...) — LOCAL, not pushed yet. - -Mid-work, a burst of newer files arrived from work (12:51, 12:57): drill-deck-stats.py, drill-deck-diff-ids.py, drill-deck-sync wrapper, an updated drill-deck-review.org, and two notes. The 12:51 follow-up says Craig GREEN-LIT all three scripts on the work side and sent an apply-ready bundle (with explicit rulesets-side apply instructions). The 12:57 note adds a title-audit tweak to stats.py + the workflow. - -CONFLICT: the bundle's "green-lit, install it" contradicts the "file as TODO" Craig picked here minutes earlier. Holding — surfacing to Craig before applying. Also flagged: handoff-1's 1b change (deck name = basename) already neutralizes the #+TITLE org-drill-jargon leak for the default path, overlapping work's title-audit. - -Working tree currently holds the premature [#C] TODO (todo.org) + docs/design preservation of the two earlier scripts, pending Craig's decision on the bundle. - -*** Resolution: Craig said "incorporate any flashcard items" — apply the bundle. - -Installed the three scripts (drill-deck-stats.py, drill-deck-diff-ids.py, drill-deck-sync) to canonical + mirror, chmod +x. Replaced drill-deck-review.org with the bundle version (Helper Scripts section, Deck-title subsection, script refs in phases). Reconciled the workflow's stale output-path prose: it claimed drill-to-anki.py defaults to ~/sync/org/drill/, which 038d59b changed to ~/sync/phone/anki/ — fixed lines 37, 253-256, and dropped the now-moot Common Mistake about outputting to the script default. Lines 30/32/256 keep ~/sync/org/drill/ where it correctly names the org-source home. - -Added tests: test_drill_deck_stats.py (is_prompt_form pure + CLI clean/dirty/missing-file), test_drill_deck_diff_ids.py (card_id_map + CLI identical/dropped-id), drill-deck-sync.bats (no-args, missing-file, stats-gate-failure). 11 pytest + 3 bats, all green. Removed the premature [#C] TODO (todo.org back to committed state) and the docs/design preservation. sync-check clean, full suite 342/1skip + 54 hooks + 24 + 23 ERT + bats green. Deleted the 4 inbox bundle files; inbox empty. - -Committed 0234e52 (chore(scripts): ...). Pushed 038d59b + 0234e52 together: =23d87c1..0234e52= on origin/main after clean pre-push reconcile (0 behind, 2 ahead). - -Work's follow-up said "no additional follow-ups open," so no reply sent (accepted handoff). The workflow output-path reconciliation propagates to work via the normal rsync on their next startup. - -Still uncommitted (session housekeeping for wrap-up): notes.org :LAST_INBOX_PROCESS: stamp, this session-context.org. - -** 2026-05-30 ~13:25 CDT — /add-tests for the flashcard + untested scripts - -Craig ran /add-tests "for all those scripts if they need it" + asked which other scripts lack tests. Inventory: every script under .ai/scripts/ maps to a test except cross-project-broadcast.py and daily-prep-agenda.el (zero), and drill-to-anki.py was only partially covered (default helpers only). Craig picked option 3 (everything). - -Wrote, TDD-verified each batch: -- test_drill_to_anki.py extended +22: parse, strip_org_metadata, section_to_tag, escape_html, stable_id. build/make_model skipped (genanki framework glue). No bugs surfaced. -- test_drill_deck_stats.py +2 (missing-title WARN, PROPERTIES-mismatch WARN), test_drill_deck_diff_ids.py +1 (appeared-IDs note path). -- test_cross_project_broadcast.py new (12): is_broadcastable, discover (SEARCH_ROOTS monkeypatched to tmp tree), sender_project, inbox_send_path. -- test-daily-prep-agenda.el new (15 ERT): dp-iso-date, dp-bucket (clock pinned via dynamic let), dp-format-entry, dp-collect end-to-end on a temp org file. - -Testability refactor: daily-prep-agenda.el's batch entrypoint fired on any load, blocking ERT. Gated it behind dp--cli-invocation-p (same readable-files check lint-org.el uses). Real-file invocation unchanged; no-arg run now no-ops. - -Verified: sync-check clean, full suite 379/1skip + 54 hooks + 15 + 24 + 23 ERT + bats, all green. Committed a631395 (test(scripts): ...), pushed =0234e52..a631395= after clean reconcile. - -No other scripts lack tests now. The only deliberate coverage gaps: drill-to-anki build/make_model and the drill-deck-sync clean end-to-end path, all of which need uv-resolved genanki and are left to integration. - -Committed housekeeping 82e99ff (chore(ai): refresh session log + marker), pushed =a631395..82e99ff=. - -** 2026-05-30 ~13:30 CDT — research Anki/flashcard best practices (workflow) - -Craig asked to research flashcard/Anki best practices and propose drill-deck-review.org updates. Launched a Workflow: 5-facet research fan-out (SRS scheduling, card-authoring principles, question formulation, Anki mechanics, anti-patterns) → synthesis that reads the current workflow and proposes section-by-section updates. Proposal only — no workflow edits until Craig approves. - -Workflow completed (6 agents, ~237s). Proposal: 8 already-strong, 7 updates (2 high stats.py linters, 4 medium, 1 low), 5 conflicts not adopted. Full result at the workflow output file. Craig chose: apply all 7 + add a card-authoring section. Implementing now: drill-deck-stats.py gains answer-leakage WARN, duplicate-front WARN, and non-blocking NOTEs for overloaded/list backs and binary prompts (with tests); drill-deck-review.org gains a Card Authoring section, person-card split path, Phase B cost-benefit + leech-feedback, a scheduling-is-Anki-side note, and Helper-Scripts/Common-Mistakes updates for the new checks. - -Implemented + shipped. drill-deck-stats.py rewritten: new pure helpers (content_words, leakage_ratio, normalize_heading, is_binary_prompt, back_word_count, is_list_back, parse_cards, find_duplicate_fronts) + two-tier WARN/NOTE reporter; fuzzy thresholds in tunable constants (LEAKAGE_RATIO=0.8, BACK_WORD_LIMIT=60). +17 tests (27 total in the file). drill-deck-review.org got all 8 doc edits (Overview scheduling note, Card Authoring Principles section with sourced org links, person-card split path, Phase A signal mention, Phase B removal category + leech/one-directional disposition, Helper-Scripts stats description, two Common Mistakes, Living Document entry). Sanity-ran stats.py on a mixed sample — correctly flagged a leaky card (blocking) + list/binary NOTEs (non-blocking). sync-check clean, full suite 396/1skip + hooks + ERT + bats green. Committed 5bd7591 (feat(drill-deck): ...), pushed =82e99ff..5bd7591=. - -Still uncommitted for wrap-up: session-context.org (this file). notes.org marker already committed in 82e99ff. diff --git a/.ai/sessions/2026-05-30-16-06-drill-deck-anki-buildout-and-script-tests.org b/.ai/sessions/2026-05-30-16-06-drill-deck-anki-buildout-and-script-tests.org new file mode 100644 index 0000000..668948f --- /dev/null +++ b/.ai/sessions/2026-05-30-16-06-drill-deck-anki-buildout-and-script-tests.org @@ -0,0 +1,129 @@ +#+TITLE: Session — lint-followups inbox pass +#+DATE: 2026-05-30 + +* Summary + +** Active Goal + +Began as startup + an inbox lint-followups pass, then became a sustained build-out of the org-drill → Anki (drill-deck) workflow, driven by a rapid series of cross-project handoffs from work and health. Also backfilled broad script test coverage and fixed a template-sync hygiene bug. Eight commits, all pushed. + +** Decisions + +- *drill-to-anki defaults* (health handoff): output → =~/sync/phone/anki/= (phone artifact), deck name → raw input basename, dropping the =#+TITLE= preference that leaked "org-drill" jargon into Anki. +- *Incorporated work's drill-deck bundle* (stats / diff-ids / sync scripts + drill-deck-review.org) rather than filing as a TODO, once a follow-up handoff showed work had green-lit it. Reconciled the workflow's stale output-path prose against the new drill-to-anki default. +- */add-tests option 3 (everything)*: backfilled tests for drill-to-anki internals, the two new drill-deck scripts' thin spots, cross-project-broadcast, and daily-prep-agenda (the last needed a =dp--cli-invocation-p= guard to be loadable under ERT). +- *Anki best-practice research* (Workflow tool, 6 agents) → applied all 7 proposed updates + a new Card Authoring Principles section. Not adopted (with reasons): cloze cards, per-card tractability targeting, FSRS-retention encoding, on-face source-stamping. +- *Card conventions* (Craig): Source citation at the end of a card after two blank lines; no created/added date on cards. +- *Leakage false-positive fixes* (health, 43-card deck): strip Source: + created lines before overlap; numeric carve-out (option 1) for range/category cards. +- *Sync-hygiene fix* (health): rsync excludes Python cache; exec bits were missing at the source (100644), not dropped by rsync. + +** Data Collected / Findings + +- Flashcard/SRS research synthesized from Wozniak (20 rules), Matuschak (prompts), Nielsen, the Anki manual, and the FSRS docs. Full result in the workflow output for run wf_d0c5e16f-ff1. +- Exec-bit root cause: four shebang =.py= scripts committed mode 100644, so =rsync -a= copied the wrong mode (not rsync dropping it). +- Cache propagation: root =.gitignore= stops commits, but =rsync -a= copies by disk presence, and pytest cache physically sat in canonical =claude-templates/.ai/scripts/tests/=. + +** Files Modified + +- =drill-to-anki.py= (+ mirror) — default output/deck-name change; strip Created: lines; tests. +- =drill-deck-stats.py= (+ mirror) — authoring-quality checks (leakage, dup fronts, overloaded/list/binary), then leakage FP fixes (Source-strip, numeric carve-out); tests. +- =drill-deck-diff-ids.py= / =drill-deck-sync= (+ mirror) — incorporated from work's bundle, with tests. +- =drill-deck-review.org= (+ mirror) — bundle update + Card Authoring section, conventions, scheduling note, Phase B dispositions. +- =startup.org= (+ mirror) — Phase A scripts rsync excludes Python cache. +- New tests: =test_drill_to_anki.py=, =test_drill_deck_stats.py=, =test_drill_deck_diff_ids.py=, =test_cross_project_broadcast.py=, =test-daily-prep-agenda.el=. +- Exec bits restored on =inbox-send.py=, =cj-scan.py=, =cj-remove-block.py=, =eml-view-and-extract-attachments.py=. +- =todo.org= — lint fixes (drawers + custom-id link). =.ai/notes.org= — =:LAST_INBOX_PROCESS:= stamp. + +** Next Steps + +- *health* must, on its next template sync: remove its existing =.ai/scripts/tests/{__pycache__,.pytest_cache}= once (rsync =--delete= leaves excluded paths in place); it gets the leakage FP fixes + new conventions automatically. Both confirmed via inbox-send. +- *Signal MCP install at desktop* still pending (GPG pinentry blocks it remotely) — carried from prior sessions. +- Parked [#B] tasks unchanged: codex Phase 1 race-fix, startup-rsync-dirty propagation, cross-project pattern catalog. +- The drill-deck leakage thresholds (=LEAKAGE_RATIO=0.8=, =BACK_WORD_LIMIT=60=) are tunable constants if real decks surface more false positives. + +* Session Log + +** 2026-05-30 07:30 CDT — startup + inbox + +Startup ran clean: both repos current, no crashed session, no reminders/pending decisions, no cross-agent messages, no stale tasks, language bundle clean. One inbox item: =lint-followups.org=, five lint findings on =todo.org= from the lint-org pipeline (script source). + +Triaged the five against the actual lines: +- 1213 invalid-custom-id-link — link points to nonexistent CUSTOM_ID =#16 Generic agent runtime support=; target heading (1165) has no CUSTOM_ID. Real. Fix: fuzzy heading link. +- 1176, 2429 obsolete-properties-drawer — two =LAST_REVIEWED= drawers sit at the bottom of their task bodies, detached from the heading, so org treats them as inert text. Real. Fix: relocate each drawer to directly under its heading (1165 and 2415). +- 2371, 1718 misplaced-heading — both flag verbatim org markup inside prose (=** DONE=, =** Startup Pull Ordering=). Verbatim-marker false-positive class (seen 2026-05-25). No change. + +Craig chose: fix the 3 real findings, dismiss the 2 false positives, clear the inbox file in one commit. + +Applied: relocated both =LAST_REVIEWED= drawers to directly under their headings (Generic-agent-runtime TODO and Iteration-history-backfill DONE); converted the =#16= custom-id link to a fuzzy heading link. Verified with =lint-org --check todo.org= — the three findings are gone; only the two false-positive misplaced-heading items remain (now at lines 2370/1717). =.ai/session-context.org= stays out of the commit (live anchor, renamed at wrap-up). + +Reconciled (0 behind / 0 ahead), reviewed staged diff inline (Approve, no findings), drafted the commit message, ran =/voice personal= (em-dash fix only), committed as =e305924= "chore(todo): fix lint findings on todo.org" — todo.org + inbox deletion. Author confirmed Craig Jennings. Inbox now empty. Stamped =:LAST_INBOX_PROCESS: 2026-05-30= in notes.org. Pushed to origin/main (=0c16004..e305924=) after a clean pre-push reconcile (0 behind, 1 ahead). + +** 2026-05-30 ~12:47 CDT — second inbox pass (drill-to-anki handoffs) + +Checked inbox on Craig's request. Two handoffs had arrived from health + work, both about drill-to-anki. Discovered the work session had committed 80e76cb + 23d87c1 to rulesets cross-project (drill-deck-review workflow + drawer-stripping script extension); already integrated, HEAD was at 23d87c1. + +Health handoff-1: two drill-to-anki default tweaks. Craig picked option 1 (implement now, raw basename for deck name; file work's helper scripts as a [#C] TODO). + +Implemented handoff-1 TDD-style: wrote test_drill_to_anki.py red-first (genanki stubbed in sys.modules so the uv-only dep doesn't block import), then changed default_output_path → ~/sync/phone/anki/ and default_deck_name → raw input basename (dropped title_from_org as now-dead). Updated docstring + arg help. Mirror-synced, sync-check clean, full suite green (331/1skip + 54 hooks + 24 + 23 ERT + bats). Committed 038d59b (feat(drill-to-anki): ...) — LOCAL, not pushed yet. + +Mid-work, a burst of newer files arrived from work (12:51, 12:57): drill-deck-stats.py, drill-deck-diff-ids.py, drill-deck-sync wrapper, an updated drill-deck-review.org, and two notes. The 12:51 follow-up says Craig GREEN-LIT all three scripts on the work side and sent an apply-ready bundle (with explicit rulesets-side apply instructions). The 12:57 note adds a title-audit tweak to stats.py + the workflow. + +CONFLICT: the bundle's "green-lit, install it" contradicts the "file as TODO" Craig picked here minutes earlier. Holding — surfacing to Craig before applying. Also flagged: handoff-1's 1b change (deck name = basename) already neutralizes the #+TITLE org-drill-jargon leak for the default path, overlapping work's title-audit. + +Working tree currently holds the premature [#C] TODO (todo.org) + docs/design preservation of the two earlier scripts, pending Craig's decision on the bundle. + +*** Resolution: Craig said "incorporate any flashcard items" — apply the bundle. + +Installed the three scripts (drill-deck-stats.py, drill-deck-diff-ids.py, drill-deck-sync) to canonical + mirror, chmod +x. Replaced drill-deck-review.org with the bundle version (Helper Scripts section, Deck-title subsection, script refs in phases). Reconciled the workflow's stale output-path prose: it claimed drill-to-anki.py defaults to ~/sync/org/drill/, which 038d59b changed to ~/sync/phone/anki/ — fixed lines 37, 253-256, and dropped the now-moot Common Mistake about outputting to the script default. Lines 30/32/256 keep ~/sync/org/drill/ where it correctly names the org-source home. + +Added tests: test_drill_deck_stats.py (is_prompt_form pure + CLI clean/dirty/missing-file), test_drill_deck_diff_ids.py (card_id_map + CLI identical/dropped-id), drill-deck-sync.bats (no-args, missing-file, stats-gate-failure). 11 pytest + 3 bats, all green. Removed the premature [#C] TODO (todo.org back to committed state) and the docs/design preservation. sync-check clean, full suite 342/1skip + 54 hooks + 24 + 23 ERT + bats green. Deleted the 4 inbox bundle files; inbox empty. + +Committed 0234e52 (chore(scripts): ...). Pushed 038d59b + 0234e52 together: =23d87c1..0234e52= on origin/main after clean pre-push reconcile (0 behind, 2 ahead). + +Work's follow-up said "no additional follow-ups open," so no reply sent (accepted handoff). The workflow output-path reconciliation propagates to work via the normal rsync on their next startup. + +Still uncommitted (session housekeeping for wrap-up): notes.org :LAST_INBOX_PROCESS: stamp, this session-context.org. + +** 2026-05-30 ~13:25 CDT — /add-tests for the flashcard + untested scripts + +Craig ran /add-tests "for all those scripts if they need it" + asked which other scripts lack tests. Inventory: every script under .ai/scripts/ maps to a test except cross-project-broadcast.py and daily-prep-agenda.el (zero), and drill-to-anki.py was only partially covered (default helpers only). Craig picked option 3 (everything). + +Wrote, TDD-verified each batch: +- test_drill_to_anki.py extended +22: parse, strip_org_metadata, section_to_tag, escape_html, stable_id. build/make_model skipped (genanki framework glue). No bugs surfaced. +- test_drill_deck_stats.py +2 (missing-title WARN, PROPERTIES-mismatch WARN), test_drill_deck_diff_ids.py +1 (appeared-IDs note path). +- test_cross_project_broadcast.py new (12): is_broadcastable, discover (SEARCH_ROOTS monkeypatched to tmp tree), sender_project, inbox_send_path. +- test-daily-prep-agenda.el new (15 ERT): dp-iso-date, dp-bucket (clock pinned via dynamic let), dp-format-entry, dp-collect end-to-end on a temp org file. + +Testability refactor: daily-prep-agenda.el's batch entrypoint fired on any load, blocking ERT. Gated it behind dp--cli-invocation-p (same readable-files check lint-org.el uses). Real-file invocation unchanged; no-arg run now no-ops. + +Verified: sync-check clean, full suite 379/1skip + 54 hooks + 15 + 24 + 23 ERT + bats, all green. Committed a631395 (test(scripts): ...), pushed =0234e52..a631395= after clean reconcile. + +No other scripts lack tests now. The only deliberate coverage gaps: drill-to-anki build/make_model and the drill-deck-sync clean end-to-end path, all of which need uv-resolved genanki and are left to integration. + +Committed housekeeping 82e99ff (chore(ai): refresh session log + marker), pushed =a631395..82e99ff=. + +** 2026-05-30 ~13:30 CDT — research Anki/flashcard best practices (workflow) + +Craig asked to research flashcard/Anki best practices and propose drill-deck-review.org updates. Launched a Workflow: 5-facet research fan-out (SRS scheduling, card-authoring principles, question formulation, Anki mechanics, anti-patterns) → synthesis that reads the current workflow and proposes section-by-section updates. Proposal only — no workflow edits until Craig approves. + +Workflow completed (6 agents, ~237s). Proposal: 8 already-strong, 7 updates (2 high stats.py linters, 4 medium, 1 low), 5 conflicts not adopted. Full result at the workflow output file. Craig chose: apply all 7 + add a card-authoring section. Implementing now: drill-deck-stats.py gains answer-leakage WARN, duplicate-front WARN, and non-blocking NOTEs for overloaded/list backs and binary prompts (with tests); drill-deck-review.org gains a Card Authoring section, person-card split path, Phase B cost-benefit + leech-feedback, a scheduling-is-Anki-side note, and Helper-Scripts/Common-Mistakes updates for the new checks. + +Implemented + shipped. drill-deck-stats.py rewritten: new pure helpers (content_words, leakage_ratio, normalize_heading, is_binary_prompt, back_word_count, is_list_back, parse_cards, find_duplicate_fronts) + two-tier WARN/NOTE reporter; fuzzy thresholds in tunable constants (LEAKAGE_RATIO=0.8, BACK_WORD_LIMIT=60). +17 tests (27 total in the file). drill-deck-review.org got all 8 doc edits (Overview scheduling note, Card Authoring Principles section with sourced org links, person-card split path, Phase A signal mention, Phase B removal category + leech/one-directional disposition, Helper-Scripts stats description, two Common Mistakes, Living Document entry). Sanity-ran stats.py on a mixed sample — correctly flagged a leaky card (blocking) + list/binary NOTEs (non-blocking). sync-check clean, full suite 396/1skip + hooks + ERT + bats green. Committed 5bd7591 (feat(drill-deck): ...), pushed =82e99ff..5bd7591=. + +Still uncommitted for wrap-up: session-context.org (this file). notes.org marker already committed in 82e99ff. + +Committed session log 9c9af90. + +** 2026-05-30 ~14:00 CDT — third inbox pass (template-sync hygiene) + +health handoff: the startup =.ai/scripts/= rsync drags pytest cache (=__pycache__/=, =.pytest_cache/=) into every project, plus inbox-send.py loses its exec bit. Verified: root =.gitignore= stops committing the cache, but =rsync -a= copies by disk presence, and the cache physically sits in canonical =claude-templates/.ai/scripts/tests/=. Exec-bit root cause differed from the handoff's guess — four shebang =.py= scripts (inbox-send, cj-scan, cj-remove-block, eml-view-and-extract-attachments) were committed 100644, so rsync copied the wrong mode (not rsync dropping it). Craig chose: implement both. + +Fix: added =--exclude='__pycache__' --exclude='.pytest_cache' --exclude='*.pyc'= to startup.org Phase A step 5 (+ a Notes bullet), set +x on the four scripts (canonical + mirror), scrubbed canonical cache. Verified the exclude with a temp-dir rsync (no cache lands, inbox-send.py arrives executable). sync-check clean, full suite 396/1skip green. Committed 968a39b (fix(startup): ...), pushed =9c9af90..968a39b=. Sent health a confirmation via inbox-send (they must rm their existing cache once, since --delete leaves excluded paths in place). Inbox empty. + +** 2026-05-30 ~15:45 CDT — fourth inbox pass (leakage false positives) + +health ran the leakage check on a 43-card deck: 11 flags, 3 real, 8 false positives in two classes. FP1: Source: citation lines (the URL slug repeats question words) inflate overlap. FP2: range/category cards echo their categories but recall numbers. Craig directed: Source citation at end of card after two blank lines; no created date on cards (strip if present); implement FP2 option 1 (numeric carve-out). + +Fix: drill-deck-stats.py routes leakage through is_leaky() — prose_body() strips Source:/created lines, has_distinct_numeric_recall() exempts cards with numeric ranges/thresholds the question lacks. leakage_ratio unchanged (genuine restatement still flags). drill-to-anki.py strip_org_metadata now drops Created:/:CREATED: lines from the back. drill-deck-review.org: Body conventions (Source at end / no created date), Card Authoring + Helper Scripts + Anki-Behavior + Phase C updates, Living Document entry. +9 tests (stats 34, drill-to-anki 27). sync-check clean, full suite 405/1skip green. Committed b80a9ce (fix(drill-deck): ...), pushed =968a39b..b80a9ce=. Confirmed to health via inbox-send. Inbox empty. + +Uncommitted for wrap-up: session-context.org (this file). diff --git a/inbox/lint-followups.org b/inbox/lint-followups.org new file mode 100644 index 0000000..88c33d7 --- /dev/null +++ b/inbox/lint-followups.org @@ -0,0 +1,4 @@ + +* 2026-05-30 lint-org follow-ups — todo.org +** TODO line 2370 — misplaced-heading — Possibly misplaced heading line +** TODO line 1717 — misplaced-heading — Possibly misplaced heading line -- cgit v1.2.3