@goondocks/myco 0.21.0 → 0.21.1

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 (145) hide show
  1. package/bin/myco-run +68 -7
  2. package/dist/{agent-eval-RJSQI5S2.js → agent-eval-YK2VP2S4.js} +7 -6
  3. package/dist/{agent-eval-RJSQI5S2.js.map → agent-eval-YK2VP2S4.js.map} +1 -1
  4. package/dist/{agent-run-2JSYFOKU.js → agent-run-GEJBD2YD.js} +5 -5
  5. package/dist/{agent-tasks-APFJIM2T.js → agent-tasks-5XSRGTRX.js} +5 -5
  6. package/dist/{chunk-R2JIJBCL.js → chunk-6ALVMIB4.js} +3 -3
  7. package/dist/{chunk-JZS6GZ6T.js → chunk-AUIXX33A.js} +10 -3
  8. package/dist/chunk-AUIXX33A.js.map +1 -0
  9. package/dist/{chunk-RL5R4CQU.js → chunk-DTWUHHFI.js} +39 -2
  10. package/dist/{chunk-RL5R4CQU.js.map → chunk-DTWUHHFI.js.map} +1 -1
  11. package/dist/{chunk-CESKJD44.js → chunk-EEOJWLMP.js} +5 -9
  12. package/dist/chunk-EEOJWLMP.js.map +1 -0
  13. package/dist/{chunk-BUTL6IFS.js → chunk-ENZR5NG7.js} +2 -2
  14. package/dist/{chunk-P66DLD6G.js → chunk-KTTSXYEK.js} +2 -2
  15. package/dist/chunk-LQIPXVDH.js +17 -0
  16. package/dist/chunk-LQIPXVDH.js.map +1 -0
  17. package/dist/{chunk-5ZG4RMUH.js → chunk-N2DGFACQ.js} +2 -2
  18. package/dist/{chunk-F3OEQYLS.js → chunk-N7Z3LUEZ.js} +33 -22
  19. package/dist/{chunk-F3OEQYLS.js.map → chunk-N7Z3LUEZ.js.map} +1 -1
  20. package/dist/{chunk-G6QIBNZM.js → chunk-NFO7BRCO.js} +4 -4
  21. package/dist/{chunk-VHNRMM4O.js → chunk-OTQH5KZW.js} +87 -37
  22. package/dist/chunk-OTQH5KZW.js.map +1 -0
  23. package/dist/{chunk-DJ3IHNYO.js → chunk-OZ3FBAK5.js} +2 -2
  24. package/dist/{chunk-6LB7XELY.js → chunk-QATYARI5.js} +15 -13
  25. package/dist/chunk-QATYARI5.js.map +1 -0
  26. package/dist/{chunk-JR54LTPP.js → chunk-QDLVIW2O.js} +3 -3
  27. package/dist/{chunk-LVIY7P35.js → chunk-QLLBJEM7.js} +5 -1
  28. package/dist/chunk-QLLBJEM7.js.map +1 -0
  29. package/dist/chunk-TSM6VESW.js +25 -0
  30. package/dist/chunk-TSM6VESW.js.map +1 -0
  31. package/dist/{chunk-ILJPRYES.js → chunk-USVFEWYL.js} +2 -2
  32. package/dist/{chunk-75Z7UKDY.js → chunk-VRI56337.js} +2 -2
  33. package/dist/{chunk-NGH7U6A3.js → chunk-X2IRGXGF.js} +336 -77
  34. package/dist/chunk-X2IRGXGF.js.map +1 -0
  35. package/dist/{chunk-NGROSFOH.js → chunk-Z66IT5KL.js} +14 -9
  36. package/dist/chunk-Z66IT5KL.js.map +1 -0
  37. package/dist/{cli-LNYSTDQM.js → cli-HSLIG7EX.js} +37 -37
  38. package/dist/{client-NWE4TCNO.js → client-Z43DNLJH.js} +3 -3
  39. package/dist/{detect-PXNM6TA7.js → detect-7NUD5B5R.js} +2 -2
  40. package/dist/{doctor-TI7EZ3RW.js → doctor-HJCWHAU4.js} +6 -6
  41. package/dist/{executor-F2YU7HXJ.js → executor-DO6QFC6G.js} +11 -10
  42. package/dist/{init-KG3TYVGE.js → init-4KVK7W2E.js} +9 -9
  43. package/dist/{installer-UMH7OJ5A.js → installer-N4UTEACX.js} +2 -2
  44. package/dist/{loader-NAVVZK63.js → loader-UDNUMEDA.js} +3 -2
  45. package/dist/{main-5PRQNEEE.js → main-4J4QZZTZ.js} +121 -62
  46. package/dist/main-4J4QZZTZ.js.map +1 -0
  47. package/dist/{open-5A27BCSB.js → open-7TXJQM3H.js} +5 -5
  48. package/dist/{post-compact-USAODKPQ.js → post-compact-7AEFVCZS.js} +7 -7
  49. package/dist/{post-tool-use-GMMSYBII.js → post-tool-use-TZINWWDH.js} +6 -6
  50. package/dist/{post-tool-use-failure-NZVSL2PO.js → post-tool-use-failure-TCFEU2GI.js} +7 -7
  51. package/dist/{pre-compact-LZ57DLUS.js → pre-compact-LO2VZCGR.js} +7 -7
  52. package/dist/{registry-M2Z5QBWH.js → registry-F3THYC5M.js} +4 -3
  53. package/dist/{remove-T3KE6C5N.js → remove-F77AAALE.js} +7 -7
  54. package/dist/{restart-YWDEVZUJ.js → restart-UEFDPMLT.js} +6 -6
  55. package/dist/{search-GKFDGELR.js → search-NHNVUAQQ.js} +6 -6
  56. package/dist/{server-AHUR6CWF.js → server-AZJSTQEK.js} +5 -5
  57. package/dist/{session-2ZEPLWW6.js → session-3HLC5KOD.js} +5 -5
  58. package/dist/{session-end-LWJYQAXX.js → session-end-FS46UARX.js} +6 -6
  59. package/dist/{session-start-WTA6GCOQ.js → session-start-46KPFV2H.js} +10 -10
  60. package/dist/{setup-llm-E7UU5IO7.js → setup-llm-JMWSNQ2C.js} +5 -5
  61. package/dist/src/agent/definitions/tasks/cortex-instructions.yaml +63 -41
  62. package/dist/src/agent/definitions/tasks/skill-evolve.yaml +177 -21
  63. package/dist/src/agent/definitions/tasks/skill-generate.yaml +20 -6
  64. package/dist/src/agent/definitions/tasks/vault-evolve.yaml +65 -55
  65. package/dist/src/cli.js +1 -1
  66. package/dist/src/daemon/main.js +1 -1
  67. package/dist/src/hooks/post-tool-use.js +1 -1
  68. package/dist/src/hooks/session-end.js +1 -1
  69. package/dist/src/hooks/session-start.js +1 -1
  70. package/dist/src/hooks/stop.js +1 -1
  71. package/dist/src/hooks/user-prompt-submit.js +1 -1
  72. package/dist/src/mcp/server.js +1 -1
  73. package/dist/src/symbionts/manifests/opencode.yaml +7 -0
  74. package/dist/src/symbionts/templates/agents-starter.md +1 -1
  75. package/dist/{stats-DFG6S23S.js → stats-MKMETHMA.js} +6 -6
  76. package/dist/{stop-WRBTXEVT.js → stop-OUEX6KA4.js} +6 -6
  77. package/dist/{stop-failure-32MGIG2Q.js → stop-failure-2BWVNZEG.js} +7 -7
  78. package/dist/{subagent-start-VFGHQFVL.js → subagent-start-J4VV6DEE.js} +7 -7
  79. package/dist/{subagent-stop-663FXG3P.js → subagent-stop-JMLVEPIA.js} +7 -7
  80. package/dist/{task-completed-ZCQYEFMZ.js → task-completed-65CHMMKA.js} +7 -7
  81. package/dist/{team-JTI5CDUO.js → team-U2LDKIS4.js} +3 -3
  82. package/dist/ui/assets/{index-DGf1h-Ha.js → index-BUGor9dk.js} +1 -1
  83. package/dist/ui/index.html +1 -1
  84. package/dist/{update-3NBQTG32.js → update-ZSHVXWSQ.js} +7 -7
  85. package/dist/{user-prompt-submit-ME2TBKOS.js → user-prompt-submit-APMO6FVU.js} +6 -6
  86. package/dist/{version-GQAFBBPX.js → version-TXPPS3L5.js} +2 -2
  87. package/package.json +1 -1
  88. package/skills/myco-rules/SKILL.md +94 -0
  89. package/skills/{rules → myco-rules}/references/rules-bad-example.md +1 -1
  90. package/skills/{rules → myco-rules}/references/rules-good-example.md +1 -1
  91. package/dist/chunk-6LB7XELY.js.map +0 -1
  92. package/dist/chunk-CESKJD44.js.map +0 -1
  93. package/dist/chunk-CUDIZJY7.js +0 -36
  94. package/dist/chunk-CUDIZJY7.js.map +0 -1
  95. package/dist/chunk-JZS6GZ6T.js.map +0 -1
  96. package/dist/chunk-LVIY7P35.js.map +0 -1
  97. package/dist/chunk-NGH7U6A3.js.map +0 -1
  98. package/dist/chunk-NGROSFOH.js.map +0 -1
  99. package/dist/chunk-VHNRMM4O.js.map +0 -1
  100. package/dist/main-5PRQNEEE.js.map +0 -1
  101. package/skills/myco-curate/SKILL.md +0 -86
  102. package/skills/rules/SKILL.md +0 -214
  103. /package/dist/{agent-run-2JSYFOKU.js.map → agent-run-GEJBD2YD.js.map} +0 -0
  104. /package/dist/{agent-tasks-APFJIM2T.js.map → agent-tasks-5XSRGTRX.js.map} +0 -0
  105. /package/dist/{chunk-R2JIJBCL.js.map → chunk-6ALVMIB4.js.map} +0 -0
  106. /package/dist/{chunk-BUTL6IFS.js.map → chunk-ENZR5NG7.js.map} +0 -0
  107. /package/dist/{chunk-P66DLD6G.js.map → chunk-KTTSXYEK.js.map} +0 -0
  108. /package/dist/{chunk-5ZG4RMUH.js.map → chunk-N2DGFACQ.js.map} +0 -0
  109. /package/dist/{chunk-G6QIBNZM.js.map → chunk-NFO7BRCO.js.map} +0 -0
  110. /package/dist/{chunk-DJ3IHNYO.js.map → chunk-OZ3FBAK5.js.map} +0 -0
  111. /package/dist/{chunk-JR54LTPP.js.map → chunk-QDLVIW2O.js.map} +0 -0
  112. /package/dist/{chunk-ILJPRYES.js.map → chunk-USVFEWYL.js.map} +0 -0
  113. /package/dist/{chunk-75Z7UKDY.js.map → chunk-VRI56337.js.map} +0 -0
  114. /package/dist/{cli-LNYSTDQM.js.map → cli-HSLIG7EX.js.map} +0 -0
  115. /package/dist/{client-NWE4TCNO.js.map → client-Z43DNLJH.js.map} +0 -0
  116. /package/dist/{detect-PXNM6TA7.js.map → detect-7NUD5B5R.js.map} +0 -0
  117. /package/dist/{doctor-TI7EZ3RW.js.map → doctor-HJCWHAU4.js.map} +0 -0
  118. /package/dist/{executor-F2YU7HXJ.js.map → executor-DO6QFC6G.js.map} +0 -0
  119. /package/dist/{init-KG3TYVGE.js.map → init-4KVK7W2E.js.map} +0 -0
  120. /package/dist/{installer-UMH7OJ5A.js.map → installer-N4UTEACX.js.map} +0 -0
  121. /package/dist/{loader-NAVVZK63.js.map → loader-UDNUMEDA.js.map} +0 -0
  122. /package/dist/{open-5A27BCSB.js.map → open-7TXJQM3H.js.map} +0 -0
  123. /package/dist/{post-compact-USAODKPQ.js.map → post-compact-7AEFVCZS.js.map} +0 -0
  124. /package/dist/{post-tool-use-GMMSYBII.js.map → post-tool-use-TZINWWDH.js.map} +0 -0
  125. /package/dist/{post-tool-use-failure-NZVSL2PO.js.map → post-tool-use-failure-TCFEU2GI.js.map} +0 -0
  126. /package/dist/{pre-compact-LZ57DLUS.js.map → pre-compact-LO2VZCGR.js.map} +0 -0
  127. /package/dist/{registry-M2Z5QBWH.js.map → registry-F3THYC5M.js.map} +0 -0
  128. /package/dist/{remove-T3KE6C5N.js.map → remove-F77AAALE.js.map} +0 -0
  129. /package/dist/{restart-YWDEVZUJ.js.map → restart-UEFDPMLT.js.map} +0 -0
  130. /package/dist/{search-GKFDGELR.js.map → search-NHNVUAQQ.js.map} +0 -0
  131. /package/dist/{server-AHUR6CWF.js.map → server-AZJSTQEK.js.map} +0 -0
  132. /package/dist/{session-2ZEPLWW6.js.map → session-3HLC5KOD.js.map} +0 -0
  133. /package/dist/{session-end-LWJYQAXX.js.map → session-end-FS46UARX.js.map} +0 -0
  134. /package/dist/{session-start-WTA6GCOQ.js.map → session-start-46KPFV2H.js.map} +0 -0
  135. /package/dist/{setup-llm-E7UU5IO7.js.map → setup-llm-JMWSNQ2C.js.map} +0 -0
  136. /package/dist/{stats-DFG6S23S.js.map → stats-MKMETHMA.js.map} +0 -0
  137. /package/dist/{stop-WRBTXEVT.js.map → stop-OUEX6KA4.js.map} +0 -0
  138. /package/dist/{stop-failure-32MGIG2Q.js.map → stop-failure-2BWVNZEG.js.map} +0 -0
  139. /package/dist/{subagent-start-VFGHQFVL.js.map → subagent-start-J4VV6DEE.js.map} +0 -0
  140. /package/dist/{subagent-stop-663FXG3P.js.map → subagent-stop-JMLVEPIA.js.map} +0 -0
  141. /package/dist/{task-completed-ZCQYEFMZ.js.map → task-completed-65CHMMKA.js.map} +0 -0
  142. /package/dist/{team-JTI5CDUO.js.map → team-U2LDKIS4.js.map} +0 -0
  143. /package/dist/{update-3NBQTG32.js.map → update-ZSHVXWSQ.js.map} +0 -0
  144. /package/dist/{user-prompt-submit-ME2TBKOS.js.map → user-prompt-submit-APMO6FVU.js.map} +0 -0
  145. /package/dist/{version-GQAFBBPX.js.map → version-TXPPS3L5.js.map} +0 -0
@@ -2,17 +2,20 @@ name: skill-evolve
2
2
  displayName: Skill Evolution
3
3
  description: >-
4
4
  Evaluate and evolve existing Myco-managed skills. Assesses content
5
- freshness, identifies merge and narrowness opportunities, and
6
- autonomously consolidates the skill inventory.
5
+ freshness against new spores AND codebase drift from refactors,
6
+ identifies merge and narrowness opportunities, and autonomously
7
+ consolidates the skill inventory.
7
8
  agent: myco-agent
8
9
  prompt: >-
9
- Assess and evolve skills that have new knowledge or structural
10
- overlap. The instruction contains pre-filtered skills with their
11
- content, new spore IDs, and pre-computed similarity analysis.
10
+ Assess and evolve skills that have new knowledge, codebase drift,
11
+ or structural overlap. The instruction contains pre-filtered skills
12
+ with their content, new spore IDs, and pre-computed similarity
13
+ analysis; the verify phase fact-checks the broader active skill
14
+ set against the codebase.
12
15
  isDefault: false
13
16
  reasoningLevel: default
14
- maxTurns: 48
15
- timeoutSeconds: 1800
17
+ maxTurns: 72
18
+ timeoutSeconds: 2400
16
19
  schedule:
17
20
  enabled: false
