geneseed 3.7.0 → 3.9.0

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 (194) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/DESIGN.md +13 -10
  3. package/README.md +5 -5
  4. package/SETUP.md +2 -2
  5. package/SHIPPED.md +3 -3
  6. package/adapters/opencode/GLOBAL-HARNESS-SPEC.md +1 -1
  7. package/adapters/opencode/README.md +3 -3
  8. package/adapters/opencode/plugins/geneseed-guard.js +9 -9
  9. package/adapters/opencode/plugins/geneseed-workflow.js +1 -1
  10. package/adapters/opencode/workflows/_runtime.js +2 -2
  11. package/adapters/opencode/workflows/dispatch.js +1 -1
  12. package/docs/extending.md +72 -40
  13. package/docs/web/harnesses.md +2 -2
  14. package/docs/web/plugin-guard.md +2 -2
  15. package/docs/web/rules.md +1 -1
  16. package/docs/web/themes-author.md +2 -2
  17. package/docs/web-ui.md +1 -1
  18. package/harness.config.json +1 -1
  19. package/js/README.md +4 -3
  20. package/js/build/driver.mjs +14 -5
  21. package/js/build/generate.mjs +90 -41
  22. package/js/build/render.mjs +6 -3
  23. package/js/build/source.mjs +105 -1
  24. package/js/build/stubs.mjs +7 -2
  25. package/js/cli-table.json +154 -5
  26. package/js/hosts/hooks.mjs +5 -5
  27. package/js/hosts/native.mjs +1 -1
  28. package/js/inspect/checks-authoring.mjs +149 -116
  29. package/js/inspect/inventory.mjs +1 -2
  30. package/js/inspect/status.mjs +40 -4
  31. package/js/ui/tui.mjs +1 -1
  32. package/js/web/api.mjs +6 -1
  33. package/package.json +1 -1
  34. package/registry.json +7 -0
  35. package/src/AGENT.md.tmpl +19 -15
  36. package/src/agents/_template.md +3 -3
  37. package/src/agents/advocate.md +3 -3
  38. package/src/agents/architect.md +3 -3
  39. package/src/agents/developer.md +4 -4
  40. package/src/agents/docs.md +3 -3
  41. package/src/agents/empiricist.md +4 -4
  42. package/src/agents/explorer.md +4 -4
  43. package/src/agents/framer.md +3 -3
  44. package/src/agents/historian.md +3 -3
  45. package/src/agents/operator.md +3 -3
  46. package/src/agents/pragmatist.md +3 -3
  47. package/src/agents/researcher.md +7 -7
  48. package/src/agents/reviewer.md +3 -3
  49. package/src/agents/security.md +3 -3
  50. package/src/agents/skeptic.md +3 -3
  51. package/src/agents/steward.md +3 -3
  52. package/src/agents/tester.md +3 -3
  53. package/src/agents/user-advocate.md +3 -3
  54. package/src/agents/visionary.md +3 -3
  55. package/src/doctrines/README.md +4 -3
  56. package/src/doctrines/comms.md +4 -4
  57. package/src/doctrines/craft.md +20 -20
  58. package/src/doctrines/ops.md +19 -19
  59. package/src/doctrines/process.md +20 -20
  60. package/src/doctrines/rigor.md +22 -22
  61. package/src/laws/universal.md +23 -44
  62. package/src/memory/README.md +3 -3
  63. package/src/modes/foreman.md +1 -1
  64. package/src/notebook/README.md +1 -1
  65. package/src/ontology/universal.md +7 -9
  66. package/src/postures/artisan.md +2 -2
  67. package/src/skills/_self-improvement.md +4 -4
  68. package/src/skills/_template.md +1 -1
  69. package/src/skills/brainstorm.md +3 -3
  70. package/src/skills/bruno-collection-generator.md +6 -6
  71. package/src/skills/bruno-test-writer.md +5 -5
  72. package/src/skills/ci-fix.md +4 -4
  73. package/src/skills/commit.md +11 -10
  74. package/src/skills/consolidate-memory.md +4 -4
  75. package/src/skills/council.md +2 -2
  76. package/src/skills/debug.md +4 -4
  77. package/src/skills/deps-audit.md +3 -3
  78. package/src/skills/develop.md +7 -7
  79. package/src/skills/document-project.md +6 -6
  80. package/src/skills/explain-changes/SKILL.md +69 -0
  81. package/src/skills/explain-changes/VENDOR.md +20 -0
  82. package/src/skills/explain-changes/scripts/render_changes.mjs +558 -0
  83. package/src/skills/forge-mcp.md +4 -4
  84. package/src/skills/fresh-eyes.md +4 -4
  85. package/src/skills/frontend-design.md +1 -1
  86. package/src/skills/geneseed.md +9 -8
  87. package/src/skills/git-archaeology.md +5 -5
  88. package/src/skills/git-rescue.md +7 -7
  89. package/src/skills/handoff.md +3 -3
  90. package/src/skills/ingest.md +5 -5
  91. package/src/skills/migrate.md +8 -8
  92. package/src/skills/parallel-agents.md +2 -2
  93. package/src/skills/pipeline.md +2 -2
  94. package/src/skills/plan.md +3 -3
  95. package/src/skills/ponytail.md +2 -2
  96. package/src/skills/profile.md +2 -2
  97. package/src/skills/prose.md +1 -1
  98. package/src/skills/prototype.md +1 -1
  99. package/src/skills/refactor.md +3 -3
  100. package/src/skills/release.md +5 -5
  101. package/src/skills/repo-map.md +4 -4
  102. package/src/skills/research.md +9 -9
  103. package/src/skills/review-response.md +4 -4
  104. package/src/skills/rule.md +3 -3
  105. package/src/skills/security-audit.md +5 -5
  106. package/src/skills/ship.md +5 -5
  107. package/src/skills/skill-forge.md +4 -4
  108. package/src/skills/wiki.md +5 -5
  109. package/src/skills/workflow.md +2 -3
  110. package/src/skills/worktree.md +4 -4
  111. package/themes/_TEMPLATE.json +38 -40
  112. package/themes/biker.json +38 -40
  113. package/themes/commentator.json +38 -40
  114. package/themes/cyberpunk.json +38 -40
  115. package/themes/gamer.json +38 -40
  116. package/themes/imperial.json +38 -40
  117. package/themes/joker.json +38 -40
  118. package/themes/marvin.json +38 -40
  119. package/themes/mean.json +38 -40
  120. package/themes/military.json +38 -40
  121. package/themes/neutral.json +38 -40
  122. package/themes/pirate.json +38 -40
  123. package/themes/sports.json +38 -40
  124. package/themes/verstappen.json +38 -40
  125. package/themes/wizard.json +38 -40
  126. package/web/dist/assets/Activity-DAzV-qQj.js +1 -0
  127. package/web/dist/assets/ActivityDetail-CwEwMtKl.js +1 -0
  128. package/web/dist/assets/Dashboard-C2ELBW-X.js +2 -0
  129. package/web/dist/assets/{Docs-DrJNDPwI.js → Docs-iZrvQP8J.js} +2 -2
  130. package/web/dist/assets/FilterInput-CVyqmYWM.js +1 -0
  131. package/web/dist/assets/GreenhouseView-Bq1QmaGO.js +2 -0
  132. package/web/dist/assets/Installs-BiqR8xdO.js +2 -0
  133. package/web/dist/assets/JournalView-6wilG5Zd.js +1 -0
  134. package/web/dist/assets/Laws-D8YXD_XE.js +3 -0
  135. package/web/dist/assets/Library-DwuTZ2-L.js +1 -0
  136. package/web/dist/assets/{Markdown-BQAvN8xx.js → Markdown-CkFyfgNf.js} +14 -14
  137. package/web/dist/assets/OperatorHudView-B-HVBqfY.js +2 -0
  138. package/web/dist/assets/Personal-BbUTmZQR.js +1 -0
  139. package/web/dist/assets/Tabs-_pjUFIEI.js +1 -0
  140. package/web/dist/assets/drawable-CoIulEH2.js +1 -0
  141. package/web/dist/assets/geist-mono-latin-400-normal-DTRLJnHl.woff2 +0 -0
  142. package/web/dist/assets/geist-mono-latin-500-normal-YINYabwD.woff2 +0 -0
  143. package/web/dist/assets/index-BMwSp8BP.js +2 -0
  144. package/web/dist/assets/index-CDPDk2vj.css +1 -0
  145. package/web/dist/assets/{react-DbkvxWG5.js → react-B9Z_tXRV.js} +1 -1
  146. package/web/dist/assets/sections-GalMS0Zv.js +1 -0
  147. package/web/dist/assets/usePoll-O0sJEw1Y.js +1 -0
  148. package/web/dist/index.html +4 -4
  149. package/web/src/pages/Laws.jsx +616 -361
  150. package/web/dist/assets/Activity-CH-7cPIM.js +0 -1
  151. package/web/dist/assets/ActivityDetail-DZvz0xS5.js +0 -1
  152. package/web/dist/assets/CatalogRow-DftXpZHY.js +0 -1
  153. package/web/dist/assets/Diff-DvwdG0L9.js +0 -2
  154. package/web/dist/assets/Doctor-OTmwmYZg.js +0 -1
  155. package/web/dist/assets/FilterInput-BakJLvaV.js +0 -1
  156. package/web/dist/assets/GreenhouseView-XxrAdriX.js +0 -2
  157. package/web/dist/assets/Harness-C_LYNk5c.js +0 -1
  158. package/web/dist/assets/JournalView-BcuyeEaR.js +0 -1
  159. package/web/dist/assets/Laws-CWHrTKY4.js +0 -3
  160. package/web/dist/assets/Library-CA9IHghn.js +0 -1
  161. package/web/dist/assets/OperatorHudView-BMRY1Tt4.js +0 -2
  162. package/web/dist/assets/Profile-wceET1JY.js +0 -1
  163. package/web/dist/assets/Rules-BEXvY4Tx.js +0 -1
  164. package/web/dist/assets/Settings-DS2zF0Ez.js +0 -1
  165. package/web/dist/assets/Skills-DahlOJuI.js +0 -1
  166. package/web/dist/assets/StatusBadge-Cg6j-NJL.js +0 -1
  167. package/web/dist/assets/activity-iWaWVtsR.js +0 -1
  168. package/web/dist/assets/audiowide-latin-400-normal-6GFCX7ni.woff2 +0 -0
  169. package/web/dist/assets/drawable-BTHjTzF7.js +0 -1
  170. package/web/dist/assets/geist-mono-latin-400-normal-DKaoCDn5.woff2 +0 -0
  171. package/web/dist/assets/geist-mono-latin-500-normal-C3sF8Y1B.woff2 +0 -0
  172. package/web/dist/assets/geist-mono-latin-600-normal-BHzjB6_C.woff2 +0 -0
  173. package/web/dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  174. package/web/dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  175. package/web/dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  176. package/web/dist/assets/ibm-plex-serif-latin-400-normal-BIGslYFI.woff2 +0 -0
  177. package/web/dist/assets/ibm-plex-serif-latin-500-normal-REKAfBVG.woff2 +0 -0
  178. package/web/dist/assets/ibm-plex-serif-latin-600-normal-DAxitmSu.woff2 +0 -0
  179. package/web/dist/assets/index-AN5Emnrg.js +0 -2
  180. package/web/dist/assets/index-Ruh93A3A.css +0 -1
  181. package/web/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  182. package/web/dist/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  183. package/web/dist/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  184. package/web/dist/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  185. package/web/dist/assets/lawCats-Btjp3Hk_.js +0 -1
  186. package/web/dist/assets/oswald-latin-400-normal-BAFo8sP8.woff2 +0 -0
  187. package/web/dist/assets/oswald-latin-500-normal-B-eyT0Dw.woff2 +0 -0
  188. package/web/dist/assets/oswald-latin-600-normal-plFmSr5g.woff2 +0 -0
  189. package/web/dist/assets/oswald-latin-700-normal-vy6hmKSr.woff2 +0 -0
  190. package/web/dist/assets/poppins-latin-400-normal-cpxAROuN.woff2 +0 -0
  191. package/web/dist/assets/poppins-latin-500-normal-C8OXljZJ.woff2 +0 -0
  192. package/web/dist/assets/poppins-latin-600-normal-zEkxB9Mr.woff2 +0 -0
  193. package/web/dist/assets/poppins-latin-700-normal-Qrb0O0WB.woff2 +0 -0
  194. package/web/dist/assets/rolldown-runtime-CbXtAM7H.js +0 -1
@@ -9,30 +9,30 @@ case where the seam is only known once the change is made.
9
9
 
10
10
  ## Procedure
11
11
  1. Orient on the project's own documentation for what you are about to touch
12
- ({{DOCTRINE}} process 4), and confirm the actual starting state — the suite runs,
13
- the baseline is green ({{LAW}} III). A red baseline is a [debug {{SKILL}}](debug.md)
12
+ ({{DOCTRINE:read-the-docs-first}}), and confirm the actual starting state — the suite runs,
13
+ the baseline is green ({{LAW:verify-before-asserting}}). A red baseline is a [debug {{SKILL}}](debug.md)
14
14
  task first, not something to build on.
15
15
  2. Agree the seams: name the public interfaces the tests will target and confirm
16
16
  them with the user when they are not obvious — no test is written at an
17
17
  unconfirmed seam. Testing effort belongs on critical paths and complex logic,
18
18
  not every edge.
19
- 3. Pick the next **smallest slice** that advances the task ({{DOCTRINE}} craft 6), then
19
+ 3. Pick the next **smallest slice** that advances the task ({{DOCTRINE:smallest-viable-diff}}), then
20
20
  cover it:
21
21
  - *Seam known up front* — test-first. Write ONE failing test that pins the slice,
22
22
  specific about the expected output (for a bug, the test reproduces it). Run it
