Remove curation - #123
Conversation
`--sessions` makes the list the decision: exactly those sessions' chunks ship, no curation consulted. Omitted, every existing path is unchanged. This is the contract that lets curation publish without a ledger, so it lands before anything is deleted. An unrecognized session id fails the push: publishing the subset that resolved would report success while sessions stayed behind, on a path with no retraction. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Curation becomes strictly agent-assisted, so the machinery built for a human picker has nothing left to do: `push --sessions` carries the selection, and the stamp that named a project memory existed only to switch the ledger on. Gone: the include/exclude ledger and its staleness tracking, the push gate, project naming and its schema stamp, the pending-review reporting in `push` and `status`, `funes curate` entirely, and the TUI engine whose last consumer was its picker. `ids_by_session` and `sanitize` move into `push`, `is_scaffolding` into `recall` — the only caller each has left. BREAKING: a push with no `--sessions` publishes everything the remote does not already hold. Existing ledgers under `$FUNES_HOME/curation/` stay on disk, inert. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Its last caller was the curation picker's preview pane; the CLI path went when `get` became agent-only. That takes the whole human-rendering half of the module with it — mark highlighting, the tool one-liner and its payload extraction, and the wrapping — since nothing else called any of it. `dim` stays: `ask` uses it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR removes the curate command / “project memory” concept (including the TUI review flow and its gating behavior) and replaces it with an explicit publishing mechanism: funes push --sessions …, where the session list itself is the publish decision.
Changes:
- Remove
funes curatecommand, curation state/files, and the in-process TUI picker used for interactive review. - Extend
funes pushto optionally publish only explicitly named sessions (--sessions), updating CLI, docs, and tests accordingly. - Simplify UI rendering by keeping only the stable agent-format output for read verbs; remove now-unused human-view rendering paths and dependencies (e.g.,
nucleo-matcher).
Reviewed changes
Copilot reviewed 19 out of 20 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tests/push_round_trip.rs | Updates push invocations to pass the new sessions slice parameter. |
| tests/push_card.rs | Updates push invocations to pass the new sessions slice parameter. |
| tests/curate_gating.rs | Deletes the e2e test that depended on project-memory curation gating. |
| src/ui/tui/curate.rs | Deletes the curation-specific TUI picker model. |
| src/ui/tui.rs | Deletes the generic list+preview TUI engine used by curate. |
| src/ui/render.rs | Updates docs/comments and removes the human get rendering helpers/tests, keeping agent-format rendering. |
| src/ui.rs | Removes the tui module export now that TUI curation is gone. |
| src/memory/remote.rs | Removes schema-metadata amend helper used for project-memory “naming”. |
| src/main.rs | Removes Curate subcommand; adds --sessions support to Push and wires through to run_push. |
| src/commands/recall.rs | Removes curate dependency; inlines is_scaffolding logic needed for session prompt extraction and updates status output. |
| src/commands/push.rs | Implements --sessions-based selection, removes curation gating logic, and adds helpers for session→chunk resolution. |
| src/commands/curate.rs | Deletes the entire curation/project-memory implementation. |
| src/commands.rs | Removes the curate module export. |
| README.md | Updates docs pointers/command list to remove curate and describe selection publishing. |
| docs/storage.md | Updates terminology from “curated project memory” to “published selection”. |
| docs/push.md | Replaces the “Project memories: funes curate” section with “Publishing a selection: --sessions”. |
| docs/configuration.md | Removes curation/ from $FUNES_HOME layout and related environment variable docs. |
| docs/add.md | Removes mention of preserving curation decisions. |
| Cargo.toml | Removes nucleo-matcher; updates ratatui comment to reflect remaining usage. |
| Cargo.lock | Removes nucleo-matcher from the lockfile. |
Suppressed comments (1)
src/commands/push.rs:413
- When
--sessionsis used on a first publish (remote missing/empty),rows_to_push(..., first_publish=true)disables theid IN (...)filter and ends up scanning/publishing the entire local dataset, ignoring the session selection. This can leak unintended sessions on the initial publish.
return Ok(format!("{}: up to date ({} chunks)\n{note}", target.label(), remote_ids.len()).into());
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
`rows_to_push` skips the `id IN (…)` filter on a first publish, since every local id would be in the list. That held while an empty remote could only ever be published whole; `--sessions` makes a scoped first publish reachable, and the shortcut ignored the selection — naming one session shipped every local session to a remote that cannot retract it. The shortcut is now the unnamed case only, and the parameter says what it controls rather than when it happens. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
a9150f8 to
a139c3b
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 19 out of 20 changed files in this pull request and generated no new comments.
Suppressed comments (3)
Previously missed (3) — in code that hasn't changed since the last review.
src/commands/push.rs:324
- The error message for unknown session ids is grammatically incomplete ("lists what is"), which makes it harder to understand what the user should do next.
bail!(
"not in your local memory: {} — `funes sessions` lists what is",
unknown.join(", ")
);
src/commands/push.rs:289
ids_by_sessionalways scans the entire local dataset (id + session_id for every row). For large memories,funes push --sessions ...will pay an O(N) full-table scan even when publishing a single session; this is a noticeable performance regression for the selection workflow.
/// A memory's rows as session → chunk ids, the shape a selection is resolved against.
pub(crate) async fn ids_by_session(ds: &Dataset) -> Result<HashMap<String, Vec<String>>> {
let batches = dataset::scan_rows(ds, &["id", "session_id"], None, None).await?;
docs/storage.md:18
- This table header still says "Published project", but the surrounding text and the rest of the table now describe a published selection. Updating the header keeps the terminology consistent.
| | Local development | Published project |
This removes the curation verb and the whole concept of project memory store. My own experiments with huggingface/funes-memory showed me that it is far easier to do an agent assisted curation than to use the awkward tools I had developped. Lesson learnt: don't develop a user interface when the agent is a better interface.