@litfamily/lithermes 1.0.28 → 1.0.30

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 (167) hide show
  1. package/README.md +12 -9
  2. package/README_Ko-KR.md +12 -9
  3. package/assets/lithermes-plugin/README.md +15 -2
  4. package/assets/lithermes-plugin/__init__.py +49 -10
  5. package/assets/lithermes-plugin/adhd_stack.py +228 -0
  6. package/assets/lithermes-plugin/core.py +30 -4
  7. package/assets/lithermes-plugin/core_commands.py +99 -0
  8. package/assets/lithermes-plugin/core_contexts.py +54 -4
  9. package/assets/lithermes-plugin/core_contract.py +2 -2
  10. package/assets/lithermes-plugin/core_routing.py +126 -0
  11. package/assets/lithermes-plugin/diagnostics.py +3 -2
  12. package/assets/lithermes-plugin/lit_mark.py +75 -0
  13. package/assets/lithermes-plugin/payload-version.json +472 -60
  14. package/assets/lithermes-plugin/plugin.yaml +1 -1
  15. package/assets/lithermes-plugin/scientific_visualization.py +23 -0
  16. package/assets/lithermes-plugin/skills/frontend-ui-ux/SKILL.md +7 -7
  17. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/components.css +414 -0
  18. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/fonts.json +42 -0
  19. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/layouts/landing.html +164 -0
  20. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/layouts/settings.html +114 -0
  21. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/layouts/workspace.html +115 -0
  22. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/computational-brutalism.json +227 -0
  23. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/field-notes.json +205 -0
  24. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/graphite.json +200 -0
  25. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/meadow.json +199 -0
  26. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/neo-brutalism.json +222 -0
  27. package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/ui.js +226 -0
  28. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/README.md +2 -4
  29. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +4 -4
  30. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/craft-floor.md +10 -0
  31. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design-lock.mjs +400 -0
  32. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe-rules.json +6 -1
  33. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe.mjs +76 -4
  34. package/assets/lithermes-plugin/skills/lit-adhd/SKILL.md +194 -0
  35. package/assets/lithermes-plugin/skills/lit-adhd/references/brief-contract.md +55 -0
  36. package/assets/lithermes-plugin/skills/lit-adhd/references/card-examples.md +86 -0
  37. package/assets/lithermes-plugin/skills/lit-adhd/references/status-taxonomy.md +40 -0
  38. package/assets/lithermes-plugin/skills/lit-adhd/scripts/adhd.mjs +11 -0
  39. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/collect.mjs +554 -0
  40. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/gauge.mjs +89 -0
  41. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/hermes-sessions.mjs +219 -0
  42. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/next-step.mjs +101 -0
  43. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/plan-task-rows.mjs +32 -0
  44. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/redact.mjs +42 -0
  45. package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/secret-shapes.mjs +59 -0
  46. package/assets/lithermes-plugin/skills/lit-diagram-drawer/SKILL.md +7 -4
  47. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/style-guide.md +20 -11
  48. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-architecture.md +3 -3
  49. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dependency.md +1 -1
  50. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-tree.md +3 -3
  51. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-wardley.md +1 -1
  52. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/verifier-guide.md +5 -0
  53. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_quality.py +4 -4
  54. package/assets/lithermes-plugin/skills/lit-docx/SKILL.md +1 -1
  55. package/assets/lithermes-plugin/skills/lit-hijack/SKILL.md +239 -0
  56. package/assets/lithermes-plugin/skills/lit-hijack/references/capture-and-provenance.md +123 -0
  57. package/assets/lithermes-plugin/skills/lit-hijack/references/clean-room-build.md +128 -0
  58. package/assets/lithermes-plugin/skills/lit-hijack/references/distil-and-licence.md +128 -0
  59. package/assets/lithermes-plugin/skills/lit-hijack/references/gap-and-port-design.md +152 -0
  60. package/assets/lithermes-plugin/skills/lit-hijack/references/parity-and-report.md +131 -0
  61. package/assets/lithermes-plugin/skills/lit-hijack/scripts/hijack.mjs +995 -0
  62. package/assets/lithermes-plugin/skills/lit-plan/SKILL.md +1 -0
  63. package/assets/lithermes-plugin/skills/lit-pptx/SKILL.md +11 -6
  64. package/assets/lithermes-plugin/skills/lit-pptx/fonts/jetbrains-mono/JetBrainsMono-Bold.ttf +0 -0
  65. package/assets/lithermes-plugin/skills/lit-pptx/fonts/jetbrains-mono/JetBrainsMono-Regular.ttf +0 -0
  66. package/assets/lithermes-plugin/skills/lit-pptx/fonts/jetbrains-mono/OFL.txt +93 -0
  67. package/assets/lithermes-plugin/skills/lit-pptx/fonts/provenance.json +1 -0
  68. package/assets/lithermes-plugin/skills/lit-pptx/references/anti-slop-checklist.md +3 -0
  69. package/assets/lithermes-plugin/skills/lit-pptx/references/authoring-guide.md +1 -1
  70. package/assets/lithermes-plugin/skills/lit-pptx/references/consensus-protocol.md +1 -1
  71. package/assets/lithermes-plugin/skills/lit-pptx/references/direction-step.md +8 -2
  72. package/assets/lithermes-plugin/skills/lit-pptx/references/examples/13-engineering-review-computational-brutalism-ko.md +175 -0
  73. package/assets/lithermes-plugin/skills/lit-pptx/references/examples/14-launch-pitch-neo-brutalism-ko.md +156 -0
  74. package/assets/lithermes-plugin/skills/lit-pptx/references/examples/15-design-lecture-bauhaus-ko.md +141 -0
  75. package/assets/lithermes-plugin/skills/lit-pptx/references/examples/16-community-programme-riso-ko.md +160 -0
  76. package/assets/lithermes-plugin/skills/lit-pptx/references/examples/17-public-data-briefing-newsroom-ko.md +183 -0
  77. package/assets/lithermes-plugin/skills/lit-pptx/references/layout-families.md +1 -1
  78. package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/bauhaus.md +105 -0
  79. package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/computational-brutalism.md +111 -0
  80. package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/neo-brutalism.md +114 -0
  81. package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/newsroom.md +106 -0
  82. package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/riso.md +101 -0
  83. package/assets/lithermes-plugin/skills/lit-pptx/scripts/craft_extras.py +49 -0
  84. package/assets/lithermes-plugin/skills/lit-pptx/scripts/deck_output.py +4 -2
  85. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/render-pack.js +96 -10
  86. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/template-registry.js +50 -6
  87. package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/bauhaus/pack.yaml +103 -0
  88. package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/computational-brutalism/pack.yaml +99 -0
  89. package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/neo-brutalism/pack.yaml +107 -0
  90. package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/newsroom/pack.yaml +99 -0
  91. package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/riso/pack.yaml +99 -0
  92. package/assets/lithermes-plugin/skills/lit-recap/SKILL.md +1 -1
  93. package/assets/lithermes-plugin/skills/lit-schematic/SKILL.md +144 -0
  94. package/assets/lithermes-plugin/skills/lit-schematic/examples/iso-heat-exchanger/build.mjs +38 -0
  95. package/assets/lithermes-plugin/skills/lit-schematic/examples/iso-heat-exchanger/scene.mjs +133 -0
  96. package/assets/lithermes-plugin/skills/lit-schematic/examples/journal-adsorption-rig/build.mjs +87 -0
  97. package/assets/lithermes-plugin/skills/lit-schematic/examples/pid-dosing-skid/build.mjs +85 -0
  98. package/assets/lithermes-plugin/skills/lit-schematic/references/cutaway-outputs.md +70 -0
  99. package/assets/lithermes-plugin/skills/lit-schematic/references/isometric-craft.md +101 -0
  100. package/assets/lithermes-plugin/skills/lit-schematic/references/journal-figures.md +72 -0
  101. package/assets/lithermes-plugin/skills/lit-schematic/references/kit-api.md +134 -0
  102. package/assets/lithermes-plugin/skills/lit-schematic/references/pfd-and-layout.md +53 -0
  103. package/assets/lithermes-plugin/skills/lit-schematic/references/pid-drafting.md +103 -0
  104. package/assets/lithermes-plugin/skills/lit-schematic/references/pid-symbols.md +163 -0
  105. package/assets/lithermes-plugin/skills/lit-schematic/references/verification.md +100 -0
  106. package/assets/lithermes-plugin/skills/lit-schematic/scripts/doctor.mjs +57 -0
  107. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/figure.mjs +81 -0
  108. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/fonts.mjs +27 -0
  109. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/geom.mjs +113 -0
  110. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/interactive.mjs +292 -0
  111. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/isa.mjs +115 -0
  112. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/iso.mjs +719 -0
  113. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/legend-sheet.mjs +162 -0
  114. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/pid.mjs +937 -0
  115. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/png.mjs +132 -0
  116. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/qa-core.mjs +658 -0
  117. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/route.mjs +218 -0
  118. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/sheet.mjs +890 -0
  119. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/svg.mjs +82 -0
  120. package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/theme.mjs +115 -0
  121. package/assets/lithermes-plugin/skills/lit-schematic/scripts/motion.mjs +129 -0
  122. package/assets/lithermes-plugin/skills/lit-schematic/scripts/qa.mjs +92 -0
  123. package/assets/lithermes-plugin/skills/lit-schematic/scripts/render.mjs +233 -0
  124. package/assets/lithermes-plugin/skills/lit-schematic/scripts/scaffold.mjs +60 -0
  125. package/assets/lithermes-plugin/skills/lit-scientific-visualization/SKILL.md +19 -1
  126. package/assets/lithermes-plugin/skills/lit-typographic-motion/SKILL.md +12 -11
  127. package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/motion.mjs +56 -2
  128. package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/runtime.mjs +129 -4
  129. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/THIRD_PARTY_NOTICES +9 -0
  130. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/blender/runner.py +218 -0
  131. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/blender.mjs +154 -0
  132. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/board.mjs +132 -0
  133. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/completion.mjs +48 -5
  134. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/gate.mjs +13 -0
  135. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/house.mjs +44 -0
  136. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/scaffold.mjs +238 -0
  137. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/score.mjs +643 -0
  138. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/sound-dsp.mjs +21 -0
  139. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/sound.mjs +171 -0
  140. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-qa.mjs +23 -3
  141. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage.mjs +124 -17
  142. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/styles.mjs +240 -0
  143. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/treatment.mjs +152 -10
  144. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/LICENSE +21 -0
  145. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/addons/environments/RoomEnvironment.js +144 -0
  146. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/addons/geometries/RoundedBoxGeometry.js +155 -0
  147. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/three.module.js +54571 -0
  148. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/hero-3d/expected.json +67 -0
  149. package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/hero-3d/index.html +139 -0
  150. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/depth.md +74 -0
  151. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/studio.md +87 -0
  152. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/style-bibles.md +9 -2
  153. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/treatment.md +24 -8
  154. package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/paper.json +41 -0
  155. package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/swiss-signal.json +41 -0
  156. package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/terminalcore.json +42 -0
  157. package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/tidal.json +41 -0
  158. package/assets/lithermes-plugin/skills/litresearch/SKILL.md +4 -0
  159. package/assets/lithermes-plugin/skills/readme-studio/SKILL.md +1 -1
  160. package/assets/lithermes-plugin/skills/readme-studio/templates/hyperframes/package-lock.json +3 -3
  161. package/assets/lithermes-plugin/skills/readme-studio/templates/remotion/package-lock.json +3 -3
  162. package/assets/lithermes-plugin/skills/review-work/SKILL.md +2 -0
  163. package/assets/lithermes-plugin/skills/start-work/SKILL.md +2 -1
  164. package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +3 -3
  165. package/package.json +1 -1
  166. package/readme-assets/badge-version.svg +1 -1
  167. package/src/lib/skillPayload.js +1 -1
