Skip to content

Shared memory + knowledge-curation skills; seed a cross-role knowledge layer - #52

Merged
arozumenko merged 5 commits into
mainfrom
feat/memory-obsidian-and-knowledge-curation
Aug 9, 2026
Merged

Shared memory + knowledge-curation skills; seed a cross-role knowledge layer#52
arozumenko merged 5 commits into
mainfrom
feat/memory-obsidian-and-knowledge-curation

Conversation

@arozumenko

Copy link
Copy Markdown
Owner

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 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 local copies deleted; registered in skills.json.

memory → an Obsidian-grade vault, not "just notes"

Entries now carry:

  • aliases — so [[service token]] resolves to service_token_rotation.md, and search finds a note by the words you'd actually type rather than the slug
  • tags on closed cross-cutting axes (type/, area/, status/) — a tag used once filters nothing; relationships are links, not tags
  • created / updated — where updated means when the fact was re-verified, not when the file was touched
  • ## 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 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's ensureMemoryIndexLine only 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 skill

Owns .agents/knowledge/ and the path from memory into it:

  • promote — four admission tests: cross-role · verified · durable · costly to rediscover
  • sweep — end of session/mission: "would another role have needed this today?"
  • audit — unindexed notes, dead links, notes overdue re-verification
  • retire — correct or delete; never leave a half-true note

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 in CLAUDE.md/AGENTS.mdoutside 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 generated AGENTS.md.

Ideas taken from the existing obsidian-vault skill

It'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.mjs green on all 4 bundles; every bundle's team-wide skills resolve against the registry; no bundle-local memory directories remain.

🤖 Generated with Claude Code

arozumenko and others added 5 commits August 9, 2026 12:27
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>
@arozumenko
arozumenko merged commit c7320a3 into main Aug 9, 2026
3 checks passed
@arozumenko
arozumenko deleted the feat/memory-obsidian-and-knowledge-curation branch August 9, 2026 10:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant