@litfamily/litopencode 1.0.31 → 1.0.32

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 (267) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README-Ko-KR.md +6 -6
  3. package/README.md +6 -6
  4. package/dist/activation-probe.js +1 -0
  5. package/dist/activation-prompt-utils.d.ts +1 -1
  6. package/dist/activation-reentry.d.ts +20 -0
  7. package/dist/activation-reentry.js +110 -1
  8. package/dist/activation-routing.d.ts +2 -1
  9. package/dist/activation-routing.js +100 -11
  10. package/dist/activation-workflow-prompts.d.ts +4 -0
  11. package/dist/activation-workflow-prompts.js +30 -0
  12. package/dist/activation.d.ts +1 -1
  13. package/dist/activation.js +44 -5
  14. package/dist/adhd-next.d.ts +51 -0
  15. package/dist/adhd-next.js +150 -0
  16. package/dist/cli/managed-skill-assets.d.ts +1 -1
  17. package/dist/cli/managed-skill-assets.js +7 -1
  18. package/dist/cli/native-skill-integrity.js +1 -1
  19. package/dist/cli.js +7 -1
  20. package/dist/commands.d.ts +28 -1
  21. package/dist/commands.js +48 -1
  22. package/dist/features.d.ts +80 -1
  23. package/dist/features.js +105 -1
  24. package/dist/ledger.js +12 -1
  25. package/dist/secret-shapes.js +5 -5
  26. package/dist/skills.d.ts +22 -1
  27. package/dist/skills.js +36 -0
  28. package/dist/start-work-typed.d.ts +34 -0
  29. package/dist/start-work-typed.js +156 -0
  30. package/dist/state.d.ts +2 -0
  31. package/dist/state.js +2 -0
  32. package/dist/tools.js +22 -2
  33. package/dist/tui/mission-band.d.ts +20 -1
  34. package/dist/tui/mission-band.js +73 -16
  35. package/dist/tui/mission-looks.d.ts +38 -0
  36. package/dist/tui/mission-looks.js +73 -0
  37. package/dist/tui/mission-model.d.ts +2 -0
  38. package/dist/tui/mission-model.js +3 -1
  39. package/dist/tui/mission-rainbow.d.ts +33 -0
  40. package/dist/tui/mission-rainbow.js +90 -0
  41. package/dist/tui/mission-source.d.ts +48 -0
  42. package/dist/tui/mission-source.js +184 -2
  43. package/dist/tui/mission-text.d.ts +2 -0
  44. package/dist/tui/mission-text.js +9 -1
  45. package/dist/tui/mission-threads.d.ts +50 -0
  46. package/dist/tui/mission-threads.js +119 -0
  47. package/dist/tui.js +84 -6
  48. package/dist/uiux-visual-catalog.js +8 -1
  49. package/dist/v2/session-hooks.js +38 -5
  50. package/dist/workflow-stack.d.ts +53 -0
  51. package/dist/workflow-stack.js +196 -0
  52. package/docs/assets/readme/badge-version.svg +1 -1
  53. package/docs/assets/skills/lit-schematic.webp +0 -0
  54. package/docs/reference-Ko-KR.md +30 -2
  55. package/docs/reference.md +34 -2
  56. package/package.json +1 -1
  57. package/skills/frontend-ui-ux/SKILL.md +3 -2
  58. package/skills/frontend-ui-ux/kit/components.css +414 -0
  59. package/skills/frontend-ui-ux/kit/fonts.json +22 -0
  60. package/skills/frontend-ui-ux/kit/layouts/landing.html +164 -0
  61. package/skills/frontend-ui-ux/kit/layouts/settings.html +114 -0
  62. package/skills/frontend-ui-ux/kit/layouts/workspace.html +115 -0
  63. package/skills/frontend-ui-ux/kit/styles/computational-brutalism.json +227 -0
  64. package/skills/frontend-ui-ux/kit/styles/field-notes.json +205 -0
  65. package/skills/frontend-ui-ux/kit/styles/graphite.json +200 -0
  66. package/skills/frontend-ui-ux/kit/styles/meadow.json +199 -0
  67. package/skills/frontend-ui-ux/kit/styles/neo-brutalism.json +222 -0
  68. package/skills/frontend-ui-ux/kit/ui.js +226 -0
  69. package/skills/frontend-ui-ux/references/brand-and-imagery.md +2 -2
  70. package/skills/frontend-ui-ux/references/complete-contract.md +2 -1
  71. package/skills/frontend-ui-ux/references/craft-floor.md +6 -2
  72. package/skills/frontend-ui-ux/references/default-editorial-pixel.json +3 -0
  73. package/skills/frontend-ui-ux/references/house-styles.md +236 -0
  74. package/skills/frontend-ui-ux/references/motion-guide.md +2 -2
  75. package/skills/frontend-ui-ux/references/production.md +3 -1
  76. package/skills/frontend-ui-ux/references/slop-register.md +4 -4
  77. package/skills/frontend-ui-ux/scripts/design-lock.mjs +400 -0
  78. package/skills/frontend-ui-ux/scripts/pixel-art.mjs +60 -0
  79. package/skills/frontend-ui-ux/scripts/probe-lock.mjs +235 -0
  80. package/skills/frontend-ui-ux/scripts/probe-page.mjs +34 -12
  81. package/skills/frontend-ui-ux/scripts/probe-static.mjs +16 -3
  82. package/skills/frontend-ui-ux/scripts/probe-thresholds.json +8 -2
  83. package/skills/frontend-ui-ux/scripts/probe.mjs +35 -7
  84. package/skills/lit-adhd/SKILL.md +208 -0
  85. package/skills/lit-adhd/references/brief-format.md +43 -0
  86. package/skills/lit-adhd/references/card-examples.md +82 -0
  87. package/skills/lit-adhd/references/status-taxonomy.md +29 -0
  88. package/skills/lit-adhd/scripts/rewind.mjs +835 -0
  89. package/skills/lit-diagram-drawer/SKILL.md +4 -3
  90. package/skills/lit-diagram-drawer/references/style-guide.md +20 -11
  91. package/skills/lit-diagram-drawer/references/type-architecture.md +3 -3
  92. package/skills/lit-diagram-drawer/references/type-dependency.md +1 -1
  93. package/skills/lit-diagram-drawer/references/type-tree.md +3 -3
  94. package/skills/lit-diagram-drawer/references/type-wardley.md +1 -1
  95. package/skills/lit-diagram-drawer/references/verifier-guide.md +1 -0
  96. package/skills/lit-diagram-drawer/scripts/craft-thresholds.json +1 -2
  97. package/skills/lit-diagram-drawer/scripts/visual-quality.mjs +1 -2
  98. package/skills/lit-docx/SKILL.md +2 -1
  99. package/skills/lit-handoff/SKILL.md +2 -0
  100. package/skills/lit-hijack/SKILL.md +422 -0
  101. package/skills/lit-hijack/references/capture-and-provenance.md +87 -0
  102. package/skills/lit-hijack/references/clean-room-build.md +111 -0
  103. package/skills/lit-hijack/references/distil-and-licence.md +100 -0
  104. package/skills/lit-hijack/references/gap-and-port-design.md +126 -0
  105. package/skills/lit-hijack/references/parity-and-report.md +110 -0
  106. package/skills/lit-hijack/scripts/hijack.mjs +993 -0
  107. package/skills/lit-plan/SKILL.md +2 -0
  108. package/skills/lit-pptx/SKILL.md +27 -11
  109. package/skills/lit-pptx/fonts/jetbrains-mono/JetBrainsMono-Bold.ttf +0 -0
  110. package/skills/lit-pptx/fonts/jetbrains-mono/JetBrainsMono-Regular.ttf +0 -0
  111. package/skills/lit-pptx/fonts/jetbrains-mono/OFL.txt +93 -0
  112. package/skills/lit-pptx/fonts/jetbrains-mono/SOURCE.md +17 -0
  113. package/skills/lit-pptx/references/density-and-fill.md +9 -3
  114. package/skills/lit-pptx/references/direction-step.md +21 -6
  115. package/skills/lit-pptx/references/examples/04-lecture-chalk-ko.md +3 -6
  116. package/skills/lit-pptx/references/examples/05-research-talk-paper-en.md +1 -5
  117. package/skills/lit-pptx/references/examples/08-reliability-keynote-night-en.md +0 -4
  118. package/skills/lit-pptx/references/examples/09-status-update-ledger-en.md +2 -2
  119. package/skills/lit-pptx/references/examples/11-forecast-review-night-ko.md +4 -7
  120. package/skills/lit-pptx/references/examples/13-engineering-review-computational-brutalism-ko.md +173 -0
  121. package/skills/lit-pptx/references/examples/14-launch-pitch-neo-brutalism-ko.md +154 -0
  122. package/skills/lit-pptx/references/examples/15-design-lecture-bauhaus-ko.md +139 -0
  123. package/skills/lit-pptx/references/examples/16-community-programme-riso-ko.md +158 -0
  124. package/skills/lit-pptx/references/examples/17-public-data-briefing-newsroom-ko.md +179 -0
  125. package/skills/lit-pptx/references/layout-families.md +65 -47
  126. package/skills/lit-pptx/references/title-treatments.md +83 -134
  127. package/skills/lit-pptx/references/tonalities/atlas.md +3 -3
  128. package/skills/lit-pptx/references/tonalities/bauhaus.md +140 -0
  129. package/skills/lit-pptx/references/tonalities/chalk.md +7 -6
  130. package/skills/lit-pptx/references/tonalities/computational-brutalism.md +150 -0
  131. package/skills/lit-pptx/references/tonalities/gazette.md +1 -1
  132. package/skills/lit-pptx/references/tonalities/ledger.md +1 -1
  133. package/skills/lit-pptx/references/tonalities/neo-brutalism.md +161 -0
  134. package/skills/lit-pptx/references/tonalities/newsroom.md +144 -0
  135. package/skills/lit-pptx/references/tonalities/night.md +1 -1
  136. package/skills/lit-pptx/references/tonalities/paper.md +2 -2
  137. package/skills/lit-pptx/references/tonalities/riso.md +137 -0
  138. package/skills/lit-pptx/references/tonalities/signal.md +3 -3
  139. package/skills/lit-pptx/references/tonalities/studio.md +7 -6
  140. package/skills/lit-pptx/run.mjs +2 -1
  141. package/skills/lit-pptx/scripts/compile-deck.js +1 -1
  142. package/skills/lit-pptx/scripts/craft-thresholds.json +4 -8
  143. package/skills/lit-pptx/scripts/craft_extras.py +56 -3
  144. package/skills/lit-pptx/scripts/deck_output.py +75 -90
  145. package/skills/lit-pptx/scripts/embed_fonts.py +13 -1
  146. package/skills/lit-pptx/scripts/layout_inventory.py +12 -5
  147. package/skills/lit-pptx/scripts/lib/grid-resolver.js +101 -110
  148. package/skills/lit-pptx/scripts/lib/layout-resolver.js +9 -15
  149. package/skills/lit-pptx/scripts/lib/render-pack.js +373 -566
  150. package/skills/lit-pptx/scripts/lib/slide-grid.js +104 -0
  151. package/skills/lit-pptx/scripts/lib/template-registry.js +57 -6
  152. package/skills/lit-pptx/scripts/qa_deck.py +10 -11
  153. package/skills/lit-pptx/scripts/render_pages.py +118 -0
  154. package/skills/lit-pptx/templates/tonalities/atlas/pack.yaml +1 -1
  155. package/skills/lit-pptx/templates/tonalities/bauhaus/pack.yaml +98 -0
  156. package/skills/lit-pptx/templates/tonalities/chalk/pack.yaml +1 -1
  157. package/skills/lit-pptx/templates/tonalities/computational-brutalism/pack.yaml +99 -0
  158. package/skills/lit-pptx/templates/tonalities/gazette/pack.yaml +1 -1
  159. package/skills/lit-pptx/templates/tonalities/ledger/pack.yaml +1 -1
  160. package/skills/lit-pptx/templates/tonalities/neo-brutalism/pack.yaml +107 -0
  161. package/skills/lit-pptx/templates/tonalities/newsroom/pack.yaml +99 -0
  162. package/skills/lit-pptx/templates/tonalities/night/pack.yaml +1 -1
  163. package/skills/lit-pptx/templates/tonalities/paper/pack.yaml +1 -1
  164. package/skills/lit-pptx/templates/tonalities/riso/pack.yaml +99 -0
  165. package/skills/lit-pptx/templates/tonalities/signal/pack.yaml +2 -2
  166. package/skills/lit-pptx/templates/tonalities/studio/pack.yaml +1 -1
  167. package/skills/lit-recap/SKILL.md +4 -0
  168. package/skills/lit-schematic/SKILL.md +118 -0
  169. package/skills/lit-schematic/examples/iso-heat-exchanger/build.mjs +38 -0
  170. package/skills/lit-schematic/examples/iso-heat-exchanger/scene.mjs +133 -0
  171. package/skills/lit-schematic/examples/journal-adsorption-rig/build.mjs +87 -0
  172. package/skills/lit-schematic/examples/pid-dosing-skid/build.mjs +85 -0
  173. package/skills/lit-schematic/references/cutaway-outputs.md +70 -0
  174. package/skills/lit-schematic/references/isometric-craft.md +101 -0
  175. package/skills/lit-schematic/references/journal-figures.md +72 -0
  176. package/skills/lit-schematic/references/kit-api.md +134 -0
  177. package/skills/lit-schematic/references/pfd-and-layout.md +53 -0
  178. package/skills/lit-schematic/references/pid-drafting.md +103 -0
  179. package/skills/lit-schematic/references/pid-symbols.md +163 -0
  180. package/skills/lit-schematic/references/verification.md +100 -0
  181. package/skills/lit-schematic/scripts/doctor.mjs +57 -0
  182. package/skills/lit-schematic/scripts/lib/figure.mjs +81 -0
  183. package/skills/lit-schematic/scripts/lib/fonts.mjs +25 -0
  184. package/skills/lit-schematic/scripts/lib/geom.mjs +113 -0
  185. package/skills/lit-schematic/scripts/lib/interactive.mjs +292 -0
  186. package/skills/lit-schematic/scripts/lib/isa.mjs +115 -0
  187. package/skills/lit-schematic/scripts/lib/iso.mjs +719 -0
  188. package/skills/lit-schematic/scripts/lib/legend-sheet.mjs +162 -0
  189. package/skills/lit-schematic/scripts/lib/pid.mjs +937 -0
  190. package/skills/lit-schematic/scripts/lib/png.mjs +132 -0
  191. package/skills/lit-schematic/scripts/lib/qa-core.mjs +658 -0
  192. package/skills/lit-schematic/scripts/lib/route.mjs +218 -0
  193. package/skills/lit-schematic/scripts/lib/sheet.mjs +890 -0
  194. package/skills/lit-schematic/scripts/lib/svg.mjs +82 -0
  195. package/skills/lit-schematic/scripts/lib/theme.mjs +115 -0
  196. package/skills/lit-schematic/scripts/motion.mjs +129 -0
  197. package/skills/lit-schematic/scripts/qa.mjs +92 -0
  198. package/skills/lit-schematic/scripts/render.mjs +233 -0
  199. package/skills/lit-schematic/scripts/scaffold.mjs +60 -0
  200. package/skills/lit-scientific-visualization/SKILL.md +27 -4
  201. package/skills/lit-typographic-motion/SKILL.md +19 -17
  202. package/skills/lit-typographic-motion/THIRD_PARTY_NOTICES +9 -0
  203. package/skills/lit-typographic-motion/engine/accents.mjs +6 -0
  204. package/skills/lit-typographic-motion/engine/assets.mjs +282 -0
  205. package/skills/lit-typographic-motion/engine/blender/runner.py +228 -0
  206. package/skills/lit-typographic-motion/engine/blender.mjs +126 -0
  207. package/skills/lit-typographic-motion/engine/board.mjs +138 -0
  208. package/skills/lit-typographic-motion/engine/cover/assets.mjs +11 -8
  209. package/skills/lit-typographic-motion/engine/cover/capture.mjs +6 -6
  210. package/skills/lit-typographic-motion/engine/cover/render.mjs +20 -7
  211. package/skills/lit-typographic-motion/engine/cover/treatment.mjs +30 -3
  212. package/skills/lit-typographic-motion/engine/fill.mjs +54 -0
  213. package/skills/lit-typographic-motion/engine/gallery.mjs +118 -0
  214. package/skills/lit-typographic-motion/engine/house.mjs +42 -0
  215. package/skills/lit-typographic-motion/engine/look.mjs +65 -8
  216. package/skills/lit-typographic-motion/engine/loudness.mjs +101 -0
  217. package/skills/lit-typographic-motion/engine/scaffold.mjs +219 -0
  218. package/skills/lit-typographic-motion/engine/score.mjs +594 -0
  219. package/skills/lit-typographic-motion/engine/sound.mjs +9 -57
  220. package/skills/lit-typographic-motion/engine/stage/capture.mjs +23 -9
  221. package/skills/lit-typographic-motion/engine/stage/clock.js +8 -2
  222. package/skills/lit-typographic-motion/engine/stage/cover-init.js +12 -1
  223. package/skills/lit-typographic-motion/engine/stage/frame-worker.mjs +15 -7
  224. package/skills/lit-typographic-motion/engine/stage/gate.mjs +48 -4
  225. package/skills/lit-typographic-motion/engine/stage/qa-page.js +16 -5
  226. package/skills/lit-typographic-motion/engine/stage/qa.mjs +148 -7
  227. package/skills/lit-typographic-motion/engine/stage/render.mjs +69 -7
  228. package/skills/lit-typographic-motion/engine/stage/scan.mjs +20 -1
  229. package/skills/lit-typographic-motion/engine/stage/stage-kit.js +85 -4
  230. package/skills/lit-typographic-motion/engine/stills.mjs +1 -1
  231. package/skills/lit-typographic-motion/engine/styles.mjs +221 -0
  232. package/skills/lit-typographic-motion/engine/text.mjs +1 -1
  233. package/skills/lit-typographic-motion/engine/treatment.mjs +190 -6
  234. package/skills/lit-typographic-motion/engine/vendor/three/LICENSE +21 -0
  235. package/skills/lit-typographic-motion/engine/vendor/three/addons/environments/RoomEnvironment.js +144 -0
  236. package/skills/lit-typographic-motion/engine/vendor/three/addons/geometries/RoundedBoxGeometry.js +155 -0
  237. package/skills/lit-typographic-motion/engine/vendor/three/three.module.js +54571 -0
  238. package/skills/lit-typographic-motion/gate.mjs +18 -2
  239. package/skills/lit-typographic-motion/probe.mjs +13 -1
  240. package/skills/lit-typographic-motion/recipes/hero-3d/expected.json +64 -0
  241. package/skills/lit-typographic-motion/recipes/hero-3d/index.html +132 -0
  242. package/skills/lit-typographic-motion/recipes/orbit-loop/expected.json +2 -0
  243. package/skills/lit-typographic-motion/recipes/painted-light/expected.json +2 -0
  244. package/skills/lit-typographic-motion/recipes/weight-tide/expected.json +2 -0
  245. package/skills/lit-typographic-motion/references/cover.md +56 -13
  246. package/skills/lit-typographic-motion/references/craft-loop.md +20 -7
  247. package/skills/lit-typographic-motion/references/depth.md +112 -0
  248. package/skills/lit-typographic-motion/references/runtime.md +21 -6
  249. package/skills/lit-typographic-motion/references/sound.md +76 -0
  250. package/skills/lit-typographic-motion/references/stage.md +50 -7
  251. package/skills/lit-typographic-motion/references/studio.md +162 -0
  252. package/skills/lit-typographic-motion/references/style-bibles.md +18 -0
  253. package/skills/lit-typographic-motion/references/treatment.md +108 -9
  254. package/skills/lit-typographic-motion/render.mjs +60 -3
  255. package/skills/lit-typographic-motion/styles/paper.json +185 -0
  256. package/skills/lit-typographic-motion/styles/swiss-signal.json +188 -0
  257. package/skills/lit-typographic-motion/styles/terminalcore.json +182 -0
  258. package/skills/lit-typographic-motion/styles/tidal.json +187 -0
  259. package/skills/litresearch/SKILL.md +2 -0
  260. package/skills/managed-skill-manifest.json +517 -88
  261. package/skills/readme-studio/SKILL.md +1 -1
  262. package/skills/review-work/SKILL.md +2 -0
  263. package/skills/start-work/SKILL.md +8 -0
  264. package/skills/workflow-loop/SKILL.md +4 -0
  265. package/tools/check-pack-payload.mjs +4 -2
  266. package/tools/payload-substance-parity.json +4 -3
  267. package/tools/qa-cover-recipes.mjs +4 -3
@@ -0,0 +1,111 @@
1
+ # Clean-room build
2
+
3
+ The build separates two roles. The spec writer reads the sources and writes `SPEC.md`. The implementer reads `SPEC.md` and the target, and builds. The spec is the only artifact that crosses from one role to the other. This mirrors the classic two-team method for compatible reimplementation, where one team studied the original and wrote a functional specification and a second team, with zero exposure, built from that specification alone.
4
+
5
+ ## Why the split matters
6
+
7
+ A writer who has just read a source reproduces its phrasing, its examples and its order without noticing. A writer who has seen none of it is spared that. The split does two things: it keeps expression out of the target, and it forces the spec to be complete, because anything missing from the spec reaches the implementer by no route at all.
8
+
9
+ Be honest about its limits. The model that implements may have met the source during training, the person running the port has read it, and a skill-shaped source often states its mechanism in one obvious way. The result is therefore described as *independently re-expressed*, with an exposure note in the report, and the claim of being untouched by the source stays off the page.
10
+
11
+ ## Roles in an OpenCode session
12
+
13
+ | Role | Who | Sees | Writes |
14
+ | --- | --- | --- | --- |
15
+ | Spec writer | the root session that ran capture, distil and gap | sources, ledger, target | `SPEC.md`, the ledger |
16
+ | Planner | `lit-plan` (planning-only agent) | `SPEC.md`, the target | the plan, returned in chat for the root to save |
17
+ | Implementer | a fresh `task` lane on `lit-forge`, in a separate `git worktree` | the brief (spec + target root), the worktree | target files, left uncommitted |
18
+ | Executor discipline | `start-work` | the plan, the ledger of rows | row evidence |
19
+ | Gatekeeper | `hijack.mjs check` | everything | pass or fail |
20
+
21
+ ## Step 1: plan with lit-plan
22
+
23
+ Load `lit-plan` with the native `skill` tool and give it `SPEC.md` as the brief. The `lit-plan` agent is planning-only: edit and bash are denied for it, in yolo mode as much as elsewhere. It returns the plan as text, and the root session (or the operator) writes the plan file. Granting that agent write access to save a step breaks a product rule, so the plan file always comes from the root.
24
+
25
+ Plan rows follow lit-plan's grammar. Under a `## TODOs` heading, each task is a column-zero line:
26
+
27
+ ```text
28
+ - [ ] 1. <title> — Action: <action>; Output: <output>; Verification: <verification>
29
+ ```
30
+
31
+ numbered from 1 without gaps. Under `## Final verification`, each closing check is a column-zero `- [ ] F1. <title> — Verification: <verification>` line, numbered from F1. Rows inside a fenced example are ignored by the parser, so a plan that quotes the grammar in a fence needs real rows outside it.
32
+
33
+ Each task row names the SPEC section it implements (`M1`, `M4`), the target files, the test it adds, and the real-surface check. The build gate requires a plan in this grammar and a citation of every taken mechanism. Plan rows refer to the spec and the target, and the build gate reads the plan file and fails when it names `sources/` or a source URL. Record the path:
34
+
35
+ ```json
36
+ "build": { "plan": "plans/<slug>.md" }
37
+ ```
38
+
39
+ ## Step 2: execute with start-work
40
+
41
+ Run the plan with `/start-work plans/<slug>.md`. For a small port (one or two SPEC sections in one or two files) a short plan in the run folder, in the same row grammar, executed directly by the isolated implementer lane is enough; the report says which path ran. `start-work` keeps its per-row gates: a failing test first, the smallest change that passes, a real-surface check, cleanup. `lit-hijack` adds one constraint: the person or lane that edits target files works from the brief.
42
+
43
+ ## Step 3: brief the implementer
44
+
45
+ ```text
46
+ $H brief <run>
47
+ ```
48
+
49
+ prints a packet that starts with `TASK:` and carries `DELIVERABLE`, `SCOPE` and `VERIFY`, then the full text of `SPEC.md`. It names the target root and the sections to build, and it tells the implementer to stay out of any `.litopencode/hijack/` folder, to leave the original material unsought, and to return a question when a section is ambiguous. It refuses to print while the spec gate fails, so a spec that leaks the sources never reaches an implementer.
50
+
51
+ ### The fence on OpenCode
52
+
53
+ OpenCode's `task` tool starts a subagent in the session's own working directory, and it offers no host-managed worktree for the lane. The skill therefore builds the fence by hand, and it works as a convention for cooperative agents rather than as a sandbox:
54
+
55
+ ```text
56
+ git -C <target> worktree add <dir outside .litopencode/> -b hijack/<slug> <base_ref>
57
+ ```
58
+
59
+ Give the lane the absolute path of `<dir>` as the one place it edits and runs commands. The worktree holds the target's tracked files at the base revision. Your run folder is untracked and ignored, so the captured sources sit outside the checkout. A subagent that has a shell can still read any absolute path, which is why three further fences stay in force: the brief mentions the sources nowhere, the spec gate screens the spec for source text, and the overlap gate screens every changed file. Say this limit in the report's exposure note.
60
+
61
+ When the change spans independent areas, give each area its own worktree, its own lane and its own brief section.
62
+
63
+ ### Bringing the change back
64
+
65
+ The implementer leaves its edits uncommitted. The root then:
66
+
67
+ 1. stages them inside the worktree: `git -C <worktree> add -A` (this changes the index and leaves history alone);
68
+ 2. reviews `git -C <worktree> diff --cached --binary`;
69
+ 3. applies that patch to the target: `git -C <target> apply` with the patch on stdin or in a file under the scratch area;
70
+ 4. removes the lane: `git -C <target> worktree remove --force <dir>` and `git -C <target> branch -D hijack/<slug>`.
71
+
72
+ A commit in the target waits for the user's approval. List every changed file:
73
+
74
+ ```json
75
+ "build": { "plan": "plans/<slug>.md", "changed": ["skills/<id>/SKILL.md", "skills/<id>/scripts/<tool>.mjs", "test/<id>.test.mjs"] }
76
+ ```
77
+
78
+ ## Degraded path
79
+
80
+ When the `task` tool or `git worktree` is unavailable, the separation cannot be enforced. Say so once, then:
81
+
82
+ 1. Close the sources. Work from `SPEC.md`, the mechanism cards' `what` and `why`, and the target.
83
+ 2. Write in the target's order with the target's examples.
84
+ 3. Rely on the overlap gate as the remaining fence, and record `build.separation: "single-context"` in the ledger so the report's exposure note is accurate.
85
+
86
+ ## The overlap gate
87
+
88
+ `hijack.mjs overlap` and the spec and build phases of `check` compare text against every capture of the run, including every text file of a captured repo.
89
+
90
+ - Text is normalised (Unicode compatibility form, lower case) and split into words of letters and digits, so punctuation, Markdown and line breaks cannot hide a copy. Hangul and other scripts work the same way.
91
+ - Every run of `min_words` consecutive words (12 by default, kept in `ledger.min_words`) that also appears in a capture is reported with the file, the line, the length and the source id.
92
+ - Three or more identical headings between a target file and a source produce a warning: matching structure is copying too, even with new sentences.
93
+
94
+ How to respond to a hit:
95
+
96
+ | Hit | Response |
97
+ | --- | --- |
98
+ | A sentence or paragraph from the source | Rewrite from the mechanism card, in the target's order and with the target's example. |
99
+ | A long shared run inside code | Re-implement from the spec; renaming variables over copied logic fixes nothing. |
100
+ | A standard phrase both texts need (a licence name, an API name, a protocol field) | Shorten the run below the threshold, or name it once and refer to it. Record the case in the report. |
101
+ | Headings that match | Restructure around the target's flow. |
102
+
103
+ Lowering `min_words` makes the gate stricter; raising it to silence a hit defeats it. Keep the default unless the report explains why.
104
+
105
+ ## What the gate misses
106
+
107
+ A paraphrase that follows the source sentence by sentence with synonyms passes a word-run check. So does copied logic with renamed identifiers. Two habits close most of that gap: write from the mechanism cards with the sources closed, and let the implementer be someone who opened none of them. For a high-stakes port, add a `lit-oracle` lane that reads the source, the spec and the diff side by side and reports structural echoes the script cannot detect.
108
+
109
+ ## Attribution in the build
110
+
111
+ When any taken mechanism rests on an `ideas-credit` source, the build adds the target's attribution notice. Follow the target's existing pattern first: a target that keeps a provenance record gets a new entry there. Otherwise an `ATTRIBUTION.md` beside `SKILL.md` names, per source: the work, the author, the URL, the licence, what idea was adapted, and a sentence stating the port reused text or code from the source in zero places. Record its path in `ledger.attribution.path`; the report gate checks it names every `ideas-credit` source that fed a taken mechanism. The notice is the one file the overlap gate skips, because it must carry titles and URLs.
@@ -0,0 +1,100 @@
1
+ # Distil and licence
2
+
3
+ Distilling turns sources into mechanism cards: what a technique does, why it works, and how sure anyone can be. The licence gate then decides, per source, what the port may take. Both steps separate the transferable method from the author's expression of it.
4
+
5
+ ## Mechanism, evidence, opinion
6
+
7
+ A source usually mixes three things. Keep them apart on every card.
8
+
9
+ | Part | What it looks like | Where it goes |
10
+ | --- | --- | --- |
11
+ | Mechanism | A step, rule, structure, check or default that produces an effect | `what` and `why` |
12
+ | Evidence | A measurement, a before/after, a reproducible example, a failure story with a cause | `evidence` and `evidence_note` |
13
+ | Opinion | Taste, prediction, preference, a confident claim that lacks support | a card marked `opinion`, or dropped |
14
+
15
+ Evidence classes:
16
+
17
+ - `evidenced`: someone measured it, showed comparable outputs, or you reproduced the mechanism from the description.
18
+ - `anecdotal`: a practitioner reports it worked for them, with enough detail to understand why, and with a measurement missing.
19
+ - `opinion`: a stance or a style choice. Still worth porting when it fits the target, and the report says it was taken on taste.
20
+
21
+ A post that is mostly opinion can still carry one solid mechanism. A post full of numbers can carry nothing you can use. Judge each card on its own.
22
+
23
+ ## Writing a card
24
+
25
+ ```json
26
+ {
27
+ "id": "M1",
28
+ "title": "Production brief before any render",
29
+ "sources": ["S1", "S3"],
30
+ "locator": "S1 section 1; S3 pages 4-6",
31
+ "what": "A short production note fixes the takeaway, the allowed references, the real assets and the rejection condition before the first frame is drawn.",
32
+ "why": "Any decision left open gets filled by the model's default, and those defaults are why unrelated outputs look alike.",
33
+ "evidence": "anecdotal",
34
+ "evidence_note": "Two practitioners report it; neither measured it."
35
+ }
36
+ ```
37
+
38
+ Write `what` as behaviour someone could observe in the target after the port, and `why` as the failure the mechanism prevents. If the only phrasing you can find is the author's sentence, you hold the sentence and the mechanism is still ahead of you; reread the source, close it, and explain it as you would to a colleague.
39
+
40
+ Merge cards that describe one technique from several sources, and name every source on the merged card. Keep a card that only one source has. Split a card that bundles two techniques with different evidence.
41
+
42
+ ## What is worth porting
43
+
44
+ Four questions decide whether a card earns a place in the target:
45
+
46
+ 1. **Is it new?** Run the target's typical task once unaided and see whether the base model already does this. A mechanism the model follows by itself is a zero gain.
47
+ 2. **Is it a mechanism or a mood?** "Make it feel premium" is a mood. "Limit the palette to three tokens declared before the build" is a mechanism.
48
+ 3. **Can the target hold it?** Some techniques need surfaces the target lacks (a renderer, a hook event, a runtime). Note the missing surface and skip the imitation.
49
+ 4. **Can its effect be seen?** If every output would stay the same after the port, the parity step has nothing to prove. Find the marker before you take it.
50
+
51
+ ## Good theft, as a checklist
52
+
53
+ The old distinction between good and bad theft maps onto this skill:
54
+
55
+ | Good | Bad | In a hijack run |
56
+ | --- | --- | --- |
57
+ | Honour the source | Degrade it | Credit in the report; represent the source's claims fairly |
58
+ | Study it | Skim it | Read every captured source in full before writing cards |
59
+ | Steal from many | Steal from one | Merge techniques across sources; compare them |
60
+ | Credit | Plagiarise | Provenance rows, and a shipped credit line where the licence asks |
61
+ | Transform | Imitate | Re-express in the target's idiom, structure and examples |
62
+ | Remix | Rip off | Combine with what the target already does well |
63
+
64
+ ## The licence table
65
+
66
+ Ideas, procedures, methods and facts sit outside copyright in most legal systems, and the expression of them is protected. That split is why every decision below permits mechanisms and every one of them withholds wording. `hijack.mjs licence` applies this table from the captured licence evidence:
67
+
68
+ | Licence evidence | Class | Decision | Reason |
69
+ | --- | --- | --- | --- |
70
+ | MIT, ISC, BSD-2/3-Clause, Apache-2.0, Zlib, BSL-1.0 | permissive | `ideas-credit` | Reuse is allowed; the port takes mechanisms only and ships a credit line |
71
+ | 0BSD, Unlicense, CC0-1.0 | permissive | `ideas-credit` | Conditions are absent; credit is a courtesy the target still pays |
72
+ | CC BY | attribution | `ideas-credit` | The licence asks for credit when material is shared; credit the ideas too |
73
+ | GPL, LGPL, AGPL, MPL, EPL, CC BY-SA | copyleft | `ideas-only` | Copying would pull the target under the source's terms; keep the implementer away from the source |
74
+ | CC BY-NC, CC BY-ND | restricted | `ideas-only` | Commercial use or shared adaptations are barred; mechanisms only |
75
+ | Empty result (`NOASSERTION`) | unlicensed | `ideas-only` | Default copyright applies, all rights reserved; posts, blogs, PDFs and most gists land here |
76
+ | Anything else | unrecognised | `ideas-only` | Treated as all rights reserved until a person says otherwise |
77
+ | Text that states reuse terms | restricted-terms | `needs-review` | "do not copy", "no part of this", "source-available", "proprietary", "confidential" |
78
+
79
+ The reuse-term scan reads rights-related lines (copyright, licence, terms, permission, rights) and skips running prose, so an article that warns readers "DO NOT COPY this config blindly" stays `ideas-only`.
80
+
81
+ `needs-review` blocks the licence phase until a person decides:
82
+
83
+ ```text
84
+ $H licence <run> --set S4=ideas-only --reason "copyright page restricts reproduction; we take the method only"
85
+ $H licence <run> --set S5=no-go --reason "material was shared privately"
86
+ ```
87
+
88
+ A user decision is kept on later `licence` runs. Record the reason in plain words.
89
+
90
+ `no-go` applies whatever the licence says when the capture crossed a login or paywall, when the material is leaked, private or confidential, or when terms forbid the use you intend. A mechanism that rests only on no-go sources stays out; one that also has an allowed source may be taken on that source alone, and its card says so.
91
+
92
+ ## Credit lines
93
+
94
+ For `ideas-credit` sources the target ships a short notice, in the style the target already uses (an `ATTRIBUTION.md` beside a skill is common). Each entry names the work, the author, the URL, the licence, and one sentence on what idea was adapted and that the port reused text or code from the source in zero places. For `ideas-only` sources the report carries the credit, and the target carries it too when the user wants it; ask once.
95
+
96
+ Credit is ethics and courtesy. The legal position of a copy stays as it was, which is why the build avoids copying in the first place.
97
+
98
+ ## Jurisdiction and limits
99
+
100
+ Quotation rules, moral rights and the line between idea and expression differ between countries, and close paraphrase or copied structure can still infringe where the words differ. This procedure lowers risk and certifies nothing. When a source matters commercially and its terms are murky, tell the user once and let them decide. Patents and trademarks sit outside this gate: re-expressing a method leaves a patent on it standing, and a source's product names stay the source's.
@@ -0,0 +1,126 @@
1
+ # Gap analysis and port design
2
+
3
+ The gap analysis decides which mechanisms the target needs; the port design decides what each one becomes inside the target. Both are written against the target as it was at the base revision.
4
+
5
+ ## Read the target first
6
+
7
+ Before judging any gap, read:
8
+
9
+ - the target's `AGENTS.md` and README, for its rules and its voice;
10
+ - every file of the skill or module being changed: the entrypoint, every reference, every script, every asset that carries behaviour;
11
+ - every test that names the target, and the guards that pin its files (payload pins, corpus floors, route tests);
12
+ - for an OpenCode plugin, how a neighbouring skill of similar weight is enrolled, so you know which surfaces a complete port touches.
13
+
14
+ For a new target (`init --new`), read the neighbouring skills of the product it will join, and treat every mechanism as `lacks` with `gap.searched` naming what you compared against.
15
+
16
+ ## Gap fields
17
+
18
+ ```json
19
+ "gap": {
20
+ "status": "weak",
21
+ "refs": ["skills/motion/SKILL.md:120-134", "skills/motion/scripts/render.mjs:88"],
22
+ "note": "The skill asks for a treatment in prose; the render script starts while the treatment is still missing."
23
+ }
24
+ ```
25
+
26
+ - `status` is `has`, `weak` or `lacks`.
27
+ - `refs` are `path:line` or `path:start-end`, relative to the target root. The gate resolves each one at the base revision (`git show <base>:<path>`) and fails when the file or the line is missing, so a gap claim always points at text that existed when you judged it.
28
+ - A `lacks` claim with empty refs needs `searched`: the terms and places you searched ("grep for brief|treatment in skills/motion/ and its tests; the render step has no gate").
29
+ - `note` is one sentence a reviewer can check against the refs.
30
+
31
+ How to judge the status:
32
+
33
+ | Status | The target… |
34
+ | --- | --- |
35
+ | `has` | does it, and something enforces it: a script, a hook, a test, a gate |
36
+ | `weak` | does part of it, does it only sometimes, or states it in prose while nothing enforces it |
37
+ | `lacks` | omits it entirely, in behaviour and in prose |
38
+
39
+ Prose that tells the model to do something, with a mechanism missing behind it, is usually `weak`. In this product family, measured A/B runs found contract prose alone left behaviour unchanged, while mechanical checks moved it. A gap that a gate would close is often the most valuable port.
40
+
41
+ ## Port decisions
42
+
43
+ ```json
44
+ "port": { "decision": "adapt", "reason": "Strengthen the existing treatment step with a render gate." }
45
+ ```
46
+
47
+ - `take`: the target lacks it and should gain it.
48
+ - `adapt`: the target has part of it; strengthen or complete it.
49
+ - `leave`: keep it out, with the reason. Good reasons: the target already has it; the base model already does it unaided; the licence gate forbids it; it conflicts with the target's design; its evidence is too thin for its cost; the target lacks a surface it needs.
50
+
51
+ The gate rejects `take` on a `has` gap (use `adapt` or `leave`) and any taken mechanism whose sources are all `no-go`.
52
+
53
+ ## Re-expressing in the target's idiom
54
+
55
+ A port lands well when a reader of the target cannot tell which parts came from elsewhere, because everything is in the target's own terms. For each taken mechanism decide:
56
+
57
+ | Question | Answer from the target, drawing on the target alone |
58
+ | --- | --- |
59
+ | What is it called? | The target's naming pattern and vocabulary |
60
+ | Where does it live? | The file the target would naturally put it in |
61
+ | What enforces it? | The target's own script, hook, gate or test style |
62
+ | How is it invoked? | The target's routes, commands, flags or events |
63
+ | How is it tested? | The target's test framework and fixtures |
64
+ | How does it ship? | The target's manifest, payload pins and package rules |
65
+ | How do users learn of it? | The target's help, listing, README and docs |
66
+
67
+ Map the source's idea onto the target's surfaces and leave the source's surfaces behind. When a source describes a folder layout or a file format, design the target's own, shaped by the target's existing conventions.
68
+
69
+ ## Enrollment surfaces for an OpenCode plugin target
70
+
71
+ A capability in an OpenCode plugin is reachable through the surfaces the host and the plugin read. When the target is a plugin skill, list every surface the port touches:
72
+
73
+ - the skill entrypoint (`skills/<id>/SKILL.md`) and its references, scripts and assets;
74
+ - the plugin's skill and feature catalogs, the managed-skill asset list and manifest, and any payload pins the plugin keeps;
75
+ - the command registry entry, when the capability has a slash command;
76
+ - the `chat.message` route and its mode contract, when it has a natural-language route;
77
+ - agents, settings defaults and tool registrations, when the capability uses them;
78
+ - user-facing listings: README skill tables, guides, help and doctor output;
79
+ - the package's file list and pack guard, so the installed copy carries the new files;
80
+ - tests that fail when any of the above loses the capability (an orphan test).
81
+
82
+ For other systems, find the equivalent list first: the registry, the router, the config, the installer, the docs and the tests. A port that skips one of them is a ghost: the file exists and the surface cannot reach it.
83
+
84
+ Each product in a family is its own target. A port into one product copies zero files into a sibling and adds zero dependencies between them; when the user wants the same capability elsewhere, each sibling gets its own run and its own re-expression.
85
+
86
+ ## SPEC.md template
87
+
88
+ ```markdown
89
+ # <target>: <one-line purpose of this port>
90
+
91
+ Target root: <path> · base revision: <rev>
92
+ Taken: M1, M4 · left: M2, M3, M5 (see the run report)
93
+
94
+ ## M1 <title in the target's words>
95
+
96
+ Behaviour: <what the target will do afterwards, observable>
97
+ Lives in: <files and surfaces in the target>
98
+ Enforced by: <script, hook, gate or test>
99
+ Acceptance:
100
+ - <check 1, runnable>
101
+ - <check 2, runnable>
102
+ Parity: <criterion> · marker: <text the new behaviour leaves in its output>
103
+ Enrollment: <catalog, route, docs, pins, tests this section touches>
104
+ Out of scope: <what this section leaves alone>
105
+
106
+ ## M4 <title>
107
+ …
108
+ ```
109
+
110
+ Write the spec from the mechanism cards and the target, with the sources closed. Use the target's examples and the target's order. The spec gate rejects a section-less mechanism, a path into `sources/`, a source URL, and any run of 12 or more words shared with a capture; it warns when three or more headings match a source's headings, because copied structure is still copying.
111
+
112
+ ## Fields the parity step needs from the spec
113
+
114
+ Fill these while writing the spec, so the proof is designed before the build:
115
+
116
+ ```json
117
+ "parity": {
118
+ "criterion": "A brief from the skill names the takeaway and the rejection condition.",
119
+ "red": "Old skill: brief has neither field.",
120
+ "green": "New skill: brief has both fields in every run.",
121
+ "surface": "opencode run in a throwaway workspace, old and new skill loaded the same way",
122
+ "artifact": "parity/contact-sheet.png"
123
+ }
124
+ ```
125
+
126
+ and on the ledger, `parity.markers`: short strings the new behaviour leaves in its output and the old behaviour leaves out. Pick markers that only the mechanism produces (a field name, a gate's refusal line, a file the new step writes), so a marker in a baseline output means contamination.
@@ -0,0 +1,110 @@
1
+ # Parity proof and report
2
+
3
+ A port is proven by two observations: the capability fires on the surface a user touches, and the new target behaves differently from the old one on the same prompt. Green tests and new files are necessary and fall short of proof. Ports in this product family have passed every gate while sitting unreachable, and A/B runs have measured an empty difference because the baseline could read the treatment; this step exists to catch both.
4
+
5
+ ## 1. Reachability
6
+
7
+ Drive the real entry point, read what comes back, then break the wiring and watch the probe fail.
8
+
9
+ | Target surface | Probe | Break it by |
10
+ | --- | --- | --- |
11
+ | Chat route | Run the `chat.message` hook (or an isolated `opencode run` with a fake provider) on a prompt that should route, and assert the skill pointer appears in the captured request | Removing the route entry |
12
+ | Slash command | Run the command hook and read the injected prompt, or run the host and read the transcript | Deleting the command row |
13
+ | Skill discovery | An `opencode run` prompt that should load the skill, with the transcript showing the `skill` tool call | Changing the description |
14
+ | Script or gate | Run the installed copy's script on a fixture that should fail and one that should pass | Reverting the gate |
15
+ | Package payload | Pack the package and list the files (read the JSON listing, since the human listing wraps long paths) | Removing the file from the allowlist |
16
+
17
+ A probe that cannot fail proves little; record the broken run beside the passing one.
18
+
19
+ ## 2. An isolated baseline
20
+
21
+ The baseline is the target at the base revision, in a place where the new work cannot be read:
22
+
23
+ ```text
24
+ git -C <target root> worktree add <lane folder>/parity-base <base_ref>
25
+ ```
26
+
27
+ or the snapshot copied in Phase 0. Check the isolation before running anything: the baseline folder holds none of the new files, `git log` inside it stops at the base revision, and the run folder, the spec and the diff sit outside any path the baseline session can reach. When the target lives in a repo the baseline session could explore, run the baseline from a copy outside that repo.
28
+
29
+ ## 3. Running both arms
30
+
31
+ Choose prompts the spec never used as examples: a held-out prompt shows the behaviour generalises, while a prompt copied from the spec shows that the spec was followed.
32
+
33
+ For an OpenCode skill target, run each arm as a real session in its own throwaway workspace. The installed LitOpenCode is switched off for both arms by pointing the profile at a scratch directory, so it cannot add routes, agents or hooks to either side:
34
+
35
+ ```text
36
+ mkdir -p <scratch>/{home,xdg/config,xdg/data,tmp}
37
+ cd <arm workspace> # holds .opencode/skills/<id>/ with this arm's copy of the target
38
+ env -i PATH="$PATH" HOME=<scratch>/home XDG_CONFIG_HOME=<scratch>/xdg/config XDG_DATA_HOME=<scratch>/xdg/data TMPDIR=<scratch>/tmp OPENCODE_DISABLE_AUTOUPDATE=1 \
39
+ opencode run --pure --model <provider/model> "<held-out prompt>"
40
+ ```
41
+
42
+ - Load both arms the same way (a project skill folder in each workspace), so the only difference is the port.
43
+ - Use a fresh scratch profile per run. Provider credentials then have to be supplied on purpose, which is why the run waits for the user's approval: it spends the user's model quota.
44
+ - Point the workspace at a copy you control, and leave the installed plugin root of the host alone.
45
+ - Keep the runs cheap: a small prompt, one model, a few turns.
46
+ - Run each arm at least twice when its output varies. One sample can mislead.
47
+
48
+ For a code target, run the target's tests and its real command on both revisions, and save the outputs.
49
+
50
+ Save every output under `parity/` (`baseline-1.md`, `treatment-1.md`, …) and list them:
51
+
52
+ ```json
53
+ "parity": {
54
+ "baseline_outputs": ["parity/baseline-1.md", "parity/baseline-2.md"],
55
+ "treatment_outputs": ["parity/treatment-1.md", "parity/treatment-2.md"],
56
+ "markers": ["Rejection condition"]
57
+ }
58
+ ```
59
+
60
+ The parity gate then requires every marker in every treatment output and in every baseline output absent. A marker missing from a treatment output means the port changed behaviour unreliably. A marker in a baseline output means the baseline saw the new work, or the target already had the behaviour and the gap was imaginary. Either way the proof is void until fixed. Before trusting a tie or a surprising win, grep the baseline transcript for the treatment's distinctive identifiers (file names, section names, the skill's own terms); any hit voids the comparison.
61
+
62
+ ## 4. Visual outputs
63
+
64
+ When the target makes images, films, slides, documents or pages, the user judges them by eye. Render the baseline and treatment outputs side by side on one contact sheet (rows for arms, columns for runs), save it under `parity/`, and show it. Machine checks such as overlap or layout scores are geometry checks; call them that. Headless browsers used for renders take `--use-mock-keychain --password-store=basic` so a keychain dialog never interrupts the user.
65
+
66
+ The sample output is evidence that the port works. Polishing that one sample is a different task; offer it when the user asks.
67
+
68
+ ## 5. The report
69
+
70
+ `REPORT.md` lives in the run folder. The gate requires the three headings, every mechanism id, every source's URL or path, and a credit notice for every `ideas-credit` source that fed a taken mechanism.
71
+
72
+ ```markdown
73
+ # Port report: <title>
74
+
75
+ Target: <root> at <base revision> → <new revision or working tree>
76
+ Run: .litopencode/hijack/<slug>/ · gate: check --phase report PASS
77
+
78
+ ## Taken
79
+ - M1 <title>: <where it lives now> · parity: marker in 2/2 treatment runs, 0/2 baseline runs
80
+ - M4 <title>: …
81
+
82
+ ## Left
83
+ - M2 <title>: the target already enforces it (<path:line>)
84
+ - M3 <title>: opinion with zero gain over the base model in a probe run
85
+ - M5 <title>: rests only on S5, which is no-go
86
+
87
+ ## Provenance
88
+ | Id | Source | Author | Published | Retrieved | Licence | Decision |
89
+ | --- | --- | --- | --- | --- | --- | --- |
90
+ | S1 | https://… | … | … | … | NOASSERTION | ideas-only |
91
+
92
+ ## Exposure
93
+ The spec writer read every source. The implementer worked from SPEC.md in a separate git worktree
94
+ (a convention for cooperative agents, since the task tool offers no host isolation), or in the
95
+ same context on the degraded path. The model may have met these sources before. The overlap gate
96
+ found no run of 12 or more words shared with any capture; headings were checked for structural echoes.
97
+
98
+ ## Credit
99
+ <attribution notice path, or "credit lives in this report">
100
+
101
+ ## Review by
102
+ <date, and what would make this port stale: a model change, a target redesign, a new source>
103
+ ```
104
+
105
+ ## 6. Closing the run
106
+
107
+ 1. `hijack.mjs check <run> --phase report` passes.
108
+ 2. The reply to the user says what was taken and left, the parity result in a sentence, the contact sheet when there is one, and the report path.
109
+ 3. Offer `review-work` for a work review of the diff; its provenance lane reads the run folder.
110
+ 4. The run folder stays local and out of commits. Commits, pushes and releases wait for the user.