18
21
  intervalSeconds: 900
@@ -81,13 +84,145 @@ phases:
81
84
  required: true
82
85
  readOnly: true
83
86
 
87
+ - name: verify
88
+ reasoningLevel: default
89
+ prompt: |
90
+ Fact-check active skills against the actual codebase. This phase
91
+ catches silent drift from refactors that didn't produce spores —
92
+ e.g., a file was renamed, a function was removed, a pattern was
93
+ replaced — so the spore-driven assessment in the next phase would
94
+ otherwise leave the skill's stale content in place.
95
+
96
+ ## Selection
97
+
98
+ List active skills via vault_skill_records (action: list,
99
+ status: active). Prioritize up to 3 skills with the OLDEST
100
+ `last_verified_at` in properties (missing/zero counts as oldest,
101
+ so never-verified skills sort to the front). If fewer than 3
102
+ active skills exist, verify them all. This watermark is
103
+ independent of `last_assessed_at` — it rotates verify coverage
104
+ even when assess never touches the skill, which is the whole
105
+ point: skills that never get new spores still need to be
106
+ fact-checked for silent refactor drift. Full rotation time
107
+ scales with the active skill count divided by 3, so a larger
108
+ skill inventory naturally stretches the verify cadence.
109
+
110
+ Skills flagged by the inventory phase (merge_candidates or
111
+ narrow_candidates in vault_state:skill-evolve-inventory) can be
112
+ skipped here — they're already going to be rewritten in act.
113
+
114
+ ## Per-skill procedure
115
+
116
+ For each selected skill:
117
+
118
+ 1. Read full content via vault_skill_records (action: get).
119
+ 2. Identify the 3-5 most LOAD-BEARING concrete claims. A claim
120
+ is load-bearing if the procedure depends on it being true.
121
+ Examples:
122
+ - "Edit `packages/myco/src/db/schema.ts`" — path claim
123
+ - "Call `setFocusedPanel()`" — identifier claim
124
+ - "The daemon restarts executor on SIGHUP" — behavior claim
125
+ Skip generic advice ("use good naming"), tool names that are
126
+ universal (e.g., `grep`), and illustrative code snippets that
127
+ aren't literal file content.
128
+ 3. Verify each claim with the cheapest tool that answers it:
129
+ - **Path claim** → fs_read with a narrow line window (e.g.,
130
+ start_line=1, end_line=30). ENOENT or unrelated content =
131
+ MISSING/OUTDATED. For a DIRECTORY path, use fs_list or
132
+ fs_tree instead — fs_read on a directory returns an error
133
+ and burns a turn.
134
+ - **Identifier claim** → code_grep for the symbol with a
135
+ path+glob filter. Zero hits in expected location = MISSING.
136
+ - **Behavior claim** → code_grep for signature patterns that
137
+ would implement it. Zero hits = MISSING.
138
+
139
+ HARD LIMIT: **at most 2 tool calls per claim**, and **at most
140
+ 4 claims per skill**, so ~8 filesystem calls per skill
141
+ absolute maximum. If your first grep returns too many hits
142
+ or the wrong ones, DO NOT refine and retry — accept
143
+ INCONCLUSIVE and move on. Exploratory refinement is exactly
144
+ how this phase burned through budget on earlier runs.
145
+
146
+ 4. Categorize each claim: VERIFIED / MISSING / OUTDATED /
147
+ INCONCLUSIVE. INCONCLUSIVE is fine when the claim is too
148
+ fuzzy to verify cheaply — don't burn turns on it.
149
+
150
+ 5. Aggregate for the skill:
151
+ - confidence: high (>=80% verified), medium, or low
152
+ - severity: none / minor (1 cosmetic miss) / major
153
+ (load-bearing miss) / critical (most refs gone)
154
+
155
+ 6. Update the skill's verify watermark REGARDLESS of severity —
156
+ skipping this step on severity=none would make verify re-pick
157
+ the same skill forever. Example call:
158
+
159
+ vault_skill_records({
160
+ action: "update",
161
+ id: "<the-skill-uuid>",
162
+ properties: "{\"last_verified_at\": 1776580022}"
163
+ })
164
+
165
+ `properties` is a JSON string, merged into the skill's existing
166
+ properties. Any recent epoch-seconds integer works as the
167
+ timestamp — this is a rotation cursor, not an audit timestamp.
168
+
169
+ ## Budget discipline
170
+
171
+ Total budget for this phase: {{max_turns}} turns covering ALL
172
+ selected skills combined. Plan per-skill budget as roughly
173
+ `{{max_turns}} / skills_selected` turns. Recommended shape:
174
+ 1 content read + up to 4 claim checks × up to 2 tool calls +
175
+ 1 watermark write. Stop verifying a skill as soon as severity
176
+ is clear — finding one MISSING load-bearing claim is enough
177
+ to flag the skill; don't check remaining claims.
178
+
179
+ Prefer narrow fs_read windows (start/end lines) over whole-file
180
+ reads. Prefer code_grep with a path/glob filter over an open grep.
181
+ When a tool returns "Not a file" or zero matches, accept that
182
+ answer and move on — do not retry with adjusted args.
183
+
184
+ Tools available for this phase: {{phase_tools}}.
185
+
186
+ ## Store results
187
+
188
+ Store via vault_set_state (key: skill-evolve-drift) as JSON:
189
+ {
190
+ "verified_at": <epoch-seconds>,
191
+ "reports": [
192
+ {
193
+ "skill_id": "...",
194
+ "name": "...",
195
+ "severity": "none|minor|major|critical",
196
+ "confidence": "high|medium|low",
197
+ "notes": "Short: what's missing or outdated.",
198
+ "load_bearing_misses": ["claim 1", "claim 2"]
199
+ }
200
+ ]
201
+ }
202
+
203
+ Report via vault_report. If no active skills are selectable
204
+ (e.g., all were flagged by inventory for merge), store an empty
205
+ reports array and report skip.
206
+ tools:
207
+ - vault_skill_records
208
+ - vault_set_state
209
+ - vault_report
210
+ - fs_read
211
+ - fs_list
212
+ - code_grep
213
+ maxTurns: 24
214
+ required: true
215
+ dependsOn:
216
+ - inventory
217
+
84
218
  - name: assess