@@ -0,0 +1,128 @@
1
+ # Distil and licence
2
+
3
+ Distilling turns sources into mechanism cards: what a technique does, why it works, and how sure
4
+ anyone can be. The licence gate then decides, per source, what the port may take. Both steps are
5
+ about separating the transferable method from the author's expression of it.
6
+
7
+ ## Mechanism, evidence, opinion
8
+
9
+ A source usually mixes three things. Keep them apart on every card.
10
+
11
+ | Part | What it looks like | Where it goes |
12
+ | --- | --- | --- |
13
+ | Mechanism | A step, rule, structure, check or default that produces an effect | `what` and `why` |
14
+ | Evidence | A measurement, a before/after, a reproducible example, a failure story with a cause | `evidence` and `evidence_note` |
15
+ | Opinion | Taste, prediction, preference, a confident claim without support | a card marked `opinion`, or nowhere |
16
+
17
+ Evidence classes:
18
+
19
+ - `evidenced`: someone measured it, showed comparable outputs, or the mechanism can be reproduced
20
+ from the description and you reproduced it.
21
+ - `anecdotal`: a practitioner reports it worked for them, with enough detail to understand why, and
22
+ without a measurement.
23
+ - `opinion`: a stance or a style choice. Still worth porting when it fits the target, and the report
24
+ says it was taken on taste.
25
+
26
+ A post that is mostly opinion can still carry one solid mechanism. A post full of numbers can carry
27
+ none you can use. Judge each card on its own.
28
+
29
+ ## Writing a card
30
+
31
+ ```json
32
+ {
33
+ "id": "M1",
34
+ "title": "Production brief before any render",
35
+ "sources": ["S1", "S3"],
36
+ "locator": "S1 section 1; S3 pages 4-6",
37
+ "what": "A short production note fixes the takeaway, the allowed references, the real assets and the rejection condition before the first frame is drawn.",
38
+ "why": "Any decision left open gets filled by the model's default, and those defaults are why unrelated outputs look alike.",
39
+ "evidence": "anecdotal",
40
+ "evidence_note": "Two practitioners report it; neither measured it."
41
+ }
42
+ ```
43
+
44
+ Write `what` as behaviour someone could observe in the target after the port, and `why` as the
45
+ failure the mechanism prevents. If the only way you can phrase a card is the author's sentence, you
46
+ have the sentence and not yet the mechanism; reread the source, close it, and explain it as you would
47
+ to a colleague.
48
+
49
+ Merge cards that describe one technique from several sources, and name every source on the merged
50
+ card. Keep a card that only one source has. Split a card that bundles two techniques with different
51
+ evidence.
52
+
53
+ ## What is worth porting
54
+
55
+ Four questions decide whether a card can earn a place in the target:
56
+
57
+ 1. **Is it new?** Run the target's typical task once without help and see whether the base model
58
+ already does this. A mechanism the model follows unaided is no gain.
59
+ 2. **Is it a mechanism or a mood?** "Make it feel premium" is a mood. "Limit the palette to three
60
+ tokens declared before the build" is a mechanism.
61
+ 3. **Can the target hold it?** Some techniques need surfaces the target lacks (a renderer, a hook
62
+ event, a runtime). Note the missing surface rather than faking it.
63
+ 4. **Can its effect be seen?** If no output would differ after the port, the parity step cannot prove
64
+ it. Find the marker before you take it.
65
+
66
+ ## Good theft, as a checklist
67
+
68
+ The old artist's distinction between good and bad theft maps cleanly onto this skill:
69
+
70
+ | Good | Bad | In a hijack run |
71
+ | --- | --- | --- |
72
+ | Honour the source | Degrade it | Credit in the report; represent the source's claims fairly |
73
+ | Study it | Skim it | Read every captured source in full before writing cards |
74
+ | Steal from many | Steal from one | Merge techniques across sources; compare them |
75
+ | Credit | Plagiarise | Provenance rows, and a shipped credit line where the licence asks |
76
+ | Transform | Imitate | Re-express in the target's idiom, structure and examples |
77
+ | Remix | Rip off | Combine with what the target already does well |
78
+
79
+ ## The licence table
80
+
81
+ Ideas, procedures, methods and facts are outside copyright in most legal systems; the expression of
82
+ them is protected. That split is why every decision below permits mechanisms and none permits
83
+ wording. `hijack.mjs licence` applies this table from the captured licence evidence:
84
+
85
+ | Licence evidence | Class | Decision | Reason |
86
+ | --- | --- | --- | --- |
87
+ | 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 |
88
+ | 0BSD, Unlicense, CC0-1.0 | permissive | `ideas-credit` | No conditions; credit is a courtesy the target still pays |
89
+ | CC BY | attribution | `ideas-credit` | The licence asks for credit when material is shared; credit the ideas too |
90
+ | 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 |
91
+ | CC BY-NC, CC BY-ND | restricted | `ideas-only` | Commercial use or shared adaptations are barred; mechanisms only |
92
+ | None found (`NOASSERTION`) | unlicensed | `ideas-only` | Default copyright: all rights reserved; posts, blogs, PDFs and most gists land here |
93
+ | Anything else | unrecognised | `ideas-only` | Treated as all rights reserved until a person says otherwise |
94
+ | Text that states reuse terms | restricted-terms | `needs-review` | "do not copy", "no part of this", "source-available", "proprietary", "confidential" |
95
+
96
+ `needs-review` blocks the licence phase until a person decides:
97
+
98
+ ```text
99
+ $H licence <run> --set S4=ideas-only --reason "copyright page restricts reproduction; we take the method only"
100
+ $H licence <run> --set S5=no-go --reason "material was shared privately"
101
+ ```
102
+
103
+ A user decision is kept on later `licence` runs. Record the reason in plain words.
104
+
105
+ `no-go` applies whatever the licence says when the capture crossed a login or paywall, when the
106
+ material is leaked, private or confidential, or when terms forbid the use you intend. A mechanism
107
+ that rests only on no-go sources stays out; one that also has an allowed source may be taken on that
108
+ source alone, and its card says so.
109
+
110
+ ## Credit lines
111
+
112
+ For `ideas-credit` sources the target ships a short notice, in the style the target already uses
113
+ (an `ATTRIBUTION.md` beside a skill is common). Each entry names the work, the author, the URL, the
114
+ licence, and one sentence on what idea was adapted and that no text or code was reused. For
115
+ `ideas-only` sources the report carries the credit, and the target carries it too when the user
116
+ wants it; ask once.
117
+
118
+ Credit is ethics and courtesy. It leaves the legal position of a copy unchanged, which is why the
119
+ build never copies in the first place.
120
+
121
+ ## Jurisdiction and limits
122
+
123
+ Quotation rules, moral rights and the line between idea and expression differ between countries,
124
+ and close paraphrase or copied structure can still infringe where words differ. This procedure
125
+ lowers risk; it does not certify anything. When a source matters commercially and its terms are
126
+ unclear, tell the user once and let them decide. Patents and trademarks sit outside this gate:
127
+ re-expressing a method leaves a patent on it untouched, and a source's product names are not yours
128
+ to reuse.
@@ -0,0 +1,152 @@
1
+ # Gap analysis and port design
2
+
3
+ The gap analysis decides which mechanisms the target needs; the port design decides what each one
4
+ becomes inside the target. Both are written against the target as it was at the base revision.
5
+
6
+ ## Read the target first
7
+
8
+ Before judging any gap, read:
9
+
10
+ - the target's `AGENTS.md`, `CLAUDE.md` and README, for its rules and its voice;
11
+ - every file of the skill or module being changed: the entrypoint, every reference, every script,
12
+ every asset that carries behaviour;
13
+ - every test that names the target, and the guards that pin its files (payload pins, corpus floors,
14
+ route tests);
15
+ - for a plugin, how a neighbouring skill of similar weight is enrolled, so you know which surfaces a
16
+ complete port must touch.
17
+
18
+ For a new target (`init --new`), read the neighbouring skills of the product it will join instead,
19
+ and treat every mechanism as `lacks` with `gap.searched` naming what you compared against.
20
+
21
+ ## Gap fields
22
+
23
+ ```json
24
+ "gap": {
25
+ "status": "weak",
26
+ "refs": ["skills/motion/SKILL.md:120-134", "skills/motion/scripts/render.mjs:88"],
27
+ "note": "The skill asks for a treatment in prose; the render script starts without one."
28
+ }
29
+ ```
30
+
31
+ - `status` is `has`, `weak` or `lacks`.
32
+ - `refs` are `path:line` or `path:start-end`, relative to the target root. The gate resolves each
33
+ one at the base revision (`git show <base>:<path>`) and fails when the file or the line is
34
+ missing, so a gap claim always points at text that existed when you judged it.
35
+ - A `lacks` claim with empty refs needs `searched`: the terms and places you searched
36
+ ("grep for brief|treatment in skills/motion/ and its tests; no gate before render").
37
+ - `note` is one sentence a reviewer can check against the refs.
38
+
39
+ How to judge the status:
40
+
41
+ | Status | The target… |
42
+ | --- | --- |
43
+ | `has` | does it, and something enforces it: a script, a hook, a test, a gate |
44
+ | `weak` | does part of it, does it only sometimes, or states it in prose with nothing enforcing it |
45
+ | `lacks` | neither does nor states it |
46
+
47
+ Prose that tells the model to do something, with no mechanism behind it, is usually `weak`. In this
48
+ product, measured A/B runs found contract prose alone left behaviour unchanged, while mechanical
49
+ checks moved it. A gap that a gate would close is often the most valuable port.
50
+
51
+ ## Port decisions
52
+
53
+ ```json
54
+ "port": { "decision": "adapt", "reason": "Strengthen the existing treatment step with a render gate." }
55
+ ```
56
+
57
+ - `take`: the target lacks it and should gain it.
58
+ - `adapt`: the target has part of it; strengthen or complete it.
59
+ - `leave`: keep it out, with the reason. Good reasons: the target already has it; the base model
60
+ already does it unaided; the licence gate forbids it; it conflicts with the target's design; its
61
+ evidence is too thin for its cost; the target lacks a surface it needs.
62
+
63
+ The gate rejects `take` on a `has` gap (use `adapt` or `leave`) and any taken mechanism whose only
64
+ sources are `no-go`.
65
+
66
+ ## Re-expressing in the target's idiom
67
+
68
+ A port lands well when a reader of the target cannot tell which parts came from elsewhere, because
69
+ everything is in the target's own terms. For each taken mechanism decide:
70
+
71
+ | Question | Answer from the target, not the source |
72
+ | --- | --- |
73
+ | What is it called? | The target's naming pattern and vocabulary |
74
+ | Where does it live? | The file the target would naturally put it in |
75
+ | What enforces it? | The target's own script, hook, gate or test style |
76
+ | How is it invoked? | The target's routes, commands, flags or events |
77
+ | How is it tested? | The target's test framework and fixtures |
78
+ | How does it ship? | The target's manifest, payload pins and package rules |
79
+ | How do users learn of it? | The target's help, listing, README and docs |
80
+
81
+ Map the source's idea onto the target's surfaces; never carry the source's surfaces across. When a
82
+ source describes a folder layout or a file format, design the target's own, shaped by the target's
83
+ existing conventions.
84
+
85
+ ## Enrollment surfaces for a Hermes plugin target
86
+
87
+ A capability in a Hermes plugin is reachable only through the surfaces the host and the plugin
88
+ read. When the target is a plugin skill, list every surface the port touches:
89
+
90
+ - the skill entrypoint (`skills/<id>/SKILL.md`) and its references, scripts and assets;
91
+ - the plugin's skill catalog and any resource or payload pins the plugin keeps;
92
+ - the slash command file, when the capability has a command;
93
+ - the prompt hook's routes and mode contract, when it has a natural-language route;
94
+ - agents, settings defaults and MCP or LSP config, when the capability uses them;
95
+ - user-facing listings: README skill tables, guides, help or doctor output;
96
+ - the package's file list and pack guard, so the installed copy carries the new files;
97
+ - tests that fail when any of the above loses the capability (an orphan test).
98
+
99
+ For other systems, find the equivalent list first: the registry, the router, the config, the
100
+ installer, the docs and the tests. A port that skips one of them is a ghost: the file exists and
101
+ nothing reaches it.
102
+
103
+ Each product in a family is its own target. A port into one product never copies files into a
104
+ sibling and never adds a dependency between them; when the user wants the same capability elsewhere,
105
+ each sibling gets its own run and its own re-expression.
106
+
107
+ ## SPEC.md template
108
+
109
+ ```markdown
110
+ # <target>: <one-line purpose of this port>
111
+
112
+ Target root: <path> · base revision: <rev>
113
+ Taken: M1, M4 · left: M2, M3, M5 (see the run report)
114
+
115
+ ## M1 <title in the target's words>
116
+
117
+ Behaviour: <what the target will do afterwards, observable>
118
+ Lives in: <files and surfaces in the target>
119
+ Enforced by: <script, hook, gate or test>
120
+ Acceptance:
121
+ - <check 1, runnable>
122
+ - <check 2, runnable>
123
+ Parity: <criterion> · marker: <text the new behaviour leaves in its output>
124
+ Enrollment: <catalog, route, docs, pins, tests this section touches>
125
+ Out of scope: <what this section leaves alone>
126
+
127
+ ## M4 <title>
128
+ …
129
+ ```
130
+
131
+ Write the spec from the mechanism cards and the target, with the sources closed. Use the target's
132
+ examples and the target's order. The spec gate rejects a section-less mechanism, a path into
133
+ `sources/`, a source URL, and any run of 12 or more words shared with a capture; it warns when three
134
+ or more headings match a source's headings, because copied structure is still copying.
135
+
136
+ ## Fields the parity step needs from the spec
137
+
138
+ Fill these while writing the spec, so the proof is designed before the build:
139
+
140
+ ```json
141
+ "parity": {
142
+ "criterion": "A brief from the skill names the takeaway and the rejection condition.",
143
+ "red": "Old skill: brief has neither field.",
144
+ "green": "New skill: brief has both fields in every run.",
145
+ "surface": "host CLI in a throwaway workspace with a throwaway HERMES_HOME, old and new skill loaded the same way",
146
+ "artifact": "parity/contact-sheet.png"
147
+ }
148
+ ```
149
+
150
+ and on the ledger, `parity.markers`: short strings the new behaviour leaves in its output and the
151
+ old behaviour does not. Pick markers that only the mechanism produces (a field name, a gate's
152
+ refusal line, a file the new step writes), so a marker in a baseline output means contamination.
@@ -0,0 +1,131 @@
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
4
+ new target behaves differently from the old one on the same prompt. Green tests and new files are
5
+ necessary and never sufficient. Ports in this product have passed every gate while being
6
+ unreachable, and A/B runs have measured nothing because the baseline could read the treatment; this
7
+ step exists to catch both.
8
+
9
+ ## 1. Reachability
10
+
11
+ Drive the real entry point, read what comes back, then break the wiring and watch the probe fail.
12
+
13
+ | Target surface | Probe | Break it by |
14
+ | --- | --- | --- |
15
+ | Prompt-hook route | Pipe a `UserPromptSubmit` JSON payload into the hook and assert the skill is named in the returned context | Removing the route entry |
16
+ | Slash command | Run the host with the plugin loaded and the command, and read the transcript | Deleting the command file |
17
+ | Skill discovery | A host CLI prompt that should load the skill, with the transcript showing the skill loaded | Changing the description |
18
+ | Script or gate | Run the installed copy's script on a fixture that should fail and one that should pass | Reverting the gate |
19
+ | Package payload | Pack the package and list the files (read the JSON listing, not the human text) | Removing the file from the allowlist |
20
+
21
+ A probe that cannot fail proves nothing; record the broken run beside the passing one.
22
+
23
+ ## 2. An isolated baseline
24
+
25
+ The baseline is the target at the base revision, in a place where the new work cannot be read:
26
+
27
+ ```text
28
+ git -C <target root> worktree add <lane folder>/parity-base <base_ref>
29
+ ```
30
+
31
+ or the snapshot copied in Phase 0. Check the isolation before running anything: the baseline
32
+ folder has none of the new files, `git log` inside it stops at the base revision, and the run
33
+ folder, the spec and the diff are outside any path the baseline session can reach. When the target
34
+ lives in a repo the baseline session could explore, run the baseline from a copy outside that repo.
35
+
36
+ ## 3. Running both arms
37
+
38
+ Choose prompts the spec never used as examples: a held-out prompt shows the behaviour generalises,
39
+ while a prompt copied from the spec only shows the spec was followed.
40
+
41
+ For a Hermes skill or plugin target, run each arm as a real session in its own throwaway
42
+ workspace, each with its own throwaway `HERMES_HOME` holding only that arm's plugin copy:
43
+
44
+ ```text
45
+ HERMES_HOME=<baseline home> <host CLI> "<held-out prompt naming the skill id>"
46
+ HERMES_HOME=<treatment home> <host CLI> "<held-out prompt naming the skill id>"
47
+ ```
48
+
49
+ - Load both arms the same way, so the only difference is the port.
50
+ - Keep any other installed copy of the same plugin out of both homes, or two versions of its hooks will both fire.
51
+ - Install from a copy you control, never from the host's installed plugin cache.
52
+ - For a project skill, give each arm its own workspace holding its own skill copy.
53
+ - Keep the runs cheap: a small prompt, one model.
54
+ - Run each arm at least twice when its output varies. One sample can mislead.
55
+
56
+ For a code target, run the target's tests and its real command on both revisions, and save the
57
+ outputs.
58
+
59
+ Save every output under `parity/` (`baseline-1.md`, `treatment-1.md`, …) and list them:
60
+
61
+ ```json
62
+ "parity": {
63
+ "baseline_outputs": ["parity/baseline-1.md", "parity/baseline-2.md"],
64
+ "treatment_outputs": ["parity/treatment-1.md", "parity/treatment-2.md"],
65
+ "markers": ["Rejection condition"]
66
+ }
67
+ ```
68
+
69
+ The parity gate then requires every marker in every treatment output and in no baseline output. A
70
+ marker missing from a treatment output means the port changed behaviour unreliably. A marker in a
71
+ baseline output means the baseline saw the new work, or the target already had the behaviour and the
72
+ gap was imaginary. Either way the proof is void until fixed. Before trusting a tie or a surprising
73
+ win, grep the baseline transcript for the treatment's distinctive identifiers (file names, section
74
+ names, the skill's own terms); any hit voids the comparison.
75
+
76
+ ## 4. Visual outputs
77
+
78
+ When the target makes images, films, slides, documents or pages, the user judges them by eye. Render
79
+ the baseline and treatment outputs side by side on one contact sheet (rows for arms, columns for
80
+ runs), save it under `parity/`, and show it. Machine checks such as overlap or layout scores are
81
+ geometry checks; call them that. Headless browsers used for renders take
82
+ `--use-mock-keychain --password-store=basic` so no keychain dialog interrupts the user.
83
+
84
+ The sample output is evidence that the port works. Polishing that one sample is a different task;
85
+ offer it only when the user asks.
86
+
87
+ ## 5. The report
88
+
89
+ `REPORT.md` lives in the run folder. The gate requires the three headings, every mechanism id,
90
+ every source's URL or path, and a credit notice for every `ideas-credit` source that fed a taken
91
+ mechanism.
92
+
93
+ ```markdown
94
+ # Port report: <title>
95
+
96
+ Target: <root> at <base revision> → <new revision or working tree>
97
+ Run: .hermes/lithermes/runs/hijack-<slug>/ · gate: check --phase report PASS
98
+
99
+ ## Taken
100
+ - M1 <title>: <where it lives now> · parity: marker in 2/2 treatment runs, 0/2 baseline runs
101
+ - M4 <title>: …
102
+
103
+ ## Left
104
+ - M2 <title>: the target already enforces it (<path:line>)
105
+ - M3 <title>: opinion with no gain over the base model in a probe run
106
+ - M5 <title>: rests only on S5, which is no-go
107
+
108
+ ## Provenance
109
+ | Id | Source | Author | Published | Retrieved | Licence | Decision |
110
+ | --- | --- | --- | --- | --- | --- | --- |
111
+ | S1 | https://… | … | … | … | NOASSERTION | ideas-only |
112
+
113
+ ## Exposure
114
+ The spec writer read every source. The implementer worked from SPEC.md in an isolated worktree
115
+ (or: in the same context, degraded path). The model may have met these sources before. No run of
116
+ 12 or more words is shared with any capture; headings were checked for structural echoes.
117
+
118
+ ## Credit
119
+ <attribution notice path, or "credit lives in this report">
120
+
121
+ ## Review by
122
+ <date, and what would make this port stale: a model change, a target redesign, a new source>
123
+ ```
124
+
125
+ ## 6. Closing the run
126
+
127
+ 1. `hijack.mjs check <run> --phase report` passes.
128
+ 2. The reply to the user says what was taken and left, the parity result in a sentence, the contact
129
+ sheet when there is one, and the report path.
130
+ 3. Offer `review-work` for a work review of the diff; its provenance lane reads the run folder.
131
+ 4. The run folder stays local and out of commits. Commits, pushes and releases wait for the user.