@hippo-digital/hippocampus 1.0.0-rc.2 → 1.0.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +16 -2
  2. package/README.md +15 -6
  3. package/agents/README.md +32 -0
  4. package/agents/accessibility-tester.md +21 -0
  5. package/agents/ingestion-curator.md +29 -0
  6. package/agents/knowledge-builder.md +29 -0
  7. package/agents/prototype-builder.md +23 -0
  8. package/agents/screenshot-runner.md +22 -0
  9. package/agents/workflow-orchestrator.md +37 -0
  10. package/bin/hippocampus.js +2 -1
  11. package/instructions/knowledge-source.instructions.md +29 -0
  12. package/instructions/nhs-frontend.instructions.md +22 -0
  13. package/instructions/nhs-prototype-kit.instructions.md +30 -0
  14. package/lib/package-paths.js +2 -0
  15. package/package.json +3 -1
  16. package/scripts/init.js +50 -0
  17. package/scripts/install-skills.js +84 -32
  18. package/scripts/validate-skills.js +45 -0
  19. package/skills/add-prototype-screen.skill.md +0 -1
  20. package/skills/add-scenario.skill.md +0 -1
  21. package/skills/add-user-needs.skill.md +0 -1
  22. package/skills/audit-knowledge-source.skill.md +0 -1
  23. package/skills/create-journey-from-scenario.skill.md +0 -1
  24. package/skills/deliver-service-slice.skill.md +0 -1
  25. package/skills/generate-service-slice.skill.md +0 -1
  26. package/skills/ingest-project-context.skill.md +0 -1
  27. package/skills/ingest-user-personas.skill.md +1 -0
  28. package/skills/map-research-to-graph.skill.md +0 -1
  29. package/skills/onboard-team-member.skill.md +109 -0
  30. package/skills/record-design-decision.skill.md +4 -0
  31. package/skills/skills.json +28 -0
  32. package/skills/structure-project-context-draft.skill.md +0 -1
  33. package/skills/write-delivery-summary.skill.md +0 -1
  34. package/templates/artefacts/README.md +23 -0
  35. package/templates/artefacts/accessibility/README.md +30 -0
  36. package/templates/artefacts/delivery-summaries/README.md +20 -0
  37. package/templates/artefacts/screenshots/README.md +30 -0
package/CHANGELOG.md CHANGED
@@ -49,7 +49,21 @@ journeys and screens they justify, rendered as a viewer inside your prototype.
49
49
 
50
50
  - The 13 guides are served at `{basePath}/docs`, version-matched to the
51
51
  installed package rather than copied into your repo.
52
- - `skills install` copies the 20 agent skills into `.github/skills` with content
53
- hashes, so an upgrade can tell a stale copy from one your team has edited.
52
+ - `skills install` copies the 21 skills into `.github/skills`, the six agents
53
+ into `.github/agents` and the instructions into `.github/instructions`, with
54
+ content hashes so an upgrade can tell a stale copy from one your team has
55
+ edited. They install together because every agent's preferred skills point
56
+ into `.github/skills` and every skill names its `owners` by agent, so either
57
+ half alone is a set of dangling references. `--no-agents` installs the skills
58
+ only.
59
+ - Everything the agents and skills reference that is not a repo file is read
60
+ from the installed package, so those references are version-matched too.
61
+ - `skills validate` checks both directions between skills and agents: a skill
62
+ owned by an agent that does not exist, an agent naming a skill that is not in
63
+ the catalog, and a skill in the catalog that no agent lists - the last of
64
+ which was true of four skills, installed but invisible to the runtime.
65
+ - `init` scaffolds `artefacts/` with the READMEs carrying the naming
66
+ conventions, so the skills writing accessibility notes, screenshot review
67
+ packs and delivery summaries have somewhere to put them in a fresh host.
54
68
  - `init` reports research material in `hippocampus/source-artefacts/` rather
55
69
  than silently committing it; `--private-artefacts` gitignores it.
package/README.md CHANGED
@@ -34,11 +34,18 @@ back out and leaves every byte of your knowledge base where it is.
34
34
 
35
35
  ```bash
36
36
  npx hippocampus doctor # what is wired, what is not, and where it looked
37
- npx hippocampus skills install # copy the agent skills into .github/skills
37
+ npx hippocampus skills install # copy the skills, agents and instructions in
38
38
  ```
39
39
 
40
- `skills install` records a hash of what it wrote, so a later upgrade can tell a
41
- stale copy from one your team has edited - the edited one is left alone.
40
+ `skills install` writes three directories: `.github/skills` (the skill catalog),
41
+ `.github/agents` (role wrappers naming who runs each skill) and
42
+ `.github/instructions`. They install together because every agent's preferred
43
+ skills point into `.github/skills`, and every skill names its `owners` by agent,
44
+ so either half on its own is a set of dangling references. `--no-agents`
45
+ installs the skills alone for a host whose agent runtime is not Copilot.
46
+
47
+ It records a hash of what it wrote, so a later upgrade can tell a stale copy
48
+ from one your team has edited - the edited one is left alone and named.
42
49
 
43
50
  ## Wiring it by hand
44
51
 
@@ -119,9 +126,11 @@ describe the version you have installed. Nothing is copied into your repo -
119
126
  a copied guide goes stale within a release, and the stale one is the copy people
120
127
  read, because it is the one sitting in their editor.
121
128
 
122
- `skills install` is the deliberate exception: an agent reads skills as repo
123
- files, so those are copied, with hashes so an upgrade can tell a stale copy from
124
- one your team has edited.
129
+ `skills install` is the deliberate exception: an agent reads skills, agent
130
+ definitions and instructions as repo files, so those are copied, with hashes so
131
+ an upgrade can tell a stale copy from one your team has edited. Everything they
132
+ reference that is not a repo file is read from the installed package, so those
133
+ references cannot go stale either.
125
134
 
126
135
  ## Keeping research material out of the repo
127
136
 