85
219
  reasoningLevel: default
86
220
  prompt: |
87
- Read the inventory analysis from vault_state
88
- (key: skill-evolve-inventory).
221
+ Read two pre-computed inputs from vault_state:
222
+ - key: skill-evolve-inventory (merge/narrow candidates)
223
+ - key: skill-evolve-drift (codebase verification reports)
89
224
 
90
- There are TWO sources of skills to assess:
225
+ There are THREE sources of skills to assess:
91
226
 
92
227
  **A. Skills with new knowledge** — listed in the instruction
93
228
  with descriptions and new spore IDs (full content is NOT in
@@ -98,8 +233,8 @@ phases:
98
233
  get, id: "<name>") and verify 2-3 code references via
99
234
  vault_search_fts. Skip content reads for skills where
100
235
  the new spores are clearly unrelated.
101
- 3. Check the inventory analysis: is this skill also flagged
102
- for merge or narrowness?
236
+ 3. Check the inventory AND drift analyses: is this skill also
237
+ flagged for merge, narrowness, or codebase drift?
103
238
 
104
239
  **B. Inventory-flagged skills** — merge_candidates and
105
240
  narrow_candidates from the inventory analysis. These may NOT
@@ -109,12 +244,30 @@ phases:
109
244
  2. Verify the inventory's merge/narrow recommendation by
110
245
  reading both skills' content.
111
246
 
112
- For ALL skills from both sources, classify with one of:
247
+ **C. Drift-flagged skills** — reports from the verify phase with
248
+ severity of `minor`, `major`, or `critical`. These may NOT appear
249
+ in the instruction (no new spores) but need attention because
250
+ their content no longer matches the codebase. For each drift
251
+ report not already covered above:
252
+ 1. Read the skill's content via vault_skill_records (action: get).
253
+ 2. Trust the verify phase's load_bearing_misses as the STALE
254
+ detail set. You do NOT need to re-run fs_read/code_grep —
255
+ the verify phase already did that work. Only re-check if
256
+ the verify report's confidence is low.
257
+ 3. Major/critical severity with confidence high/medium should
258
+ classify as STALE (or DEPRECATED if the entire subsystem
259
+ described is gone). Minor severity may stay CURRENT unless
260
+ combined with new-spore evidence.
261
+
262
+ For ALL skills from all three sources, classify with one of:
113
263
  - CURRENT — still accurate, no changes needed.
114
- - STALE — new knowledge changes specific steps, paths,
115
- or gotchas. Note exactly WHAT is new.
264
+ - STALE — new knowledge OR drift report changes specific
265
+ steps, paths, or gotchas. Note exactly WHAT is new or
266
+ wrong (cite the drift report's load_bearing_misses if
267
+ that's the driver).
116
268
  - DEPRECATED — key code references are gone or the
117
269
  procedure is no longer relevant. Note what's missing.
270
+ Drift severity=critical is the strongest signal here.
118
271
  - MERGE — overlaps significantly with another skill
119
272
  (from inventory analysis). Note the TARGET skill to
120
273
  merge into.
@@ -122,10 +275,11 @@ phases:
122
275
  inventory analysis). Note the BROADER skill to absorb
123
276
  into.
124
277
 
125
- Bias toward CURRENT. A skill that is 90% accurate is
126
- better left alone than rewritten with risk of losing detail.
127
- Only classify MERGE/NARROW when the inventory analysis
128
- supports it AND you agree after reading the content.
278
+ Bias toward CURRENT for cosmetic issues. A skill that is 90%
279
+ accurate is better left alone than rewritten with risk of
280
+ losing detail. Do NOT bias toward CURRENT when a drift report
281
+ flags load-bearing misses with high confidence that's
282
+ exactly the refactor-drift case this pipeline exists to catch.
129
283
 
130
284
  5. Update the skill's properties with the new watermark:
131
285
  vault_skill_records (action: update, id: <skill_id>,
@@ -143,8 +297,9 @@ phases:
143
297
  Report via vault_report.
144
298
 
145
299
  If the instruction says "No skills need assessment" AND the
146
- inventory has no merge/narrow candidates, report skip via
147
- vault_report and finish.
300
+ inventory has no merge/narrow candidates AND the drift report
301
+ has no minor+ severity entries, report skip via vault_report
302
+ and finish.
148
303
  tools:
149
304
  - vault_spores
150
305
  - vault_search_fts
@@ -155,6 +310,7 @@ phases:
155
310
  required: true
156
311
  dependsOn:
157
312
  - inventory
313
+ - verify
158
314
 
159
315
  - name: act
160
316
  reasoningLevel: low
@@ -11,7 +11,7 @@ prompt: >-
11
11
  source material. Stage the skill, validate it, then finalize it.
12
12
  isDefault: false
13
13
  reasoningLevel: default
14
- maxTurns: 30
14
+ maxTurns: 32
15
15
  timeoutSeconds: 900
16
16
  schedule:
17
17
  enabled: false
@@ -177,9 +177,22 @@ phases:
177
177
  staging path's dedup gate already ran on your description;
178
178
  this is a sanity check on the procedural content itself.
179
179
 
180
- 7. **Accuracy:** Spot-check 2-3 specific claims against the
181
- vault. Use vault_search_fts to verify file paths and
182
- function names mentioned in the skill.
180
+ 7. **Accuracy (codebase-grounded):** Identify the 3-5 most
181
+ LOAD-BEARING concrete claims paths, function/class names,
182
+ patterns the procedure depends on — and verify each against
183
+ the actual source:
184
+ - **Path claim** → `fs_read` (narrow window). ENOENT or
185
+ unrelated content = FAIL.
186
+ - **Identifier claim** → `code_grep` with a path+glob filter.
187
+ Zero hits in the expected location = FAIL.
188
+ - **Behavior claim** → `code_grep` for signature patterns
189
+ that would implement it. Zero hits = FAIL.
190
+ Budget 1-2 tool calls per claim.
191
+
192
+ If any load-bearing claim FAILS, treat as a criterion failure
193
+ and re-stage with corrected content. Do not finalize a skill
194
+ whose load-bearing paths can't be verified against the
195
+ current codebase — that's how hallucinated paths ship.
183
196
 
184
197
  ## If criteria fail
185
198
 
@@ -216,9 +229,10 @@ phases:
216
229
  - vault_skill_records
217
230
  - vault_skill_candidates
218
231
  - vault_spores
219
- - vault_search_fts
220
232
  - vault_report
221
- maxTurns: 15
233
+ - fs_read
234
+ - code_grep
235
+ maxTurns: 18
222
236
  required: true
223
237
  dependsOn:
224
238
  - draft
@@ -262,67 +262,77 @@ phases:
262
262
  reasoningLevel: default
263
263
  dependsOn: [consolidate]
264
264
  prompt: |
265
- Assess current digest state and gather material for tier updates.
266
- The 3 digest tier phases run in parallel after you — your summary
267
- is their primary input. Be thorough.
268
-
269
- ## Step 1: Check current state (budget: 2 turns)
270
-
271
- Call `vault_read_digest` (no tier param) to see current digest state.
272
- Note each tier's `generated_at` timestamp this tells you how fresh
273
- each tier is. Review the prior phase results (in your context):
274
- - How many spores were created/superseded?
275
- - How many entities/edges were added?
276
- - Did consolidate or graph act on externally-created spores or entities?
277
-
278
- If changes are minor (< 3 new spores, 0 entity changes), call
279
- `vault_report` with action "skip" and reason explaining why the
280
- current digest is still sufficient. STOP.
281
-
282
- ## Step 2: Gather new material (budget: 5 turns)
283
-
284
- Search for material relevant to what changed:
285
- 1. Call `vault_search_semantic` with themes from newly created/superseded
286
- spores and new entity names
287
- 2. Call `vault_spores` to see recently created observations
288
- 3. Call `vault_sessions` for recent session context
289
-
290
- ## Step 3: Produce detailed findings
291
-
292
- Your final response is critical the per-tier phases see it as their
293
- primary context (they cannot call vault_spores or vault_sessions).
294
- Structure your summary as:
295
-
296
- **New material to integrate:**
297
- - List each new insight, decision, pattern, gotcha with enough detail
298
- that a tier writer can incorporate it without re-searching
299
- - Include specific spore content, not just "3 new spores were created"
300
-
301
- **Themes and connections:**
302
- - What overarching themes connect the new material?
303
- - What existing digest sections are affected?
304
-
305
- **Per-tier freshness and guidance:**
306
- For each tier, state whether it should UPDATE or SKIP based on both
307
- the volume of new material AND the tier's `generated_at` freshness:
308
- - A tier written < 30 minutes ago with only minor changes → SKIP
309
- - A tier written hours ago or with significant changes → UPDATE
310
- - Larger tiers (10000) tolerate more frequent updates since
311
- they have room for incremental additions
312
- - Smaller tiers (1500) should only update for material that
313
- genuinely changes the executive picture
314
-
315
- Per-tier directives:
316
- - 10000: UPDATE/SKIP + what to add (any new content)
317
- - 5000: UPDATE/SKIP + what to add (trade-offs and patterns)
318
- - 1500: UPDATE/SKIP + what to add (only critical changes)
265
+ Gather material for AT MOST ONE digest tier update per run. The
266
+ rotation decision is made by the `vault_read_digest` tool, not
267
+ by you the tool returns which tier needs attention (or tells
268
+ you to skip). Over 3 runs every tier gets one deep pass.
269
+
270
+ Total budget: {{max_turns}} turns.
271
+
272
+ ## Step 1: Get the rotation decision (1 turn)
273
+
274
+ Call `vault_read_digest` with:
275
+ pick: "rotate_oldest"
276
+ min_staleness_seconds: 1800
277
+
278
+ The tool returns one of two shapes:
279
+
280
+ **Skip shape** `{mode:"rotate_oldest", skip:true, reason, all_tiers}`.
281
+ Every tier was generated within the last 30 minutes. Call
282
+ `vault_report` with action "skip" passing the reason through.
283
+ STOP — do not run steps 2-3.
284
+
285
+ **Rotate shape** `{mode:"rotate_oldest", selected_tier,
286
+ selected_generated_at, selected_content, rotation_reason, all_tiers}`.
287
+ Proceed to step 2, scoped to `selected_tier`.
288
+
289
+ ## Step 2: Gather material for `selected_tier` (budget: half
290
+ of remaining)
291
+
292
+ Scope the search to what belongs at the selected tier:
293
+ - **1500 (executive briefing):** only critical decisions,
294
+ reversals, state-of-system changes.
295
+ - **5000 (deep onboarding):** trade-offs, patterns, active
296
+ decisions, unresolved gotchas.
297
+ - **10000 (full archive):** any new content worth preserving.
298
+
299
+ Use `vault_search_semantic` for themes from new/superseded spores,
300
+ `vault_spores` for specific content, `vault_sessions` for recent
301
+ session context. Make each call count — do not repeatedly search
302
+ for variations of the same theme. Accept "good enough" findings
303
+ and move on.
304
+
305
+ ## Step 3: Produce findings
306
+
307
+ Your final response is the per-tier phases' primary context
308
+ (they cannot call vault_spores or vault_sessions). Structure it:
309
+
310
+ **Chosen tier for this run: <selected_tier>**
311
+ Include the rotation_reason verbatim from the tool so readers
312
+ can audit the decision.
313
+
314
+ **New material to integrate (scoped to the chosen tier):**
315
+ - List each insight with enough detail that the tier writer can
316
+ incorporate it without re-searching
317
+ - Include specific spore content, not just spore counts
318
+
319
+ **Themes and connections** relevant to the chosen tier.
320
+
321
+ **Per-tier directives** — mark exactly the `selected_tier` as
322
+ UPDATE, the other two as SKIP, and include the tool's
323
+ rotation_reason in the UPDATE line:
324
+ - 10000: UPDATE or SKIP + one-line reason
325
+ - 5000: UPDATE or SKIP + one-line reason
326
+ - 1500: UPDATE or SKIP + one-line reason
327
+
328
+ Tools available: {{phase_tools}}.
319
329
  tools:
320
330
  - vault_spores
321
331
  - vault_sessions
322
332
  - vault_search_semantic
323
333
  - vault_read_digest
324
334
  - vault_report
325
- maxTurns: 10
335
+ maxTurns: 12
326
336
  required: true
327
337
 
328
338
  - name: digest-10000
package/dist/src/cli.js CHANGED
@@ -2,5 +2,5 @@
2
2
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
3
3
 
4
4
  // src/entries/cli.ts
5
- await import("../cli-LNYSTDQM.js");
5
+ await import("../cli-HSLIG7EX.js");
6
6
  //# sourceMappingURL=cli.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/daemon.ts
4
- var { main } = await import("../../main-5PRQNEEE.js");
4
+ var { main } = await import("../../main-4J4QZZTZ.js");
5
5
  await main();
6
6
  //# sourceMappingURL=main.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/post-tool-use.ts
4
- var { main } = await import("../../post-tool-use-GMMSYBII.js");
4
+ var { main } = await import("../../post-tool-use-TZINWWDH.js");
5
5
  await main();
6
6
  //# sourceMappingURL=post-tool-use.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/session-end.ts
4
- var { main } = await import("../../session-end-LWJYQAXX.js");
4
+ var { main } = await import("../../session-end-FS46UARX.js");
5
5
  await main();
6
6
  //# sourceMappingURL=session-end.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/session-start.ts
4
- var { main } = await import("../../session-start-WTA6GCOQ.js");
4
+ var { main } = await import("../../session-start-46KPFV2H.js");
5
5
  await main();
6
6
  //# sourceMappingURL=session-start.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/stop.ts
4
- var { main } = await import("../../stop-WRBTXEVT.js");
4
+ var { main } = await import("../../stop-OUEX6KA4.js");
5
5
  await main();
6
6
  //# sourceMappingURL=stop.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/user-prompt-submit.ts
4
- var { main } = await import("../../user-prompt-submit-ME2TBKOS.js");
4
+ var { main } = await import("../../user-prompt-submit-APMO6FVU.js");
5
5
  await main();
6
6
  //# sourceMappingURL=user-prompt-submit.js.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
 
3
3
  // src/entries/mcp-server.ts
4
- var { main } = await import("../../server-AHUR6CWF.js");
4
+ var { main } = await import("../../server-AZJSTQEK.js");
5
5
  await main();
6
6
  //# sourceMappingURL=server.js.map
@@ -21,6 +21,13 @@ registration:
21
21
  # opencode.json hosts MCP + permissions under non-standard keys
22
22
  mcpTarget: opencode.json
23
23
  mcpServersKey: mcp
24
+ # Opencode prepends /opt/homebrew/bin ahead of ~/.local/bin in the env it
25
+ # gives MCP children, so `myco-run` resolves to the prod shim regardless
26
+ # of the user's shell PATH. Bake the runtime.command alias into the MCP
27
+ # command at install time so the spawn skips PATH resolution entirely.
28
+ # Every other symbiont resolves `myco-run` via PATH and then uses the
29
+ # shim's runtime.command walk-up — no install-time substitution needed.
30
+ substituteRuntimeCommand: true
24
31
  settingsTarget: opencode.json
25
32
  skillsTarget: .agents/skills
26
33
  # No instructionsFile — opencode reads AGENTS.md natively
@@ -2,4 +2,4 @@
2
2
 
3
3
  <!-- This starter file was created by Myco. Replace it with your project's rules and conventions. -->
4
4
 
5
- Rules haven't been defined yet. Use the `/rules` skill to generate project rules, or edit this file directly.
5
+ Rules haven't been defined yet. Use the `/myco-rules` skill to add durable project rules, or edit this file directly.
@@ -1,19 +1,19 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  gatherStats
4
- } from "./chunk-75Z7UKDY.js";
4
+ } from "./chunk-VRI56337.js";
5
5
  import {
6
6
  initVaultDb
7
- } from "./chunk-JR54LTPP.js";
7
+ } from "./chunk-QDLVIW2O.js";
8
8
  import "./chunk-SAKJMNSR.js";
9
- import "./chunk-VHNRMM4O.js";
9
+ import "./chunk-OTQH5KZW.js";
10
10
  import "./chunk-X3IGT5RV.js";
11
11
  import "./chunk-53RPGOEN.js";
12
12
  import "./chunk-OUJSQSKE.js";
13
13
  import "./chunk-POEPHBQK.js";
14
14
  import "./chunk-MYX5NCRH.js";
15
- import "./chunk-P66DLD6G.js";
16
- import "./chunk-BUTL6IFS.js";
15
+ import "./chunk-KTTSXYEK.js";
16
+ import "./chunk-ENZR5NG7.js";
17
17
  import "./chunk-LPUQPDC2.js";
18
18
  import "./chunk-6C6QZ4PM.js";
19
19
  import "./chunk-UUHLLQXO.js";
@@ -94,4 +94,4 @@ function formatUptime(seconds) {
94
94
  export {
95
95
  run
96
96
  };
97
- //# sourceMappingURL=stats-DFG6S23S.js.map
97
+ //# sourceMappingURL=stats-MKMETHMA.js.map
@@ -2,16 +2,16 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  normalizeHookInput,
4
4
  readStdin
5
- } from "./chunk-5ZG4RMUH.js";
5
+ } from "./chunk-N2DGFACQ.js";
6
6
  import "./chunk-ZXZPJJN3.js";
7
7
  import {
8
8
  resolveVaultDir
9
- } from "./chunk-CUDIZJY7.js";
9
+ } from "./chunk-TSM6VESW.js";
10
10
  import {
11
11
  DaemonClient
12
- } from "./chunk-P66DLD6G.js";
13
- import "./chunk-BUTL6IFS.js";
14
- import "./chunk-NGROSFOH.js";
12
+ } from "./chunk-KTTSXYEK.js";
13
+ import "./chunk-ENZR5NG7.js";
14
+ import "./chunk-Z66IT5KL.js";
15
15
  import "./chunk-LPUQPDC2.js";
16
16
  import "./chunk-6C6QZ4PM.js";
17
17
  import "./chunk-UUHLLQXO.js";
@@ -46,4 +46,4 @@ async function main() {
46
46
  export {
47
47
  main
48
48
  };
49
- //# sourceMappingURL=stop-WRBTXEVT.js.map
49
+ //# sourceMappingURL=stop-OUEX6KA4.js.map
@@ -1,14 +1,14 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  sendEvent
4
- } from "./chunk-G6QIBNZM.js";
4
+ } from "./chunk-NFO7BRCO.js";
5
5
  import "./chunk-V7XG6V6C.js";
6
- import "./chunk-5ZG4RMUH.js";
6
+ import "./chunk-N2DGFACQ.js";
7
7
  import "./chunk-ZXZPJJN3.js";
8
- import "./chunk-CUDIZJY7.js";
9
- import "./chunk-P66DLD6G.js";
10
- import "./chunk-BUTL6IFS.js";
11
- import "./chunk-NGROSFOH.js";
8
+ import "./chunk-TSM6VESW.js";
9
+ import "./chunk-KTTSXYEK.js";
10
+ import "./chunk-ENZR5NG7.js";
11
+ import "./chunk-Z66IT5KL.js";
12
12
  import "./chunk-LPUQPDC2.js";
13
13
  import "./chunk-6C6QZ4PM.js";
14
14
  import "./chunk-UUHLLQXO.js";
@@ -28,4 +28,4 @@ async function main() {
28
28
  export {
29
29
  main
30
30
  };
31
- //# sourceMappingURL=stop-failure-32MGIG2Q.js.map
31
+ //# sourceMappingURL=stop-failure-2BWVNZEG.js.map
@@ -1,14 +1,14 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  sendEvent
4
- } from "./chunk-G6QIBNZM.js";
4
+ } from "./chunk-NFO7BRCO.js";
5
5
  import "./chunk-V7XG6V6C.js";
6
- import "./chunk-5ZG4RMUH.js";
6
+ import "./chunk-N2DGFACQ.js";
7
7
  import "./chunk-ZXZPJJN3.js";
8
- import "./chunk-CUDIZJY7.js";
9
- import "./chunk-P66DLD6G.js";
10
- import "./chunk-BUTL6IFS.js";
11
- import "./chunk-NGROSFOH.js";
8
+ import "./chunk-TSM6VESW.js";
9
+ import "./chunk-KTTSXYEK.js";
10
+ import "./chunk-ENZR5NG7.js";
11
+ import "./chunk-Z66IT5KL.js";
12
12
  import "./chunk-LPUQPDC2.js";
13
13
  import "./chunk-6C6QZ4PM.js";
14
14
  import "./chunk-UUHLLQXO.js";
@@ -28,4 +28,4 @@ async function main() {
28
28
  export {
29
29
  main
30
30
  };
31
- //# sourceMappingURL=subagent-start-VFGHQFVL.js.map
31
+ //# sourceMappingURL=subagent-start-J4VV6DEE.js.map