Shared memory + knowledge-curation skills; seed a cross-role knowledge layer - #52
Merged
Merged
Conversation
Per-role memory is local and role-scoped, so a fact one role pays for is invisible to every other role — and to the same role on another machine. Teams rediscover, expensively, what a teammate already diagnosed correctly. Adds the missing second layer and the path into it. memory — promoted to a single shared skill It was bundle-local in feature-development AND test-automation, and the two copies had DRIFTED. The divergence was accidental: test-automation's copy had corrected overclaims about snapshot.md being host-generated, so that is the version promoted. Both bundle-local copies deleted; registered in skills.json. memory — upgraded from "just notes" to an Obsidian-grade vault Entries now carry aliases (so [[service token]] resolves, and search finds a note by the words you'd actually type), cross-cutting tags on closed axes, created/updated (updated = when the FACT was re-verified), ## sections so [[note#Section]] works, and Related: links — a note with no links is one nobody rediscovers. Unknown keys are tolerated, never stripped: a human edits this vault too. Adds a routing decision tree (board / knowledge / curated / daily / nowhere), upkeep rules, and an audit snippet for unindexed entries and dead index lines. knowledge-curation — new shared skill Promote (four admission tests), sweep at end of session, audit (unindexed, dead links, overdue re-verification), retire. Admission is deliberately narrow: an unverified claim in a committed layer is worse than silence, because it is trusted. Both wired into ALL FOUR bundles via team-wide `skills`, so manual-qa and product-management get them too — previously neither shipped a memory skill at all. seeding-a-project — new Step 2.5 scaffolds .agents/knowledge/ Charter + per-folder READMEs stating what belongs where, seeded from what onboarding verified, with the contract recorded in CLAUDE.md/AGENTS.md so the layer is discoverable. Applied to BOTH copies rather than promoting the skill: unlike memory, its divergence is intentional (test-automation's carries TMS-specific content), so consolidating would lose content. instructions.md ×4 carries the two-layer contract into each generated AGENTS.md. `node bin/validate-bundles.mjs` green; every bundle's team-wide skills resolve against the registry. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… a graph
You cannot recall from a vault you cannot query. `python-dev` already carries 80
notes; reading MEMORY.md and then opening candidates does not scale, and grep is
blind to frontmatter, aliases and links. The vault IS a graph — this computes it
from plain files so an agent can use it without Obsidian.
query filter by tag (whole axis via prefix), type, applies_to, text, staleness
show frontmatter + sections + first paragraph, resolving ALIASES
links outgoing, backlinks, tag neighbours — flags notes invisible in the graph
lint structural checks, exit 1 on errors, CI-friendly
Deliberately keeps the skill's no-CLI-required stance: authoring stays on the
file tools and everything works without Python. The script is for the two jobs
prompts do badly — finding one note among many, and checking structure
deterministically.
Links resolve the way Obsidian does — filename OR alias. That distinction is the
whole point: a filename-only checker reported false dead links in real use.
Caught by testing against real vaults rather than trusting the code:
- nested frontmatter (`metadata.type`) was silently dropped, so every note in a
vault using that shape reported as missing a required key
- the slug check assumed `_` separators and flagged 8 perfectly good `-` notes
- `--layer` only parsed before the subcommand, not in the order people type
- notes citing their own anchors as examples appeared as self-links in the graph
Also adds Obsidian Bases templates (knowledge by area, overdue re-verification,
live traps, curated memory) — native dashboards, no plugin required.
Verified: clean on both real vaults; a fixture with nine planted defects reports
all nine and exits 1.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…plication A skill that reaches into a sibling skill's path is fragile — it only resolves when both happen to be installed together. Skills are distributed units here (obsidian-vault ships its own script), so `memory` now carries its own copy of vault.py and the memory Base, and is self-contained when installed alone. That trades single-source for a drift risk, and this repo has already lost that trade once: `memory` lived in two bundles and quietly diverged. So the second half of the trade is paid up front — `bin/check-skill-dupes.mjs` fails the build if the copies stop matching, wired into `npm run validate`. Verified by planting drift: it reports the offending file, prints the exact cp to fix it, exits 1. knowledge-curation holds the canonical copy; both files say so in their header. Regenerated the marketplace manifests, which `npm run validate` flagged as stale after the two new skills entered skills.json — worth knowing that adding a skill is a two-step change. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Resolves the overlap with #51 (android-dev persona + external-skill registry guard), which touched the same files. skills.json / bundle.json main's structure, with `memory` + `knowledge-curation` re-applied on top package.json keeps BOTH new validate steps — main's validate:externals and this branch's validate:dupes, chained together instructions.md main's body plus the memory-layer section marketplace manifests regenerated rather than hand-merged; they are generated artifacts Verified after resolving: android-dev present, both new skills wired into all four bundles, all four instructions files carry the section, duplicated assets in sync, all bundles valid. Note: `validate:externals` reports 3 pre-existing 404s (chrisbanes/skills Kotlin skills) which arrived with #51 and are unrelated to this branch. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Upstream `chrisbanes/skills` reorganised its skills, so three registry entries 404'd and the `externals` CI check failed: compose-state-hoisting -> compose-state-and-effects kotlin-flow-state-event-modeling -> kotlin-concurrency-and-flow kotlin-coroutines-structured-concurrency -> (merged into the above) The two Kotlin skills collapsed into one upstream — `kotlin-concurrency-and-flow` now covers scope ownership, cancellation and structured concurrency *and* StateFlow/SharedFlow/Channel selection — so the third entry is dropped rather than pointed at a second URL. `compose-state-and-effects` is a superset of the old hoisting skill (it adds LaunchedEffect/DisposableEffect/SideEffect). Descriptions rewritten from the upstream SKILL.md frontmatter, and the android-dev persona, Android tech-lead briefing, README tables and generated marketplace manifests updated to match. Verified: `npm run validate` exits 0 (bundles, marketplaces, externals 27/27, dupes) and `npm test` passes 112/112. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Per-role memory is local and role-scoped, so a fact one role pays for is invisible to every other role — and to the same role on another machine. Teams rediscover, expensively, what a teammate already diagnosed correctly weeks earlier. This adds the missing second layer and the path into it.
memory→ one shared skillIt was bundle-local in feature-development and test-automation, and the two copies had drifted. The divergence was accidental —
test-automation's copy had corrected overclaims aboutsnapshot.mdbeing host-generated — so that is the version promoted. Both local copies deleted; registered inskills.json.memory→ an Obsidian-grade vault, not "just notes"Entries now carry:
aliases— so[[service token]]resolves toservice_token_rotation.md, and search finds a note by the words you'd actually type rather than the slugtagson closed cross-cutting axes (type/,area/,status/) — a tag used once filters nothing; relationships are links, not tagscreated/updated— whereupdatedmeans when the fact was re-verified, not when the file was touched##sections so[[note#Section]]works, andRelated:links — a note with no links is one nobody rediscoversUnknown keys are tolerated, never stripped: a human edits this vault in Obsidian too. Plus a routing decision tree (board / knowledge / curated / daily / nowhere), upkeep rules, and an audit snippet for unindexed entries and dead index lines.
Verified before touching frontmatter that nothing parses it —
bin/init.mjs'sensureMemoryIndexLineonly writes an index line. The old "don't add extra keys" warning referred to a snapshot generator that doesn't exist in this repo.knowledge-curation— new shared skillOwns
.agents/knowledge/and the path from memory into it:Admission is deliberately narrow, because an unverified claim in a committed layer is worse than silence — it is trusted.
Wired into all four bundles
Both skills go into each bundle's team-wide
skills, so manual-qa and product-management get them too. Neither previously shipped a memory skill at all.Scout seeds the layer
New Step 2.5 in
seeding-a-project: scaffold.agents/knowledge/with a charter and per-folder READMEs stating what belongs where, seed it from what onboarding actually verified, and record the contract inCLAUDE.md/AGENTS.md— outside any<!-- BUNDLE -->markers, so regeneration can't clobber it.Applied to both copies rather than promoting the skill: unlike
memory,seeding-a-project's divergence is intentional (test-automation's carries TMS-specific content), so consolidating would have lost content. Four other bundle-local skills diverge the same way —playwright-testing,reproducing-issues,test-automation-workflow,test-case-analysis— left alone for the same reason.instructions.md×4 carries the two-layer contract into each generatedAGENTS.md.Ideas taken from the existing
obsidian-vaultskillIt's aimed at personal-assistant, but several patterns generalise and are reused here: a documented frontmatter schema with per-type extensions, a decision tree for "where does this go?", lint/audit as a first-class operation, and — the most valuable — "unknown fields are tolerated, never blocking".
Verification
node bin/validate-bundles.mjsgreen on all 4 bundles; every bundle's team-wide skills resolve against the registry; no bundle-localmemorydirectories remain.🤖 Generated with Claude Code