23
23
  and watch it fail **for the right reason** — a test that passes immediately, or
24
24
  fails on a typo, proves nothing.
25
25
  - *Seam only clear once the change exists* — write the covering test alongside the
26
- change ({{DOCTRINE}} rigor 3), then break the implementation on purpose once to
26
+ change ({{DOCTRINE:cover-and-verify}}), then break the implementation on purpose once to
27
27
  see the test go red before trusting it.
28
28
  4. Write the minimum code that makes it pass; add nothing the test doesn't demand.
29
- 5. Run the *affected* tests and read the output ({{LAW}} III); on failure fix the
30
- cause, never mask it ({{LAW}} VIII). Dispatch the
29
+ 5. Run the *affected* tests and read the output ({{LAW:verify-before-asserting}}); on failure fix the
30
+ cause, never mask it ({{LAW:cure-the-cause}}). Dispatch the
31
31
  [tester {{AGENT}}](../{{DIR_AGENTS}}/tester.md) for heavier or unfamiliar coverage,
32
32
  or when the blast radius is unclear.
33
33
  6. With the slice green, tidy through the [refactor {{SKILL}}](refactor.md) — the tests
34
34
  are the safety net — then commit the slice through the [commit {{SKILL}}](commit.md)
35
- ({{DOCTRINE}} process 5). Loop from step 3, one slice at a time.
35
+ ({{DOCTRINE:consent-before-push}}). Loop from step 3, one slice at a time.
36
36
  7. **Exit.** When the last slice is in: run the whole affected suite once more, state
37
37
  what was run and its result, and hand over — to the [ship {{SKILL}}](ship.md) when
38
38
  the change is ready for a PR, or to the [handoff {{SKILL}}](handoff.md) if the
@@ -13,8 +13,8 @@ write; with none, step 3 proposes them.
13
13
  convention [repo-map {{SKILL}}](repo-map.md) and the context loader use). Reuse the one
14
14
  that exists — never create a second. If none exists, create `docs/` at the root.
15
15
  2. **Survey the code, not the intent.** Map entry points, the public API / modules,
16
- commands, config, and key directories — read the actual behaviour (universal {{LAW}} III,
17
- {{DOCTRINE}} process 4). If there is no `ARCHITECTURE.md`, run [repo-map {{SKILL}}](repo-map.md)
16
+ commands, config, and key directories — read the actual behaviour ({{LAW:verify-before-asserting}},
17
+ {{DOCTRINE:read-the-docs-first}}). If there is no `ARCHITECTURE.md`, run [repo-map {{SKILL}}](repo-map.md)
18
18
  first so you have the orientation map to build on.
19
19
  3. **Select the doc set.** Unless the argument names the targets, propose which of the four
20
20
  documents apply and wait for the user's go-ahead — e.g. "no UI detected (no stylesheet,
@@ -30,7 +30,7 @@ write; with none, step 3 proposes them.
30
30
  5. **Reconcile the markdown (whole tree).** Check every existing page against the current
31
31
  implementation — renamed or removed APIs, changed flags, dead examples — and fix the
32
32
  drift. Add pages for significant undocumented surfaces; remove docs for features that no
33
- longer exist (deletion is deliberate — {{LAW}} IV). For substantial writing, dispatch
33
+ longer exist ({{LAW:deletion-is-deliberate}}). For substantial writing, dispatch
34
34
  the [docs {{AGENT}}](../{{DIR_AGENTS}}/docs.md). Keep examples runnable — run them.
35
35
  Every generated page follows three conventions:
36
36
  - **Typed frontmatter.** Open each page with YAML frontmatter carrying `type:` (one of
@@ -52,9 +52,9 @@ write; with none, step 3 proposes them.
52
52
  members included, current with the set you just reconciled.
53
53
  7. **Regenerate the HTML** — self-contained files at the doc home, a visual parallel to the
54
54
  markdown and never a source of truth: regenerate them whole from the markdown each run
55
- ({{DOCTRINE}} ops 3: edit the source, not the surface).
55
+ ({{DOCTRINE:edit-the-source-not-the-surface}}).
56
56
  Overwrite the previous ones, but confirm each is the generated artifact before clobbering
57
- ({{LAW}} III, {{LAW}} IV). Both files:
57
+ ({{LAW:verify-before-asserting}}, {{LAW:deletion-is-deliberate}}). Both files:
58
58
  - **Stand alone, fully offline** — a single file, content pre-rendered to semantic HTML,
59
59
  all styling in one inline `<style>`, at most minimal vanilla JS (light/dark toggle, TOC
60
60
  scroll). No CDN, no external assets, no web fonts (use a system-font stack). Render any
@@ -84,7 +84,7 @@ write; with none, step 3 proposes them.
84
84
  (variants, states, path) — no live rendering, which would need the project's framework; and
85
85
  the hard-coded-value drift in a separate callout.
86
86
  8. **Do not auto-publish.** Leave the changes for the user to review; stage and commit only
87
- on consent, via the [commit {{SKILL}}](commit.md) ({{DOCTRINE}} process 5).
87
+ on consent, via the [commit {{SKILL}}](commit.md) ({{DOCTRINE:consent-before-push}}).
88
88
 
89
89
  ## The doc set
90
90
 
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: explain-changes
3
+ description: "Explain a change visually before it is committed: renders one offline HTML page — the intent, the risks to check first, a walkthrough by logical unit, and the exact git diff side by side — and opens it. Use when the user asks to explain, walk through, show, visualise or review the changes ('what did you change?', 'show me the diff'), before asking consent to commit a non-trivial change (offer it, never impose it), or to explain a whole branch or PR."
4
+ ---
5
+
6
+ # explain-changes
7
+
8
+ > Turn a diff into a page a human can actually verify: why each part changed, what to check first, and the exact diff beside it.
9
+
10
+ **Trigger:** the user asks to explain, walk through, show or visualise the changes; you are about to ask consent to commit a non-trivial change (offer the report — never make it a condition); or the user wants a branch or PR explained (`--base <ref>`).
11
+
12
+ ## Division of labour
13
+
14
+ You write the **brief** — the narrative only. `scripts/render_changes.mjs` runs `git diff` itself and puts the exact diff on the page. Never paste diff lines into the brief: you would pay for them in output tokens and could alter the very thing under review. The script only reads git; it never stages anything.
15
+
16
+ ## Procedure
17
+
18
+ 1. **Measure.** `git diff --cached --shortstat`; if empty, `git diff HEAD --shortstat`; for a branch, `git diff <ref>...HEAD --shortstat`. The shortstat leaves out untracked files, which the report includes when nothing is staged: add `git ls-files --others --exclude-standard | wc -l` (or the host equivalent) to the file count.
19
+ 2. **Choose who writes the brief.**
20
+ - You made the change, and it is under ~300 changed lines and ~10 files: write it yourself from what you already know. Read only the hunks you do not remember (`git diff -- <path>`).
21
+ - Bigger, a change you did not make, or your context is already heavy: delegate to **one fresh subagent** (the `developer` agent where the host has agents). Hand it the user's request verbatim, your intent notes per logical unit (a few lines each), the diff command, this file's brief rules, and the render command. It returns the report path and three lines. The full diff never enters your context.
22
+ - No subagents on this host: write the brief one logical unit at a time, reading `git diff -- <paths>` for that unit only.
23
+ 3. **Write the brief** as JSON to a temporary file outside the repository (schema below).
24
+ 4. **Render.**
25
+ `node <this-skill-directory>/scripts/render_changes.mjs --brief <brief.json> --out <your notebook directory>` — add `--base <ref>` for a branch. Your notebook directory is named in your root instructions; if this install has none, omit `--out` and the report goes under `.git/explain-changes/`.
26
+ `--base <ref>` covers committed work only (`<ref>...HEAD`); uncommitted changes are not in it — commit first, or explain them separately without `--base`.
27
+ 5. **Fix mismatches.** If the script prints narrative mismatches — a file or hunk you cited that is not in the diff, a changed file no unit explains, an unsafe diagram, no risks — fix the brief and re-run. Never hand over a bannered report.
28
+ 6. **Open it.** Windows `start "" "<path>"` from cmd or Git Bash, `Start-Process "<path>"` from PowerShell; macOS `open "<path>"`, Linux `xdg-open "<path>"`. If that fails (headless, SSH, container), print the path instead.
29
+ 7. **Hand over** in two lines: the path, and the one risk the user should check first. Before you later ask commit consent, run the script with `--hash`: if it differs from the `diff <hash>` in the report's footer, the diff has changed since — regenerate.
30
+
31
+ ## The brief
32
+
33
+ ```json
34
+ {
35
+ "lang": "en",
36
+ "title": "HTTP cache with expiry",
37
+ "request": "the user's request, verbatim",
38
+ "summary": "3-5 sentences: what changes for the user or the system, and why",
39
+ "risks": [
40
+ { "level": "high", "text": "The cache key ignores auth headers: two users can get each other's response.", "unit": "u2" }
41
+ ],
42
+ "units": [
43
+ {
44
+ "id": "u1",
45
+ "kind": "entry point",
46
+ "title": "The client reads the cache before the network",
47
+ "why": "1-2 sentences",
48
+ "files": ["src/http/client.js"],
49
+ "hunks": { "src/http/client.js": [0, 1] },
50
+ "out_of_scope": false,
51
+ "svg": "<svg viewBox=\"0 0 760 150\">…</svg>"
52
+ }
53
+ ]
54
+ }
55
+ ```
56
+
57
+ - `request` is the user's words, verbatim — not your summary of them.
58
+ - **Units follow execution order** (entry point → core → effects → tests), not file order. One unit = one intent. `hunks` picks hunks by index; omit it to show every hunk of each file in `files`.
59
+ - **`risks` is the section the reader acts on.** Cover, whenever they exist: assumptions you did not verify; what is untested; files touched outside the request (also mark that unit `"out_of_scope": true`); user-visible behaviour changes (API, config, schema, migrations). You are describing your own work — err toward listing. `level` is `high`, `medium` or `low`. An empty list needs `"risks_none_reason"`.
60
+ - **`svg` only when the change alters a flow between components** — a call sequence, a data model, a state machine. A change local to one file gets none. Hand-written inline SVG, one `<svg>` element and nothing after it; no scripts, event handlers, `foreignObject`, `<style>` (use attributes), animated links, external links or `url()` to anything but a `#fragment` — the script drops unsafe diagrams. Use `currentColor`, `var(--muted)`, `var(--add-ink)`, `var(--del-ink)`, `var(--line)` and `var(--code-bg)` so it follows the page theme.
61
+ - `lang` is `en` or `fr`, matching the user's language; write every text field in that language.
62
+
63
+ ## Privacy
64
+
65
+ The report contains code. It stays in a git-ignored local path; if the diff holds a secret, the report does too — the same exposure as the diff itself. Never commit or publish a report.
66
+
67
+ ## Done when
68
+
69
+ - A report built from the current diff exists with no mismatch banner, it is open (or its path given), and the user knows the one risk to check first.
@@ -0,0 +1,20 @@
1
+ # Folder skill — explain-changes
2
+
3
+ Like `token-report`, this folder is **Geneseed-authored**, not third-party. It rides
4
+ the vendored-folder mechanism because it bundles an executable
5
+ (`scripts/render_changes.mjs`) and Geneseed's flat-skill pipeline renders single
6
+ `.md` files only. Listing it in the generator's `VENDORED_SKILL_DIRS` makes the
7
+ whole folder ride along verbatim into every host emit — Claude Code, IBM Bob,
8
+ OpenCode, GitHub Copilot, OpenClaude.
9
+
10
+ - **Upstream:** this repository (first-party)
11
+ - **License:** same as Geneseed (see repository LICENSE)
12
+
13
+ Consequences of riding this mechanism (deliberate):
14
+
15
+ - exempt from the flat-skill authoring gates (theme DESC tokens, dead-link,
16
+ hermeticity) — the SKILL.md carries its own frontmatter `description`, and it
17
+ names no themed term: the notebook directory reaches the script as `--out`;
18
+ - listed in AGENT.md's folder-skills section, not the main skills table.
19
+
20
+ The script needs only `node` and `git`, both already present wherever Geneseed runs.