The boot log has said `continuous_research — 4 role skills bound, 8 unresolved`
on every start. Those eight roles ran without the instructions their template
promised them, silently: `skills_loader` reports the miss and carries on.
Worse than the missing files was what the prompts described. v1 told the
harvester to sweep "RSS feeds, GitHub trending, HN front page, YouTube /
podcast RSS" — none of which exist. `harvest.rs` searches arXiv and nothing
else. A role prompt describing a machine that was never built is the failure
this codebase keeps paying for, so v2 describes the machine that exists.
Roles now match the pipeline: paper_reader (the harvest already ran; read the
manifest and the papers), signal_ranker (unchanged in spirit), script_writer
(the podcast half, which had no role at all).
Seven skills authored under skills/research/, kebab-case to match the loader —
team_template_loader.rs:177-181 documents the snake_case/kebab-case trap that
already unbinds skills elsewhere:
arxiv-daily what the harvest guarantees, so an agent does
NOT re-search arXiv and corrupt the seen-set
paper-to-project-relevance name a file or roadmap item, or say "no bearing"
duplicate-detection the seen-set catches identity; this catches the
same work under a different id
signal-to-noise-ranking novelty/relevance/depth, and the two biases to
resist (recency up, inconvenience down)
executive-summary-writing what it is / why it matters / what to do — decide,
do not hedge
obsidian-vault-conventions the vault is a human's live workspace; never
main, never reorganise, hash the body not the file
podcast-dialogue-writing write for someone on a treadmill; the 10-70 char
highlight bound is the API's, not a style rule
`web_fetch` dropped from mcp_bundles: runtime_provision.rs binds every mission
claw to `["clawmates_door"]` and never reads that field, so declaring it
instructed roles to use a tool that never arrived. The prompts say `curl` via
Bash, which is what they actually have.
Boot now reports `continuous_research — 11 role skills bound`, with no
unresolved clause. 344 tests pass.
Co-Authored-By: Claude Opus 5 <[email protected]>
2.0 KiB
name, description, when_to_use, tags
| name | description | when_to_use | tags | ||
|---|---|---|---|---|---|
| obsidian-vault-conventions | Writing into a live Obsidian vault a human also edits — frontmatter, links, paths, and what never to touch. | You are committing notes, digests or scripts into the valhalla-vault repository. |
|
The vault is somebody's live workspace
valhalla-vault is a real Obsidian vault a human edits and syncs continuously.
It is not scratch space. Two consequences drive everything below.
Never commit to main
Mission work lands on the run's own branch. library.rs does this deliberately
and only auto-merges when the change is provably additive — every file in
git diff --name-status base...branch is an A. A rename or a delete is not
additive and stops the merge.
That rule protects the human: an auto-merge can add a note beside their work, never rewrite it.
Stay in your folders
60 Papers/arxiv-<id>.md one note per paper, written by the harvest
ContinuousResearch/<date>/... one folder per run — yours
Do not reorganise, rename or "tidy" anything outside those. What looks like a stray file is usually load-bearing in someone's graph.
Frontmatter is the index
Obsidian queries it, so it must be parseable YAML and keys must stay stable:
---
date: 2026-08-17
type: research-digest
harvested: 23
surfaced: 4
---
Hash the body, not the file. Sync rewrites updated: and size_kb: on
notes it touches; hashing the whole file reports phantom edits on notes nobody
changed and makes "unchanged" meaningless.
Links
[[wikilinks]] are the vault's native form — use them for internal references,
plain markdown links for external URLs. A link to a note that does not exist yet
is fine and idiomatic: it marks something worth writing.
source: is not identity
The vault uses source: for local provenance — often a path like
/Users/…/Downloads/paper.pdf. It is not a citable identifier and must never be
used as a dedup key. Identity is arxiv:<id>, version suffix stripped.