@@ -0,0 +1,32 @@
1
+ # Agents
2
+
3
+ These agent definitions are Copilot-friendly role wrappers for the portable skill catalog in `.github/skills/`.
4
+
5
+ Use role agents to decide **who** should do the work. Use skill files to decide **how** the task should be run with repo docs, scripts and finish checks.
6
+
7
+ Use the source model as the handoff contract between agents.
8
+
9
+ ## Agents
10
+
11
+ - `knowledge-builder.md`
12
+ - `prototype-builder.md`
13
+ - `ingestion-curator.md`
14
+ - `screenshot-runner.md`
15
+ - `accessibility-tester.md`
16
+ - `workflow-orchestrator.md`
17
+
18
+ ## Portable skills
19
+
20
+ - See `.github/skills/README.md` for the catalog.
21
+ - See `.github/skills/skills.json` for a machine-readable index that other agent runtimes can parse.
22
+ - See `.github/skills/COVERAGE-MATRIX.md` for archived prompt to current skill mapping.
23
+
24
+ ## Common entrypoints
25
+
26
+ - End-to-end research ingestion: `.github/skills/ingest-research-round.skill.md`
27
+ - End-to-end project context ingestion: `.github/skills/ingest-project-context.skill.md`
28
+ - End-to-end service slice delivery: `.github/skills/deliver-service-slice.skill.md`
29
+ - Route review pack: `.github/skills/capture-route-review-pack.skill.md`
30
+ - Accessibility review note: `.github/skills/record-accessibility-review.skill.md`
31
+ - Route review handover: `.github/skills/write-route-review-summary.skill.md`
32
+
@@ -0,0 +1,21 @@
1
+ # accessibility-tester
2
+
3
+ Reviews accessibility of changed prototype and Hippocampus pages.
4
+
5
+ ## Responsibilities
6
+
7
+ - Check heading order, labels, link text and keyboard flow.
8
+ - Check NHS component usage.
9
+ - Store findings under `artefacts/accessibility/`.
10
+ - Separate blockers from improvements.
11
+
12
+ ## Preferred Skills
13
+
14
+ - `.github/skills/record-accessibility-review.skill.md`
15
+ - `.github/skills/write-route-review-summary.skill.md`
16
+
17
+ ## Read First
18
+
19
+ - `.github/instructions/nhs-frontend.instructions.md`
20
+ - `node_modules/@hippo-digital/hippocampus/docs/custom-agents-usage.md`
21
+ - `artefacts/accessibility/README.md`
@@ -0,0 +1,29 @@
1
+ # ingestion-curator
2
+
3
+ Improves script-generated research and project-context drafts before human review and promotion.
4
+
5
+ ## Responsibilities
6
+
7
+ - Work in `hippocampus/imports/research/` and `hippocampus/imports/project/`.
8
+ - Combine extracted draft files with source-model docs and promotion scripts.
9
+ - Keep reviewable metadata and extracted text intact.
10
+ - Run dry-run promotion checks, not direct promotion.
11
+ - Summarise changed draft fields, evidence gaps and remaining warnings.
12
+
13
+ ## Preferred Skills
14
+
15
+ - `.github/skills/ingest-project-context.skill.md`
16
+ - `.github/skills/ingest-research-round.skill.md`
17
+ - `.github/skills/structure-project-context-draft.skill.md`
18
+ - `.github/skills/structure-research-draft.skill.md`
19
+ - `.github/skills/review-research-import-draft.skill.md`
20
+ - `.github/skills/map-research-to-graph.skill.md`
21
+ - `.github/skills/ingest-user-personas.skill.md`
22
+ - `.github/skills/record-design-decision.skill.md`
23
+ - `.github/skills/triage-research-corpus.skill.md`
24
+
25
+ ## Read First
26
+
27
+ - `node_modules/@hippo-digital/hippocampus/docs/repeatable-research-round-ingestion.md`
28
+ - `.github/instructions/knowledge-source.instructions.md`
29
+
@@ -0,0 +1,29 @@
1
+ # knowledge-builder
2
+
3
+ Maintains the Hippocampus source model.
4
+
5
+ ## Responsibilities
6
+
7
+ - Edit `hippocampus/source`.
8
+ - Preserve linked source relationships.
9
+ - Add assumptions when evidence is missing.
10
+ - Run `npx hippocampus validate`.
11
+ - Summarise records changed and unresolved assumptions.
12
+
13
+ ## Preferred Skills
14
+
15
+ - `.github/skills/deliver-service-slice.skill.md`
16
+ - `.github/skills/generate-service-slice.skill.md`
17
+ - `.github/skills/add-user-needs.skill.md`
18
+ - `.github/skills/add-scenario.skill.md`
19
+ - `.github/skills/create-journey-from-scenario.skill.md`
20
+ - `.github/skills/audit-knowledge-source.skill.md`
21
+ - `.github/skills/ingest-user-personas.skill.md`
22
+ - `.github/skills/record-design-decision.skill.md`
23
+ - `.github/skills/onboard-team-member.skill.md`
24
+
25
+ ## Read First
26
+
27
+ - `node_modules/@hippo-digital/hippocampus/docs/source-model.md`
28
+ - `.github/instructions/knowledge-source.instructions.md`
29
+ - `node_modules/@hippo-digital/hippocampus/lib/schema.js`
@@ -0,0 +1,23 @@
1
+ # prototype-builder
2
+
3
+ Builds NHS Prototype Kit routes and views from the source model.
4
+
5
+ ## Responsibilities
6
+
7
+ - Edit `app/routes.js` and `app/views`.
8
+ - Use source data rather than hard-coded service facts.
9
+ - Reuse Hippocampus components where practical.
10
+ - Keep NHS UK Frontend conventions.
11
+ - Run `npx hippocampus validate` and `npx hippocampus doctor` when routes, views or screen routes change.
12
+
13
+ ## Preferred Skills
14
+
15
+ - `.github/skills/deliver-service-slice.skill.md`
16
+ - `.github/skills/add-prototype-screen.skill.md`
17
+ - `.github/skills/audit-knowledge-source.skill.md`
18
+
19
+ ## Read First
20
+
21
+ - `.github/instructions/nhs-prototype-kit.instructions.md`
22
+ - `.github/instructions/nhs-frontend.instructions.md`
23
+ - `app/routes.js`
@@ -0,0 +1,22 @@
1
+ # screenshot-runner
2
+
3
+ Captures review evidence for prototype and Hippocampus routes.
4
+
5
+ ## Responsibilities
6
+
7
+ - Start the prototype kit when needed.
8
+ - Visit changed routes.
9
+ - Capture screenshots or concise route notes.
10
+ - Store outputs under `artefacts/screenshots/<YYYY-MM-DD>-<topic>/`.
11
+ - Write a manifest describing routes captured and issues found.
12
+
13
+ ## Preferred Skills
14
+
15
+ - `.github/skills/capture-route-review-pack.skill.md`
16
+ - `.github/skills/write-route-review-summary.skill.md`
17
+
18
+ ## Read First
19
+
20
+ - `node_modules/@hippo-digital/hippocampus/docs/custom-agents-usage.md`
21
+ - `artefacts/screenshots/README.md`
22
+ - `app/routes.js`
@@ -0,0 +1,37 @@
1
+ # workflow-orchestrator
2
+
3
+ Coordinates larger Hippocampus delivery work.
4
+
5
+ ## Responsibilities
6
+
7
+ - Break work into source, prototype, validation and review steps.
8
+ - Use `knowledge-builder` before `prototype-builder` for service content.
9
+ - Use `ingestion-curator` for script-generated research and project-context drafts.
10
+ - Request screenshot and accessibility review for visible journeys.
11
+ - Store delivery summaries under `artefacts/delivery-summaries/`.
12
+
13
+ ## Preferred Skills
14
+
15
+ - `.github/skills/deliver-service-slice.skill.md`
16
+ - `.github/skills/ingest-project-context.skill.md`
17
+ - `.github/skills/ingest-research-round.skill.md`
18
+ - `.github/skills/write-delivery-summary.skill.md`
19
+ - `.github/skills/capture-route-review-pack.skill.md`
20
+ - `.github/skills/record-accessibility-review.skill.md`
21
+ - `.github/skills/write-route-review-summary.skill.md`
22
+ - `.github/skills/generate-service-slice.skill.md`
23
+ - `.github/skills/add-prototype-screen.skill.md`
24
+ - `.github/skills/structure-project-context-draft.skill.md`
25
+ - `.github/skills/structure-research-draft.skill.md`
26
+ - `.github/skills/review-research-import-draft.skill.md`
27
+ - `.github/skills/map-research-to-graph.skill.md`
28
+ - `.github/skills/audit-knowledge-source.skill.md`
29
+ - `.github/skills/triage-research-corpus.skill.md`
30
+ - `.github/skills/onboard-team-member.skill.md`
31
+
32
+ ## Required Finish
33
+
34
+ - Validation result.
35
+ - Routes or artefacts reviewed.
36
+ - Assumptions and unresolved risks.
37
+ - Suggested next action.
@@ -24,7 +24,7 @@ const COMMANDS = {
24
24
  'link insight-needs': 'link-insights-to-needs.js',
25
25
  'source index': 'index-source-artefacts.js',
26
26
  'source audit': 'audit-provenance.js',
27
- 'skills install': 'install-skills.js',
27
+ 'skills install': 'install-skills.js', // also installs agents and instructions
28
28
  'skills validate': 'validate-skills.js'
29
29
  }
30
30
 
@@ -37,6 +37,7 @@ function usage () {
37
37
  for (const name of Object.keys(COMMANDS)) console.log(` ${name}`)
38
38
  console.log('\nOptions:')
39
39
  console.log(' --root <dir> the project to act on (default: nearest project above the cwd)')
40
+ console.log(' --no-agents skills install: skills only, no agents or instructions')
40
41
  console.log(' --version print the installed version')
41
42
  console.log(' --help this message')
42
43
  console.log('\nEvery command resolves a project root the same way; run `hippocampus validate`')
@@ -0,0 +1,29 @@
1
+ ---
2
+ applyTo: "hippocampus/source/**/*.json,app/lib/hippocampus/**/*.js,scripts/validate-knowledge.js,docs/source-model.md"
3
+ ---
4
+
5
+ # Knowledge Source Instructions
6
+
7
+ The Hippocampus knowledge base is source-model first. JSON records in `hippocampus/source` drive the visible artefacts and prototype traceability.
8
+
9
+ ## Editing Rules
10
+
11
+ - Read `docs/source-model.md` before editing records.
12
+ - Use structured JSON edits. Do not rely on fragile string manipulation.
13
+ - Keep IDs lowercase kebab-case.
14
+ - Preserve IDs unless a rename is explicitly requested.
15
+ - Keep arrays ordered for human review: project context first, then journey/user-facing order.
16
+ - Add assumptions instead of unsupported evidence claims.
17
+ - Use fictional and synthetic content only.
18
+
19
+ ## Required Checks
20
+
21
+ Run:
22
+
23
+ ```bash
24
+ npm run validate:knowledge
25
+ ```
26
+
27
+ Validation must pass before the work is considered done.
28
+
29
+ If validation fails, fix the source relationships or schema issue before changing views.
@@ -0,0 +1,22 @@
1
+ ---
2
+ applyTo: "app/views/**/*.html,app/views/**/*.njk,app/assets/sass/**/*.scss"
3
+ ---
4
+
5
+ # NHS Frontend Instructions
6
+
7
+ Use NHS UK Frontend conventions.
8
+
9
+ ## Interface Rules
10
+
11
+ - Use NHS component classes before custom styling.
12
+ - Keep headings hierarchical and page-specific.
13
+ - Use summary lists, cards, tables and tags only when they improve scanning.
14
+ - Use clear link text that makes sense out of context.
15
+ - Keep prototype screens accessible and keyboard-friendly.
16
+ - Avoid decorative UI that does not help the service-design task.
17
+
18
+ ## Content Rules
19
+
20
+ - Write plain, task-focused NHS-style content.
21
+ - Keep clinical and service details synthetic unless explicitly provided as approved source material.
22
+ - Avoid overclaiming certainty. Represent unknowns as assumptions or risks.
@@ -0,0 +1,30 @@
1
+ ---
2
+ applyTo: "app/routes.js,app/views/**/*.html,app/views/**/*.njk,app/config.js"
3
+ ---
4
+
5
+ # NHS Prototype Kit Instructions
6
+
7
+ Use the existing NHS Prototype Kit structure.
8
+
9
+ ## Routes
10
+
11
+ - Keep route handlers in `app/routes.js` concise.
12
+ - Load knowledge through `app/lib/hippocampus/load-knowledge.js`.
13
+ - Return useful not-found states instead of crashing on missing IDs.
14
+
15
+ ## Views
16
+
17
+ - Use Nunjucks and NHS UK Frontend classes.
18
+ - Reuse components from `app/views/hippocampus/components` when patterns repeat.
19
+ - Keep page content driven by source data wherever possible.
20
+ - Do not put service facts only in Nunjucks if they belong in `hippocampus/source`.
21
+
22
+ ## Checks
23
+
24
+ After route or view changes, run:
25
+
26
+ ```bash
27
+ npm run validate:knowledge
28
+ ```
29
+
30
+ When practical, start the kit and smoke-test affected routes.
@@ -28,5 +28,7 @@ module.exports = {
28
28
  scriptsDir: path.join(packageRoot, 'scripts'),
29
29
  templatesDir: path.join(packageRoot, 'templates'),
30
30
  skillsDir: path.join(packageRoot, 'skills'),
31
+ agentsDir: path.join(packageRoot, 'agents'),
32
+ instructionsDir: path.join(packageRoot, 'instructions'),
31
33
  docsDir: path.join(packageRoot, 'docs')
32
34
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hippo-digital/hippocampus",
3
- "version": "1.0.0-rc.2",
3
+ "version": "1.0.0-rc.3",
4
4
  "description": "A design-knowledge base for NHS Prototype Kit projects: research, insights, needs, journeys and screens, traceable end to end.",
5
5
  "license": "MIT",
6
6
  "main": "index.js",
@@ -15,6 +15,8 @@
15
15
  "assets",
16
16
  "scripts",
17
17
  "skills",
18
+ "agents",
19
+ "instructions",
18
20
  "templates",
19
21
  "docs",
20
22
  "README.md",
package/scripts/init.js CHANGED
@@ -4,6 +4,7 @@ const path = require('path')
4
4
  const { resolveRoot, CONFIG_FILENAME } = require('../lib/resolve-root')
5
5
  const { CURRENT_SCHEMA_VERSION } = require('../lib/schema-version')
6
6
  const hostEdit = require('../lib/host-edit')
7
+ const packagePaths = require('../lib/package-paths')
7
8
 
8
9
  // Set a host project up to use Hippocampus: write the config and an empty
9
10
  // knowledge base, then make the two host edits - both inside marked blocks, both
@@ -37,6 +38,7 @@ function main () {
37
38
 
38
39
  planConfig(root)
39
40
  planKnowledgeBase(root)
41
+ planArtefacts(root, artefactsDir(root))
40
42
  planArtefactGovernance(root)
41
43
  if (!noWire) {
42
44
  planHostEdit(path.join(root, 'app/routes.js'), wireRoutes)
@@ -75,6 +77,54 @@ function planConfig (root) {
75
77
  }, null, 2) + '\n'))
76
78
  }
77
79
 
80
+ // Several skills write into `artefacts/` - accessibility notes, screenshot
81
+ // review packs, delivery summaries - and two agents name the READMEs there as
82
+ // required reading. A fresh host had none of it, so those skills had nowhere to
83
+ // put their output and the agents pointed at files that did not exist. The
84
+ // READMEs carry the naming conventions, which is the part that stops every
85
+ // project inventing its own.
86
+ //
87
+ // Each file is written only when absent: these are the host's to edit.
88
+ // The host may have renamed it in the config; honour that rather than assuming.
89
+ function artefactsDir (root) {
90
+ const configPath = path.join(root, CONFIG_FILENAME)
91
+ if (!fs.existsSync(configPath)) return 'artefacts'
92
+ try {
93
+ return JSON.parse(fs.readFileSync(configPath, 'utf8')).artefactsDir || 'artefacts'
94
+ } catch {
95
+ return 'artefacts'
96
+ }
97
+ }
98
+
99
+ function planArtefacts (root, artefactsDir) {
100
+ const from = path.join(packagePaths.templatesDir, 'artefacts')
101
+ const to = path.join(root, artefactsDir)
102
+ const missing = []
103
+
104
+ for (const rel of listTemplateFiles(from)) {
105
+ if (!fs.existsSync(path.join(to, rel))) missing.push(rel)
106
+ }
107
+ if (!missing.length) return
108
+
109
+ plan(`${artefactsDir}/ and ${missing.length} README${missing.length === 1 ? '' : 's'}`, () => {
110
+ for (const rel of missing) {
111
+ const target = path.join(to, rel)
112
+ fs.mkdirSync(path.dirname(target), { recursive: true })
113
+ fs.copyFileSync(path.join(from, rel), target)
114
+ }
115
+ })
116
+ }
117
+
118
+ function listTemplateFiles (dir, prefix = '') {
119
+ const found = []
120
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
121
+ const rel = prefix ? path.posix.join(prefix, entry.name) : entry.name
122
+ if (entry.isDirectory()) found.push(...listTemplateFiles(path.join(dir, entry.name), rel))
123
+ else found.push(rel)
124
+ }
125
+ return found
126
+ }
127
+
78
128
  function planKnowledgeBase (root) {
79
129
  const sourceDir = path.join(root, 'hippocampus/source')
80
130
  const projectPath = path.join(sourceDir, 'project.json')
@@ -17,50 +17,121 @@ const packagePaths = require('../lib/package-paths')
17
17
  //
18
18
  // Shared files a host is entitled to own - the README, the format contract, the
19
19
  // schema - are written only when absent.
20
+ //
21
+ // Agents and instructions install alongside skills rather than under a command
22
+ // of their own. Every agent's "Preferred Skills" list points into
23
+ // `.github/skills/`, so an agent installed without its skills is a file full of
24
+ // dangling links, and a skill catalog with no agents has nothing naming who runs
25
+ // what - all 21 skills declare `owners`. Installing them together is the only
26
+ // combination that leaves the host consistent. `--no-agents` opts out for a host
27
+ // whose agent runtime is not Copilot; the skills still install.
20
28
 
21
29
  const argv = process.argv.slice(2)
22
30
  const dryRun = argv.includes('--dry-run')
23
31
  const force = argv.includes('--force')
32
+ const withAgents = !argv.includes('--no-agents')
24
33
  const MANIFEST = '.hippocampus-skills.json'
25
34
  const NEVER_OVERWRITE = new Set(['README.md', 'SKILL-FORMAT.md', 'skills.schema.json', 'COVERAGE-MATRIX.md'])
26
35
 
36
+ // The manifest records a hash per installed file. Skills and agents both ship a
37
+ // README.md, so the three trees get their own maps rather than one flat one -
38
+ // a single map would have the agents' README silently claim the skills' hash and
39
+ // then report both as locally edited on the next upgrade.
40
+ const TREES = [
41
+ { key: 'files', source: 'skillsDir', target: '.github/skills', label: 'skills' },
42
+ { key: 'agents', source: 'agentsDir', target: '.github/agents', label: 'agents' },
43
+ { key: 'instructions', source: 'instructionsDir', target: '.github/instructions', label: 'instructions' }
44
+ ]
45
+
27
46
  function hash (text) {
28
47
  return crypto.createHash('sha256').update(text).digest('hex').slice(0, 16)
29
48
  }
30
49
 
31
50
  function main () {
32
51
  const { root } = resolveRoot({ argv })
33
- const targetDir = path.join(root, '.github/skills')
34
- const manifestPath = path.join(targetDir, MANIFEST)
52
+ const skillsTarget = path.join(root, '.github/skills')
53
+ const manifestPath = path.join(skillsTarget, MANIFEST)
35
54
  const manifest = fs.existsSync(manifestPath)
36
55
  ? JSON.parse(fs.readFileSync(manifestPath, 'utf8'))
37
- : { files: {}, skillIds: [] }
38
- manifest.files = manifest.files || {}
56
+ : {}
39
57
  manifest.skillIds = manifest.skillIds || []
40
58
 
41
- console.log(`Project root: ${root}`)
42
- console.log(`Installing to: ${path.relative(root, targetDir)}\n`)
59
+ console.log(`Project root: ${root}\n`)
60
+
61
+ const trees = TREES.filter((tree) => tree.key === 'files' || withAgents)
62
+ let wroteAnything = false
63
+ let anySkipped = false
64
+
65
+ for (const tree of trees) {
66
+ manifest[tree.key] = manifest[tree.key] || {}
67
+ const sourceDir = packagePaths[tree.source]
68
+ if (!fs.existsSync(sourceDir)) continue
43
69
 
70
+ const result = installTree(sourceDir, path.join(root, tree.target), manifest[tree.key])
71
+ wroteAnything = wroteAnything || result.written.length > 0
72
+ anySkipped = anySkipped || result.skipped.length > 0
73
+
74
+ console.log(`${tree.target}`)
75
+ console.log(` ${dryRun ? 'would install' : 'installed'}: ${result.written.length} files`)
76
+ if (result.unchanged.length) console.log(` already current: ${result.unchanged.length}`)
77
+ if (result.kept.length) console.log(` left as yours: ${result.kept.join(', ')}`)
78
+ if (result.skipped.length) {
79
+ console.log(` left alone because they have been edited here (${result.skipped.length}):`)
80
+ for (const name of result.skipped) console.log(` ${name}`)
81
+ }
82
+
83
+ if (tree.key === 'files') {
84
+ const merged = mergeCatalog(skillsTarget, manifest)
85
+ wroteAnything = wroteAnything || merged.added.length > 0
86
+ console.log(` ${dryRun ? 'would add' : 'added'} to the catalog: ${merged.added.length} skills` +
87
+ (merged.existing ? ` (alongside ${merged.existing} already there)` : ''))
88
+ if (merged.refreshed) console.log(` refreshed in the catalog: ${merged.refreshed} entries`)
89
+ }
90
+ console.log('')
91
+ }
92
+
93
+ if (!withAgents) {
94
+ console.log('Agents and instructions were not installed (--no-agents).')
95
+ console.log('Skills declare owners by agent name, so without them nothing names who runs each skill.\n')
96
+ }
97
+
98
+ if (anySkipped) {
99
+ console.log('Re-install edited files with --force once you have kept whatever you changed.\n')
100
+ }
101
+
102
+ if (!dryRun && wroteAnything) {
103
+ manifest.version = require('../package.json').version
104
+ manifest.updatedAt = new Date().toISOString()
105
+ fs.mkdirSync(skillsTarget, { recursive: true })
106
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n')
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Copy one tree of package-owned files into the host, recording a hash of each
112
+ * so a later upgrade can tell "we wrote this and it is untouched" from "someone
113
+ * has edited it here". Untouched files are refreshed silently; edited ones are
114
+ * named and left alone unless --force.
115
+ */
116
+ function installTree (sourceDir, targetDir, manifestFiles) {
44
117
  const written = []
45
118
  const skipped = []
46
119
  const unchanged = []
47
120
  const kept = []
48
121
 
49
- for (const name of fs.readdirSync(packagePaths.skillsDir)) {
122
+ for (const name of fs.readdirSync(sourceDir)) {
50
123
  if (name === 'skills.json' || !/\.(skill\.md|md|json)$/.test(name)) continue
51
124
 
52
125
  const to = path.join(targetDir, name)
53
- const content = fs.readFileSync(path.join(packagePaths.skillsDir, name), 'utf8')
126
+ const content = fs.readFileSync(path.join(sourceDir, name), 'utf8')
54
127
  const incoming = hash(content)
55
128
 
56
129
  if (fs.existsSync(to)) {
57
130
  const current = hash(fs.readFileSync(to, 'utf8'))
58
131
  if (current === incoming) { unchanged.push(name); continue }
59
132
  if (NEVER_OVERWRITE.has(name)) { kept.push(name); continue }
60
- const installed = manifest.files[name]
133
+ const installed = manifestFiles[name]
61
134
  if (installed && current !== installed && !force) { skipped.push(name); continue }
62
- } else if (NEVER_OVERWRITE.has(name) && name !== 'SKILL-FORMAT.md' && name !== 'skills.schema.json') {
63
- // A README the host does not have is worth providing; one it does is not.
64
135
  }
65
136
 
66
137
  written.push(name)
@@ -68,29 +139,10 @@ function main () {
68
139
  fs.mkdirSync(targetDir, { recursive: true })
69
140
  fs.writeFileSync(to, content)
70
141
  }
71
- manifest.files[name] = incoming
142
+ manifestFiles[name] = incoming
72
143
  }
73
144
 
74
- const merged = mergeCatalog(targetDir, manifest)
75
-
76
- if (!dryRun && (written.length || merged.added.length)) {
77
- manifest.version = require('../package.json').version
78
- manifest.updatedAt = new Date().toISOString()
79
- fs.mkdirSync(targetDir, { recursive: true })
80
- fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n')
81
- }
82
-
83
- console.log(`${dryRun ? 'would install' : 'installed'}: ${written.length} files`)
84
- console.log(`${dryRun ? 'would add' : 'added'} to the catalog: ${merged.added.length} skills` +
85
- (merged.existing ? ` (alongside ${merged.existing} already there)` : ''))
86
- if (merged.refreshed) console.log(`refreshed in the catalog: ${merged.refreshed} entries`)
87
- if (unchanged.length) console.log(`already current: ${unchanged.length}`)
88
- if (kept.length) console.log(`left as yours: ${kept.join(', ')}`)
89
- if (skipped.length) {
90
- console.log(`\nleft alone because they have been edited here (${skipped.length}):`)
91
- for (const name of skipped) console.log(` ${name}`)
92
- console.log('\nRe-install them with --force once you have kept whatever you changed.')
93
- }
145
+ return { written, skipped, unchanged, kept }
94
146
  }
95
147
 
96
148
  /**
@@ -103,6 +103,8 @@ function main () {
103
103
  validateSkillFile(skillPath, entry, catalogIds, errors)
104
104
  }
105
105
 
106
+ validateAgents(catalog, errors)
107
+
106
108
  if (errors.length) {
107
109
  console.error('Skill catalog is invalid')
108
110
  for (const error of errors) {
@@ -114,6 +116,49 @@ function main () {
114
116
  console.log(`Skill catalog is valid (${catalog.skills.length} skills)`)
115
117
  }
116
118
 
119
+ /**
120
+ * Agents and skills point at each other and nothing was checking either
121
+ * direction. Both halves rot the same way and both are silent:
122
+ *
123
+ * - a skill names an `owners` agent that does not exist, so nobody runs it;
124
+ * - an agent lists a Preferred Skill that has been renamed or removed, so the
125
+ * agent opens a file that is not there;
126
+ * - a skill exists, declares owners, and no agent lists it - which is how four
127
+ * skills ended up installed but invisible to the runtime.
128
+ *
129
+ * The third is the one worth having a test for, because the skill looks fine
130
+ * from every angle except the only one that matters.
131
+ */
132
+ function validateAgents (catalog, errors) {
133
+ const agentsDir = packagePaths.agentsDir
134
+ if (!fs.existsSync(agentsDir)) return
135
+
136
+ const agentFiles = fs.readdirSync(agentsDir).filter((name) => name.endsWith('.md'))
137
+ const agentNames = new Set(agentFiles.filter((name) => name !== 'README.md').map((name) => name.replace(/\.md$/, '')))
138
+
139
+ const referenced = new Set()
140
+ for (const name of agentFiles) {
141
+ const text = fs.readFileSync(path.join(agentsDir, name), 'utf8')
142
+ for (const match of text.matchAll(/\.github\/skills\/([a-z0-9-]+\.skill\.md)/g)) {
143
+ referenced.add(match[1])
144
+ if (!catalog.skills.some((skill) => skill.file === match[1])) {
145
+ errors.push(`agents/${name} names a skill that is not in the catalog: ${match[1]}`)
146
+ }
147
+ }
148
+ }
149
+
150
+ for (const skill of catalog.skills) {
151
+ for (const owner of skill.owners) {
152
+ if (!agentNames.has(owner)) {
153
+ errors.push(`${skill.file} is owned by an agent that does not exist: ${owner}`)
154
+ }
155
+ }
156
+ if (!referenced.has(skill.file)) {
157
+ errors.push(`${skill.file} is in the catalog but no agent lists it, so no agent will find it`)
158
+ }
159
+ }
160
+ }
161
+
117
162
  function validateSkillFile (skillPath, catalogEntry, catalogIds, errors) {
118
163
  let parsed
119
164
 
@@ -6,7 +6,6 @@ owners:
6
6
  - prototype-builder
7
7
  - workflow-orchestrator
8
8
  reads:
9
- - node_modules/@hippo-digital/hippocampus/docs/source-model.md
10
9
  - node_modules/@hippo-digital/hippocampus/docs/source-model.md
11
10
  - hippocampus/source/screens.json
12
11
  - hippocampus/source/needs.json
@@ -6,7 +6,6 @@ owners:
6
6
  - knowledge-builder
7
7
  - workflow-orchestrator
8
8
  reads:
9
- - node_modules/@hippo-digital/hippocampus/docs/source-model.md
10
9
  - node_modules/@hippo-digital/hippocampus/docs/source-model.md
11
10
  - hippocampus/source/users.json
12
11
  - hippocampus/source/needs.json
@@ -6,7 +6,6 @@ owners:
6
6
  - knowledge-builder
7
7
  - workflow-orchestrator
8
8
  reads:
9
- - node_modules/@hippo-digital/hippocampus/docs/source-model.md
10
9
  - node_modules/@hippo-digital/hippocampus/docs/source-model.md
11
10
  - hippocampus/source/users.json
12
11
  - hippocampus/source/needs.json
@@ -6,7 +6,6 @@ owners:
6
6
  - knowledge-builder
7
7
  - workflow-orchestrator
8
8
  reads:
9
- - node_modules/@hippo-digital/hippocampus/docs/source-model.md
10
9
  - node_modules/@hippo-digital/hippocampus/docs/source-model.md
11
10
  - hippocampus/source/
12
11
  - app/routes.js
@@ -6,7 +6,6 @@ owners:
6
6
  - knowledge-builder
7
7
  - workflow-orchestrator
8
8
  reads:
9
- - node_modules/@hippo-digital/hippocampus/docs/source-model.md
10
9
  - node_modules/@hippo-digital/hippocampus/docs/source-model.md
11
10
  - hippocampus/source/scenarios.json
12
11
  - hippocampus/source/journeys.json
@@ -16,7 +16,6 @@ composes:
16
16
  reads:
17
17
  - node_modules/@hippo-digital/hippocampus/docs/agent-workflow.md
18
18
  - node_modules/@hippo-digital/hippocampus/docs/source-model.md
19
- - node_modules/@hippo-digital/hippocampus/docs/source-model.md
20
19
  - app/routes.js
21
20
  - hippocampus/source/
22
21
  - app/views/
@@ -6,7 +6,6 @@ owners:
6
6
  - knowledge-builder
7
7
  - workflow-orchestrator
8
8
  reads:
9
- - node_modules/@hippo-digital/hippocampus/docs/source-model.md
10
9
  - node_modules/@hippo-digital/hippocampus/docs/source-model.md
11
10
  - hippocampus/source/
12
11
  edits:
@@ -11,7 +11,6 @@ reads:
11
11
  - node_modules/@hippo-digital/hippocampus/docs/repeatable-research-round-ingestion.md
12
12
  - node_modules/@hippo-digital/hippocampus/docs/hippocampus-technical.md
13
13
  - node_modules/@hippo-digital/hippocampus/docs/source-model.md
14
- - node_modules/@hippo-digital/hippocampus/docs/source-model.md
15
14
  - hippocampus/inbox/project/
16
15
  - hippocampus/imports/project/[draft-id].review.md
17
16
  - hippocampus/imports/project/[draft-id].json
@@ -13,6 +13,7 @@ reads:
13
13
  - hippocampus/source/needs.json
14
14
  - hippocampus/source/evidence.json
15
15
  - hippocampus/source/assumptions.json
16
+ - hippocampus/source/relationships.json
16
17
  edits:
17
18
  - hippocampus/source/users.json
18
19
  - hippocampus/source/needs.json
@@ -9,7 +9,6 @@ owners:
9
9
  reads:
10
10
  - node_modules/@hippo-digital/hippocampus/docs/research-knowledge-graph.md
11
11
  - node_modules/@hippo-digital/hippocampus/docs/source-model.md
12
- - node_modules/@hippo-digital/hippocampus/docs/source-model.md
13
12
  - hippocampus/source/users.json
14
13
  - hippocampus/source/needs.json
15
14
  - hippocampus/source/scenarios.json
@@ -0,0 +1,109 @@
1
+ ---
2
+ id: onboard-team-member
3
+ title: Onboard a team member
4
+ purpose: Orient someone new to the project from what the knowledge base already knows, and leave them a dated briefing they can read without an agent.
5
+ owners:
6
+ - knowledge-builder
7
+ - workflow-orchestrator
8
+ composes:
9
+ - ingest-project-context
10
+ - audit-knowledge-source
11
+ reads:
12
+ - hippocampus/source/project.json
13
+ - hippocampus/source/project-context.json
14
+ - hippocampus/source/users.json
15
+ - hippocampus/source/needs.json
16
+ - hippocampus/source/insights.json
17
+ - hippocampus/source/design-actions.json
18
+ - hippocampus/source/decisions.json
19
+ - hippocampus/source/screens.json
20
+ - hippocampus/source/research-rounds.json
21
+ - hippocampus/source/relationships.json
22
+ edits:
23
+ - artefacts/onboarding/
24
+ runs:
25
+ - npx hippocampus validate
26
+ outputs:
27
+ - Answers to a new joiner's questions, grounded in the knowledge base
28
+ - A dated briefing under artefacts/onboarding/ when one is asked for
29
+ guardrails:
30
+ - Separate what was counted from what was written. State every figure as of today's date and name the file each narrative claim came from.
31
+ - Do not invent the project narrative. If project-context.json is empty, say so and point at ingest-project-context rather than describing the project from the graph alone.
32
+ - Write for content, service and interaction designers and user researchers. No file paths, schema names or CLI commands in the briefing itself - link to viewer pages instead.
33
+ - Do not present coverage gaps as failures. "Most needs have no screen" is normal on a project where one slice has been designed; say which slice, not just the number.
34
+ - A project with no rounds, insights or actions is new, not failing. Say so, drop the empty sections, and write a starting guide instead of a status report.
35
+ - The briefing must stand alone. Someone with no agent and no terminal should be able to read it and know where to go next.
36
+ acceptance:
37
+ - Every figure in the output is derived from the knowledge base, not recalled.
38
+ - Narrative claims are attributed, or their absence is stated.
39
+ - Each named role has something specific to do next.
40
+ - A briefing, if produced, is dated and readable without an agent.
41
+ - npx hippocampus validate passes.
42
+ ---
43
+
44
+ # Onboard a team member
45
+
46
+ ## Use when
47
+ - Someone joins a project that already has a knowledge base and needs to know what is known, what is decided, and what is open.
48
+ - Someone is picking up work after a handover and wants the current state rather than the history.
49
+
50
+ Works in two modes. **Live** - answer their questions in conversation, grounded in the records. **Briefing** - write a dated document to `artefacts/onboarding/` for someone who does not have an agent set up yet, or who wants something to keep.
51
+
52
+ ## Workflow
53
+
54
+ ### Read these first
55
+
56
+ 1. `project.json` and `project-context.json` for what the project is. **`project-context.json` is the narrative half.** If its `purpose`, `problemStatement` and `constraints` are empty, the project has never recorded why it exists - say that plainly and suggest `ingest-project-context`. Do not reconstruct a purpose from the graph.
57
+ 2. The graph for the state. Everything below is counted, not remembered.
58
+ 3. `npx hippocampus validate` for the coverage notes.
59
+
60
+ ### Compute rather than recall
61
+
62
+ | Question a joiner asks | Where the answer comes from |
63
+ | --- | --- |
64
+ | What have we learned? | insights, grouped by research round, with participant counts |
65
+ | Who are we designing for? | users, and how many needs each carries |
66
+ | What has been designed? | screens, and which needs they address |
67
+ | What is still open? | design actions by status |
68
+ | What has been decided? | decisions by status; flag any whose consequence is unrecorded |
69
+ | Where are the gaps? | needs with no screen, insights with no need, rounds with no insights |
70
+
71
+ Give the figure and the reading of it. "108 of 132 needs have no screen" is data; "only patient search has been designed, so most needs are untouched - that is the backlog, not a fault" is orientation.
72
+
73
+ ### When the knowledge base is thin
74
+
75
+ A new project has few records, and a briefing full of zeros reads as though something is
76
+ broken. Check before writing: a project with no research rounds, no insights and no design
77
+ actions is **new, not failing**, and the briefing should say so in its first line and become
78
+ a starting guide rather than a status report.
79
+
80
+ In that case, skip the research and open-work sections entirely - an empty section invites
81
+ the reader to think something is missing - and tell them what the project does have and what
82
+ the first records should be. A project with screens and needs but no research has been
83
+ designed on assumptions; that is worth naming, because it is exactly the thing a new
84
+ researcher is there to fix.
85
+
86
+ Only report a count as a gap when there is enough around it for the gap to mean something.
87
+
88
+ ### By role
89
+
90
+ Give each person one specific thing to look at and one they could do this week.
91
+
92
+ - **User researcher** - which rounds produced insights and which did not, insights not yet linked to a need, and whether participants are recorded for each round. The unlinked insights are usually the most useful first contribution.
93
+ - **Content designer** - the screens that exist and the needs behind them. Words on a screen trace back to a need statement written in a user's own language; that is where to check whether the two still agree.
94
+ - **Service designer** - the journeys and their blueprint lanes, and which lanes are empty. An empty backstage or governance lane is a question nobody has answered yet.
95
+ - **Interaction / UX designer** - needs with no screen, and design actions still `proposed`. Those two lists together are the design backlog.
96
+
97
+ ## Guardrails
98
+
99
+ - Separate what was counted from what was written. State figures as of today's date; name the file each narrative claim came from.
100
+ - Do not invent the project narrative.
101
+ - No file paths, schema names or CLI commands in the briefing - link to viewer pages.
102
+ - Do not present coverage gaps as failures.
103
+ - The briefing must stand alone.
104
+
105
+ ## Finish
106
+
107
+ - Run `npx hippocampus validate` and reflect its coverage notes in what you report.
108
+ - In live mode, end by asking which role they are in, and give them the section for it.
109
+ - In briefing mode, write `artefacts/onboarding/<date>-orientation.md` and report where it is, which figures it carries, and anything you could not answer because the project context is empty.
@@ -9,6 +9,10 @@ reads:
9
9
  - node_modules/@hippo-digital/hippocampus/docs/design-actions-and-decisions.md
10
10
  - node_modules/@hippo-digital/hippocampus/docs/source-model.md
11
11
  - node_modules/@hippo-digital/hippocampus/templates/insight-design-action-tracker.xlsx
12
+ - hippocampus/source/design-actions.json
13
+ - hippocampus/source/decisions.json
14
+ - hippocampus/source/relationships.json
15
+ - hippocampus/source/insights.json
12
16
  edits:
13
17
  - hippocampus/source/design-actions.json
14
18
  - hippocampus/source/decisions.json
@@ -485,6 +485,34 @@
485
485
  "Missing artefacts or unresolved blockers stay visible.",
486
486
  "The summary path is reported."
487
487
  ]
488
+ },
489
+ {
490
+ "id": "onboard-team-member",
491
+ "title": "Onboard a team member",
492
+ "purpose": "Orient someone new to the project from what the knowledge base already knows, and leave them a dated briefing they can read without an agent.",
493
+ "file": "onboard-team-member.skill.md",
494
+ "owners": [
495
+ "knowledge-builder",
496
+ "workflow-orchestrator"
497
+ ],
498
+ "composes": [
499
+ "ingest-project-context",
500
+ "audit-knowledge-source"
501
+ ],
502
+ "runs": [
503
+ "npx hippocampus validate"
504
+ ],
505
+ "outputs": [
506
+ "Answers to a new joiner's questions, grounded in the knowledge base",
507
+ "A dated briefing under artefacts/onboarding/ when one is asked for"
508
+ ],
509
+ "acceptance": [
510
+ "Every figure in the output is derived from the knowledge base, not recalled.",
511
+ "Narrative claims are attributed, or their absence is stated.",
512
+ "Each named role has something specific to do next.",
513
+ "A briefing, if produced, is dated and readable without an agent.",
514
+ "npx hippocampus validate passes."
515
+ ]
488
516
  }
489
517
  ]
490
518
  }
@@ -8,7 +8,6 @@ owners:
8
8
  reads:
9
9
  - node_modules/@hippo-digital/hippocampus/docs/source-model.md
10
10
  - node_modules/@hippo-digital/hippocampus/docs/hippocampus-technical.md
11
- - node_modules/@hippo-digital/hippocampus/docs/source-model.md
12
11
  - hippocampus/imports/project/[draft-id].review.md
13
12
  - hippocampus/imports/project/[draft-id].json
14
13
  edits:
@@ -7,7 +7,6 @@ owners:
7
7
  composes:
8
8
  - audit-knowledge-source
9
9
  reads:
10
- - node_modules/@hippo-digital/hippocampus/docs/agent-workflow.md
11
10
  - node_modules/@hippo-digital/hippocampus/docs/agent-workflow.md
12
11
  - artefacts/delivery-summaries/
13
12
  edits:
@@ -0,0 +1,23 @@
1
+ # Artefacts
2
+
3
+ `artefacts/` stores generated review outputs and delivery evidence.
4
+
5
+ It is not canonical source data. Deleting `artefacts/` should not break the app or the knowledge model.
6
+
7
+ ## Subfolders
8
+
9
+ - `screenshots/` - dated review packs for routes, screenshots, and per-route notes
10
+ - `accessibility/` - dated review notes with blockers and follow-up improvements
11
+ - `delivery-summaries/` - handover notes for multi-step work
12
+ - `generated-docs/` - importer and AI-generated review drafts
13
+
14
+ ## Naming conventions
15
+
16
+ Use dated, reviewable paths:
17
+
18
+ - `artefacts/screenshots/<YYYY-MM-DD>-<topic>/manifest.md`
19
+ - `artefacts/accessibility/<YYYY-MM-DD>-<topic>.md`
20
+ - `artefacts/delivery-summaries/<YYYY-MM-DD>-<topic>.md`
21
+
22
+ If a workflow cannot produce images, store notes instead of pretending a screenshot exists.
23
+
@@ -0,0 +1,30 @@
1
+ # Accessibility review notes
2
+
3
+ Store one dated note per review run:
4
+
5
+ ```text
6
+ artefacts/accessibility/<YYYY-MM-DD>-<topic>.md
7
+ ```
8
+
9
+ ## Suggested sections
10
+
11
+ - scope
12
+ - routes reviewed
13
+ - blockers
14
+ - improvements
15
+ - unanswered questions
16
+ - manual follow-up
17
+
18
+ ## What to check
19
+
20
+ Document what was actually reviewed:
21
+
22
+ - heading order
23
+ - labels and legends
24
+ - link text
25
+ - focus flow and keyboard reachability
26
+ - NHS component usage
27
+ - error-state clarity
28
+
29
+ If the review is code-based rather than runtime-based, say so explicitly.
30
+
@@ -0,0 +1,20 @@
1
+ # Delivery summaries
2
+
3
+ Store one dated summary per multi-step change:
4
+
5
+ ```text
6
+ artefacts/delivery-summaries/<YYYY-MM-DD>-<topic>.md
7
+ ```
8
+
9
+ Use delivery summaries for handover notes, route reviews, ingestion proofs, and other orchestrated work.
10
+
11
+ ## Include
12
+
13
+ - request or outcome delivered
14
+ - files changed
15
+ - commands run and their results
16
+ - linked screenshot or accessibility artefacts
17
+ - assumptions, blockers, and follow-up work
18
+
19
+ Keep summaries concise, factual, and reviewable.
20
+
@@ -0,0 +1,30 @@
1
+ # Screenshot review packs
2
+
3
+ Use one folder per route-review run:
4
+
5
+ ```text
6
+ artefacts/screenshots/<YYYY-MM-DD>-<topic>/
7
+ manifest.md
8
+ 01-route-slug.png
9
+ 02-route-slug.png
10
+ ```
11
+
12
+ If image capture is not available, keep the folder and write route notes in `manifest.md` instead.
13
+
14
+ ## Manifest checklist
15
+
16
+ Record:
17
+
18
+ - review purpose
19
+ - commands run, especially `npx hippocampus doctor`
20
+ - routes reviewed
21
+ - whether each route has an image or notes only
22
+ - issues found
23
+ - routes skipped or still needing manual review
24
+
25
+ ## Conventions
26
+
27
+ - Prefer one screenshot per route state that matters.
28
+ - Use lowercase route slugs in filenames where practical.
29
+ - Keep fictional data fictional.
30
+