Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A1rCLQeKBgnBo3oTgHuTMe
6.2 KiB
6.2 KiB
Personalized Curation v2 — implementation progress and handoff
Updated: 2026-09-02 (end of session 1)
Plan: docs/plans/2026-09-02-personalized-curation-v2.md (§21 is the step sequence)
Branch: curation-v2 (branched from main at a599745; not merged, not pushed)
Briefs: docs/plans/curation-v2-briefs/ — 00-preamble.md + one stepN.md per step. Each
brief was handed to an implementation agent as cat 00-preamble.md stepN.md.
Where things stand
| Step (§21) | Status | Commit |
|---|---|---|
| 1. Feedback and profile | done, reviewed (codex review: no actionable issues) | 3a9f4b9 |
| 2. Claude editor and editorial | done | 57efbb4 |
| 3. Embeddings, signals, telemetry | done (branch curation-v2-step3, merged) |
ea3b141 + merge commit |
| 4. Triage replaces the gate | not started — brief ready: step4.md |
|
| 5. Deep assessment, utility, diversity | not started — brief ready: step5.md |
|
| 6. Paper telemetry, stats, lock | not started — brief ready: step6.md |
|
| 7. Cleanup + implementation notes | not started — brief ready: step7.md |
cargo fmt --check, cargo clippy --all-targets (only the three pre-existing src/world.rs
needless_borrow warnings) and cargo test (294 lib tests + 6 integration suites) are green at HEAD.
Nothing has been run against the production database or the real providers. No local
config.toml, database, or API keys exist on the dev box, so verification so far is tests only.
Decisions and deviations made while implementing (read before step 4)
scorestable not yet dropped. Migration0002_curation_v2.sqlcreated every new table, copiedratings→rating_events, and droppedratingsandfeed_priors, but keptscoresbecause the old Stage A scoring (src/curate/score.rs,db::upsert_score,recently_low_scored_ids) still uses it. Step 4 addsmigrations/0003_drop_scores.sqland moves the churn rule toarticle_assessments(already instep4.md).- Old prefilter still gates. Hygiene → embeddings → signals → preliminary blend now run for every
article, and
candidate_runsrows are written with the stage vocabulary mapped onto the old flow (admitted_byis["prefilter"]/["auto"]for now), butprefilter::run+prefilter_keepstill decide the deep set until step 4. - Legacy
uplinks.Vote::parse("up")→Loved, andauth::verify_tokenalso accepts tokens signed over the literalupsegment so already-published issues keep working. - Same-date regeneration no longer excludes its own picks (
published_beforeuses issue dates strictly before the run date), per plan §8.1. VoyageConfig.api_keyexists as a field (figment mapsDAILY_EPUB_VOYAGE__API_KEYinto it;deny_unknown_fieldswould otherwise reject the env var). Never document it in TOML.anthropic.max_concurrent_requestsis validated but not consumed yet; summary concurrency is the constantSUMMARY_CONCURRENCY = 4ineditorial.rs.UsageMeter::new(&DeepseekConfig, ..)survives as a compat constructor overwith_prices.tests/fixtures/deepseek_front_page.jsonwas replaced bytests/fixtures/claude_brief.json.RATINGS_LOOKBACK_DAYSinprofile/mod.rsis effectively unbounded (36,500) for the prompt verdict block and the weekly rebuild; the knn/feed preference state usescuration.ranking.rating_lookback_days(180) as the plan says.- Footer CSS:
.ratinghas nowhite-space: nowrap(it would clip on narrow e-ink screens).
Operator to-dos before the first real run
- Set
DAILY_EPUB_ANTHROPIC__API_KEYandDAILY_EPUB_VOYAGE__API_KEYin the systemd env file. - Set hard spend limits in the DeepSeek, Anthropic and Voyage dashboards (the meters are runaway guards, not accounting).
- Copy
data/profile.mdto whereverprofile_pathpoints on the server (default is relative toWorkingDirectory=/var/lib/daily-epub, likedata/scour-interests.opml). - Run
daily-epub db migrate(0002 dropsratings/feed_priors; back up the DB first). daily-epub features backfill --rated-onlythen--days 30to warm the embedding cache.- A
generate --dry-runand read the paper;explain --near-missesonce step 4 lands.
How the work was run (so the next session can repeat it)
- Orchestrator: Claude Code (this repo), one implementation agent per step, review + commit by the
orchestrator after independent
cargo fmt/clippy/test. - Codex:
codex exec -C <repo> --sandbox workspace-write --add-dir ~/.cargo -c sandbox_workspace_write.network_access=true -c model_reasoning_effort=high -o <last.md> - < <brief>, detached withsetsid nohup, exit code written to a file and watched with a monitor. Theopenai-codexClaude Code plugin'staskruns fail on this host (bubblewrap cannot create user namespaces:kernel.apparmor_restrict_unprivileged_userns = 1); the CLI works if the brief tells the agent to edit files via shell commands instead of theapply_patchtool (see the preamble). The plugin's read-onlyreview --background --scope working-treedoes work and was used on step 1. Fix for the sandbox:sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0. - Codex ran out of ChatGPT usage after ~560k tokens (step 1 complete, steps 2 and 3 cut off
mid-way); Claude
general-purposesub-agents finished steps 2 and 3 from the partial trees and resolved the step 2/3 merge. Budget roughly one large step per Codex usage window. - Steps 2 and 3 were run in parallel (step 3 in a git worktree); the merge cost ~19 conflict hunks in config/pipeline/report/main/README/config.example. Steps 4 → 5 → 6 → 7 are sequential.
Next session: exact starting instructions
git checkout curation-v2 && cargo test(expect green).- Read this file, then
docs/plans/curation-v2-briefs/00-preamble.mdandstep4.md. - Launch the step 4 agent with
cat 00-preamble.md step4.mdas the prompt (Codex CLI as above, or a Claude general-purpose agent — tell it to ignore the "host quirk" paragraph in that case). - Review the diff against plan §10–§11, run the checks, commit as "Curation v2 step 4: …".
- Repeat for steps 5, 6, 7. After step 7:
git merge --no-ff curation-v2intomain, deploy, and do the operator to-dos above.