@nurix/etna 0.18.0 → 0.18.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 (100) hide show
  1. package/README.md +6 -5
  2. package/data/harness-index.json +1 -1
  3. package/data/harnesses/code/CLAUDE.md +7 -18
  4. package/data/harnesses/code/agents/brainstorm.md +3 -3
  5. package/data/harnesses/code/agents/change-review.md +13 -10
  6. package/data/harnesses/code/agents/harness-manager.md +15 -15
  7. package/data/harnesses/code/agents/maintenance.md +10 -3
  8. package/data/harnesses/code/agents/performance-review.md +5 -0
  9. package/data/harnesses/code/harness.json +1 -1
  10. package/data/harnesses/code/rules/general.md +40 -36
  11. package/data/harnesses/code/skills/boundary/SKILL.md +15 -42
  12. package/data/harnesses/code/skills/boundary/references/boundary-taxonomy.md +366 -304
  13. package/data/harnesses/code/skills/brainstorm/README.md +9 -9
  14. package/data/harnesses/code/skills/brainstorm/SKILL.md +15 -15
  15. package/data/harnesses/code/skills/brainstorm/harvest.md +2 -2
  16. package/data/harnesses/code/skills/brainstorm/templates/backlog.md +2 -2
  17. package/data/harnesses/code/skills/brainstorm/templates/build.md +6 -6
  18. package/data/harnesses/code/skills/brainstorm/templates/decisions.md +3 -3
  19. package/data/harnesses/code/skills/brainstorm/templates/doctrine.md +2 -2
  20. package/data/harnesses/code/skills/brainstorm/templates/domain-model.md +2 -2
  21. package/data/harnesses/code/skills/brainstorm/templates/glossary.md +2 -1
  22. package/data/harnesses/code/skills/brainstorm/templates/non-goals.md +3 -7
  23. package/data/harnesses/code/skills/brainstorm/templates/questions.md +6 -5
  24. package/data/harnesses/code/skills/brainstorm/templates/state.md +1 -8
  25. package/data/harnesses/code/skills/brainstorm/templates/tech.md +6 -6
  26. package/data/harnesses/code/skills/brainstorm/templates/thesis.md +2 -2
  27. package/data/harnesses/code/skills/distiller/SKILL.md +48 -177
  28. package/data/harnesses/code/skills/distiller/references/docs-mode.md +116 -343
  29. package/data/harnesses/code/skills/distiller/references/method.md +37 -109
  30. package/data/harnesses/code/skills/documentation/SKILL.md +9 -6
  31. package/data/harnesses/code/skills/documentation/references/examples.md +30 -61
  32. package/data/harnesses/code/skills/documentation/references/style-guide.md +59 -62
  33. package/data/harnesses/code/skills/documentation/references/templates.md +25 -33
  34. package/data/harnesses/code/skills/workflow-mapper/SKILL.md +32 -11
  35. package/data/harnesses/code/skills/workflow-mapper/references/patterns.md +1 -1
  36. package/data/harnesses/code-fable/CLAUDE.md +12 -23
  37. package/data/harnesses/code-fable/agents/brainstorm.md +3 -3
  38. package/data/harnesses/code-fable/agents/change-review.md +13 -10
  39. package/data/harnesses/code-fable/agents/harness-manager.md +15 -15
  40. package/data/harnesses/code-fable/agents/maintenance.md +10 -3
  41. package/data/harnesses/code-fable/agents/performance-review.md +5 -0
  42. package/data/harnesses/code-fable/harness.json +1 -1
  43. package/data/harnesses/code-fable/rules/general.md +40 -36
  44. package/data/harnesses/code-fable/skills/boundary/SKILL.md +15 -42
  45. package/data/harnesses/code-fable/skills/boundary/references/boundary-taxonomy.md +366 -304
  46. package/data/harnesses/code-fable/skills/brainstorm/README.md +9 -9
  47. package/data/harnesses/code-fable/skills/brainstorm/SKILL.md +15 -15
  48. package/data/harnesses/code-fable/skills/brainstorm/harvest.md +2 -2
  49. package/data/harnesses/code-fable/skills/brainstorm/templates/backlog.md +2 -2
  50. package/data/harnesses/code-fable/skills/brainstorm/templates/build.md +6 -6
  51. package/data/harnesses/code-fable/skills/brainstorm/templates/decisions.md +3 -3
  52. package/data/harnesses/code-fable/skills/brainstorm/templates/doctrine.md +2 -2
  53. package/data/harnesses/code-fable/skills/brainstorm/templates/domain-model.md +2 -2
  54. package/data/harnesses/code-fable/skills/brainstorm/templates/glossary.md +2 -1
  55. package/data/harnesses/code-fable/skills/brainstorm/templates/non-goals.md +3 -7
  56. package/data/harnesses/code-fable/skills/brainstorm/templates/questions.md +6 -5
  57. package/data/harnesses/code-fable/skills/brainstorm/templates/state.md +1 -8
  58. package/data/harnesses/code-fable/skills/brainstorm/templates/tech.md +6 -6
  59. package/data/harnesses/code-fable/skills/brainstorm/templates/thesis.md +2 -2
  60. package/data/harnesses/code-fable/skills/distiller/SKILL.md +48 -177
  61. package/data/harnesses/code-fable/skills/distiller/references/docs-mode.md +116 -343
  62. package/data/harnesses/code-fable/skills/distiller/references/method.md +37 -109
  63. package/data/harnesses/code-fable/skills/documentation/SKILL.md +9 -6
  64. package/data/harnesses/code-fable/skills/documentation/references/examples.md +30 -61
  65. package/data/harnesses/code-fable/skills/documentation/references/style-guide.md +59 -62
  66. package/data/harnesses/code-fable/skills/documentation/references/templates.md +25 -33
  67. package/data/harnesses/code-fable/skills/workflow-mapper/SKILL.md +32 -11
  68. package/data/harnesses/code-fable/skills/workflow-mapper/references/patterns.md +1 -1
  69. package/data/harnesses/discover/CLAUDE.md +41 -109
  70. package/data/harnesses/discover/agents/api.md +11 -28
  71. package/data/harnesses/discover/agents/codebase.md +12 -30
  72. package/data/harnesses/discover/agents/community.md +9 -21
  73. package/data/harnesses/discover/agents/deployed-client-bundle.md +16 -67
  74. package/data/harnesses/discover/agents/distribution-artifacts.md +21 -59
  75. package/data/harnesses/discover/agents/docs.md +11 -20
  76. package/data/harnesses/discover/agents/infra-backend-fingerprint.md +28 -68
  77. package/data/harnesses/discover/agents/packages.md +12 -28
  78. package/data/harnesses/discover/agents/session.md +18 -50
  79. package/data/harnesses/discover/agents/website.md +9 -19
  80. package/data/harnesses/discover/agents/wire-capture.md +22 -72
  81. package/data/harnesses/discover/harness.json +1 -1
  82. package/data/harnesses/discover/rules/discovery.md +73 -182
  83. package/data/harnesses/discover/rules/evaluation.md +90 -98
  84. package/data/harnesses/discover/rules/ingestion.md +123 -322
  85. package/data/harnesses/discover/rules/self-correction.md +67 -92
  86. package/data/harnesses/discover/rules/tradecraft.md +201 -172
  87. package/data/harnesses/hr/CLAUDE.md +21 -51
  88. package/data/harnesses/hr/harness.json +1 -1
  89. package/data/harnesses/hr/skills/interview-eval/SKILL.md +23 -11
  90. package/data/harnesses/hr/skills/interview-eval/TEMPLATE.md +49 -29
  91. package/data/harnesses/hr/skills/interview-eval/rubric.md +30 -30
  92. package/data/harnesses/kb-agi/CLAUDE.md +8 -8
  93. package/data/harnesses/kb-agi/agents/kb-agi-init.md +31 -22
  94. package/data/harnesses/kb-agi/agents/kb-catch-stale.md +1 -1
  95. package/data/harnesses/kb-agi/agents/kb-find-gaps.md +1 -1
  96. package/data/harnesses/kb-agi/agents/kb-fix-links.md +1 -1
  97. package/data/harnesses/kb-agi/agents/kb-refresh-summaries.md +2 -2
  98. package/data/harnesses/kb-agi/agents/kb-sync-metadata.md +2 -2
  99. package/data/harnesses/kb-agi/harness.json +1 -1
  100. package/package.json +1 -1
@@ -282,7 +282,7 @@ Append entries below, oldest at bottom. Format:
282
282
  Memory file initialized during documentation baseline.
283
283
  ```
284
284
 
285
- > The per-actor memory **inbox** (`docs/memory/inbox/`) is *not* a baseline scaffold — the `session-reflect` hook creates it mechanically on the first reflected session. See **§11 Memory inbox entry** for its format.
285
+ > The per-actor memory **inbox** (`docs/memory/inbox/`) is _not_ a baseline scaffold — the `session-reflect` hook creates it mechanically on the first reflected session. See **§11 Memory inbox entry** for its format.
286
286
 
287
287
  ---
288
288
 
@@ -295,12 +295,12 @@ The four research-derived sections (**Affected Modules**, **Conventions to Follo
295
295
  ```yaml
296
296
  ---
297
297
  owns:
298
- - src/feature-name/** # projected at Draft, confirmed at Active
298
+ - src/feature-name/** # projected at Draft, confirmed at Active
299
299
  touches:
300
300
  - src/shared/state/feature.js
301
301
  depends_on:
302
302
  - docs/features/related-feature.md
303
- anchors: # optional — see §3 frontmatter reference
303
+ anchors: # optional — see §3 frontmatter reference
304
304
  - "qmd query: wire envelope invariants"
305
305
  ---
306
306
  ```
@@ -428,7 +428,7 @@ model Resource {
428
428
  Sections fill in across the feature's lifecycle. No template swap — they accumulate in place.
429
429
 
430
430
  | When | Sections written | Source |
431
- |------|------------------|--------|
431
+ | --- | --- | --- |
432
432
  | Status: Draft (design) | Goal, Goals & Non-Goals, Background, Approach, Open Questions, Risks | User interview |
433
433
  | Status: Draft (research) | Affected Modules, Conventions to Follow, Current Behavior, Ownership Conflicts | spec-mode agent |
434
434
  | Status: Draft → Active (implementation lands) | Architecture, Key Functions, State, Redux, Files; frontmatter `owns`/`touches` confirmed against real code | Main agent (from actual code) |
@@ -635,11 +635,11 @@ Three sections are required: **Decision**, **Context**, **Consequences**. Everyt
635
635
  ```markdown
636
636
  ---
637
637
  title: "ADR-NNN: Short title in sentence case"
638
- status: Accepted # Proposed | Accepted | Deprecated | Superseded by ADR-NNN
638
+ status: Accepted # Proposed | Accepted | Deprecated | Superseded by ADR-NNN
639
639
  date: YYYY-MM-DD
640
640
  decision-owner: Name
641
- reviewers: [] # optional
642
- supersedes: # optional, e.g., ADR-005
641
+ reviewers: [] # optional
642
+ supersedes: # optional, e.g., ADR-005
643
643
  tags: [adr]
644
644
  ---
645
645
 
@@ -656,12 +656,15 @@ tags: [adr]
656
656
  ## Consequences
657
657
 
658
658
  **Positive:**
659
+
659
660
  - [What becomes easier]
660
661
 
661
662
  **Negative:**
663
+
662
664
  - [What becomes harder, what we accept reluctantly]
663
665
 
664
666
  **Risks:**
667
+
665
668
  - [Second-order effects you can already see, with mitigations if known]
666
669
 
667
670
  <!-- Optional sections below. Include only when warranted by the decision's weight. -->
@@ -672,10 +675,10 @@ tags: [adr]
672
675
 
673
676
  ## Options Considered
674
677
 
675
- | Option | Pros | Cons | Outcome |
676
- |---|---|---|---|
677
- | **Option A** | … | … | **CHOSEN** |
678
- | Option B | … | … | Eliminated — [reason] |
678
+ | Option | Pros | Cons | Outcome |
679
+ | ------------ | ---- | ---- | --------------------- |
680
+ | **Option A** | … | … | **CHOSEN** |
681
+ | Option B | … | … | Eliminated — [reason] |
679
682
 
680
683
  ## Deep Comparison
681
684
 
@@ -688,12 +691,12 @@ tags: [adr]
688
691
  ## Implementation Plan
689
692
 
690
693
  | Phase | Scope | Duration |
691
- |---|---|---|
692
- | 1 | … | … |
694
+ | ----- | ----- | -------- |
695
+ | 1 | … | … |
693
696
 
694
697
  ## Open Questions
695
698
 
696
- 1. **[Question]** — *Default*: [stated default until resolved].
699
+ 1. **[Question]** — _Default_: [stated default until resolved].
697
700
 
698
701
  ## Acknowledgements
699
702
 
@@ -757,7 +760,7 @@ Skip any section that doesn't apply. Don't pad to fill the template.
757
760
  - **{Family 2}** — {what's in it.}
758
761
  - **{Family 3}** — {what's in it.}
759
762
 
760
- The full surface lives in [`{path/to/public-index}`]({path/to/public-index}). ← optional pointer for libraries
763
+ The full surface lives in [`{path/to/public-index}`]({path/to/public-index}). ← optional pointer for libraries
761
764
 
762
765
  ## Stack
763
766
 
@@ -767,32 +770,21 @@ The full surface lives in [`{path/to/public-index}`]({path/to/public-index}).
767
770
 
768
771
  ## Getting started
769
772
 
770
- \`\`\`bash
771
- {pm} install
772
- {pm} run dev # what it does (port, URL)
773
- {pm} run build # what it does
774
- {pm} run preview # what it does (omit if not applicable)
775
- \`\`\`
773
+ \`\`\`bash {pm} install {pm} run dev # what it does (port, URL) {pm} run build # what it does {pm} run preview # what it does (omit if not applicable) \`\`\`
776
774
 
777
775
  {Optional one-liner about first-run behavior — e.g., "Dev server lands on /playground."}
778
776
 
779
- ## {Runtime entry point} ← optional; e.g., "The playground", "CLI", "API endpoints"
777
+ ## {Runtime entry point} ← optional; e.g., "The playground", "CLI", "API endpoints"
780
778
 
781
779
  {Brief description of the dev/runtime surface.}
782
780
 
783
- | {Thing} | {What it shows / does} |
784
- | -------------------- | -------------------------- |
785
- | `{route or command}` | {description} |
781
+ | {Thing} | {What it shows / does} |
782
+ | -------------------- | ---------------------- |
783
+ | `{route or command}` | {description} |
786
784
 
787
785
  ## Layout
788
786
 
789
- \`\`\`
790
- src/
791
- ├── {entry-file} # {purpose}
792
- ├── {folder}/ # {purpose}
793
- │ └── ...
794
- └── {folder}/ # {purpose}
795
- \`\`\`
787
+ \`\`\` src/ ├── {entry-file} # {purpose} ├── {folder}/ # {purpose} │ └── ... └── {folder}/ # {purpose} \`\`\`
796
788
 
797
789
  ## Adding a {primary unit}
798
790
 
@@ -801,7 +793,7 @@ src/
801
793
  3. {Wire into the playground / example app / test harness so reviewers can see it render.}
802
794
  4. {Document any divergence from upstream in `docs/{...}`.}
803
795
 
804
- ## Styling ← optional; replace with whichever cross-cutting concern matters most
796
+ ## Styling ← optional; replace with whichever cross-cutting concern matters most
805
797
 
806
798
  {Configuration notes that affect every consumer — design tokens, conventions, opt-outs.}
807
799
 
@@ -45,6 +45,7 @@ Search patterns (adapt to framework):
45
45
  For each route, record: `{ method, path, handler_function, file }`.
46
46
 
47
47
  Filter out trivial CRUD (single DB call + response). Keep routes that:
48
+
48
49
  - Call `startWorkflow`, `addJob`, `enqueue`, `emit`, `publish` (async dispatch)
49
50
  - Call 2+ service functions sequentially
50
51
  - Have transaction blocks (`$transaction`, `BEGIN`, `withTransaction`)
@@ -66,6 +67,7 @@ Search patterns:
66
67
  ```
67
68
 
68
69
  For Temporal specifically, also check:
70
+
69
71
  - `temporal/config/workflowModules.js` — workflow registry with queues and dependencies
70
72
  - `temporal/config/activityModules.js` — activity aggregation
71
73
 
@@ -82,6 +84,7 @@ Search patterns:
82
84
  ```
83
85
 
84
86
  Focus on actions that:
87
+
85
88
  - POST/PUT/PATCH/DELETE to backend (not just GETs)
86
89
  - Dispatch multiple Redux actions in sequence
87
90
  - Start polling loops (`setInterval`, recursive `setTimeout`, retry patterns)
@@ -138,7 +141,7 @@ For each discovered entry point, trace the full execution path. Use one sub-agen
138
141
  Map code actors to diagram participants using this hierarchy:
139
142
 
140
143
  | Code Pattern | Participant Name |
141
- |---|---|
144
+ | --- | --- |
142
145
  | React component, hook, event handler | `User` + `Frontend` |
143
146
  | Express/API route handler | `API` |
144
147
  | Temporal workflow | `Temporal` |
@@ -175,7 +178,7 @@ Not every API route is a "workflow". Classify and filter.
175
178
  ### Workflow Categories
176
179
 
177
180
  | Category | Criteria | Include? |
178
- |---|---|---|
181
+ | --- | --- | --- |
179
182
  | **Orchestration** | Multi-step, multi-service, async handoffs (save, publish, deploy) | Always |
180
183
  | **Auth & Session** | Login, logout, token refresh, SSO flows | Always |
181
184
  | **Real-time** | WebSocket connections, live updates, presence | Always |
@@ -206,9 +209,7 @@ Simple workflows get a compact diagram. Complex workflows get full detail with a
206
209
  ````markdown
207
210
  ### {Workflow Name}
208
211
 
209
- **Trigger:** {What initiates this — button click, API call, cron schedule, event}
210
- **Participants:** {List of systems involved}
211
- **Key files:** {3-5 most important files in the chain}
212
+ **Trigger:** {What initiates this — button click, API call, cron schedule, event} **Participants:** {List of systems involved} **Key files:** {3-5 most important files in the chain}
212
213
 
213
214
  ```mermaid
214
215
  sequenceDiagram
@@ -226,6 +227,7 @@ sequenceDiagram
226
227
  ```
227
228
 
228
229
  **Notes:**
230
+
229
231
  - {Important implementation detail not visible in diagram}
230
232
  - {Performance consideration, timeout, retry policy}
231
233
  - {Known edge cases or failure modes}
@@ -265,11 +267,11 @@ sequenceDiagram
265
267
 
266
268
  Write to the user-specified path, or default to `docs/architecture/workflows.md`. Before writing output files, ensure the target directory exists. Create it with `mkdir -p` if needed.
267
269
 
268
- ````markdown
270
+ ```markdown
269
271
  ---
270
- generated: {YYYY-MM-DD}
271
- scope: {full | feature-name}
272
- workflows_found: {count}
272
+ generated: { YYYY-MM-DD }
273
+ scope: { full | feature-name }
274
+ workflows_found: { count }
273
275
  ---
274
276
 
275
277
  # Codebase Workflows
@@ -279,7 +281,7 @@ Auto-generated workflow map. Traces execution paths from user action to terminal
279
281
  ## Table of Contents
280
282
 
281
283
  | Workflow | Category | Trigger | Participants | Complexity |
282
- |---|---|---|---|---|
284
+ | --- | --- | --- | --- | --- |
283
285
  | [{Name}](#{anchor}) | {Category} | {Trigger} | {Count} | {Simple/Moderate/Complex} |
284
286
 
285
287
  ---
@@ -287,6 +289,7 @@ Auto-generated workflow map. Traces execution paths from user action to terminal
287
289
  ## Orchestration Workflows
288
290
 
289
291
  ### {Workflow Name}
292
+
290
293
  {Diagram + metadata as defined in Phase 4}
291
294
 
292
295
  ---
@@ -294,6 +297,7 @@ Auto-generated workflow map. Traces execution paths from user action to terminal
294
297
  ## Authentication & Session Workflows
295
298
 
296
299
  ### {Workflow Name}
300
+
297
301
  {...}
298
302
 
299
303
  ---
@@ -301,6 +305,7 @@ Auto-generated workflow map. Traces execution paths from user action to terminal
301
305
  ## Real-time Workflows
302
306
 
303
307
  ### {Workflow Name}
308
+
304
309
  {...}
305
310
 
306
311
  ---
@@ -308,6 +313,7 @@ Auto-generated workflow map. Traces execution paths from user action to terminal
308
313
  ## Event-driven Workflows
309
314
 
310
315
  ### {Workflow Name}
316
+
311
317
  {...}
312
318
 
313
319
  ---
@@ -315,6 +321,7 @@ Auto-generated workflow map. Traces execution paths from user action to terminal
315
321
  ## Scheduled Workflows
316
322
 
317
323
  ### {Workflow Name}
324
+
318
325
  {...}
319
326
 
320
327
  ---
@@ -322,8 +329,9 @@ Auto-generated workflow map. Traces execution paths from user action to terminal
322
329
  ## Data Pipeline Workflows
323
330
 
324
331
  ### {Workflow Name}
332
+
325
333
  {...}
326
- ````
334
+ ```
327
335
 
328
336
  ### Section Ordering
329
337
 
@@ -347,6 +355,7 @@ Launch 5 parallel sub-agents for Phase 1 (one per technique). Collect results, d
347
355
  ### Targeted Discovery
348
356
 
349
357
  User specifies a feature name. Skip broad Phase 1 scan. Instead:
358
+
350
359
  1. Find the feature's directory/files (grep for feature name in routes, components, workflows)
351
360
  2. Trace from those entry points only
352
361
  3. Output a single-feature workflow document
@@ -362,56 +371,68 @@ Read the existing workflow map file. For each workflow listed, check if the key
362
371
  ### Payload Storage Detection
363
372
 
364
373
  Look for patterns where large payloads are stored separately and referenced by ID:
374
+
365
375
  ```
366
376
  storePayload|savePayload|workflow_payload|jobData
367
377
  → then: retrievePayload|fetchPayload|getPayload (in the worker/activity)
368
378
  ```
379
+
369
380
  Note this in the diagram as a "Store payload → reference by ID" pattern.
370
381
 
371
382
  ### Optimistic Locking Detection
372
383
 
373
384
  Look for version comparison patterns:
385
+
374
386
  ```
375
387
  version.*!==|version.*conflict|StaleObjectError|OptimisticLock
376
388
  if.*serverVersion.*localVersion|if.*version.*mismatch
377
389
  ```
390
+
378
391
  These indicate conflict branching that should appear as `alt` blocks.
379
392
 
380
393
  ### Polling Loop Detection
381
394
 
382
395
  Look for patterns where the frontend waits for async completion:
396
+
383
397
  ```
384
398
  setInterval|setTimeout.*recursive|poll|retry.*status
385
399
  GET.*status\?.*workflowId|GET.*status\?.*jobId
386
400
  ```
401
+
387
402
  Note the polling interval and timeout in the diagram.
388
403
 
389
404
  ### Child Workflow / Sub-job Detection
390
405
 
391
406
  Look for spawned sub-processes:
407
+
392
408
  ```
393
409
  startChild\(|spawnChild|fork\(|.add\(.*queue
394
410
  Promise\.all.*map.*startWorkflow
395
411
  ```
412
+
396
413
  These should appear as nested sequences or separate linked diagrams.
397
414
 
398
415
  ### Transaction Boundary Detection
399
416
 
400
417
  Look for explicit transaction markers:
418
+
401
419
  ```
402
420
  \$transaction|\$executeRaw|BEGIN|COMMIT|ROLLBACK
403
421
  withTransaction|runInTransaction|atomic
404
422
  ```
423
+
405
424
  Group operations within a transaction using `rect` blocks in the diagram.
406
425
 
407
426
  ### Rate Limiting & Middleware Detection
408
427
 
409
428
  Look for middleware applied to route groups:
429
+
410
430
  ```
411
431
  rateLimit|rateLimiter|throttle
412
432
  authenticate|authorize|requireAuth|requireRole
413
433
  validate|validateBody|validateParams
414
434
  ```
435
+
415
436
  Note these as guards in the diagram using `opt` blocks or notes.
416
437
 
417
438
  ---
@@ -9,7 +9,7 @@ Concrete grep/glob patterns for each discovery technique. Agents should adapt th
9
9
  Identify the tech stack to select the right patterns:
10
10
 
11
11
  | Check | Pattern | Means |
12
- |---|---|---|
12
+ | --- | --- | --- |
13
13
  | `package.json` contains `express` | `"express"` | Express backend |
14
14
  | `package.json` contains `@temporalio` | `"@temporalio"` | Temporal workflows |
15
15
  | `package.json` contains `bullmq` | `"bullmq"` | BullMQ job queues |
@@ -30,11 +30,11 @@ This is the only step that runs **before** the harness exists; everything below
30
30
 
31
31
  Three peer modes plus a Completion step — enter wherever the user's thinking already is. Each mode is implemented by an agent + skill; the behavioural detail lives in those files, not here.
32
32
 
33
- | Mode | Enter when | Implemented by | Exits to |
34
- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- | ------------------------------ |
35
- | **Brainstorming** | explicit ask; or a user utterance challenges a loaded pillar headline → name the brushed principle and offer `/brainstorm start` (no auto-entry) | `brainstorm` agent + skill | Spec, Plan, or close + harvest |
36
- | **Spec** | new feature work | `spec-mode` agent + `documentation` skill | Plan |
37
- | **Plan** | a spec is approved | `documentation` skill → `docs/history/plans/YYYY-MM-DD-{slug}.md` | Completion |
33
+ | Mode | Enter when | Implemented by | Exits to |
34
+ | --- | --- | --- | --- |
35
+ | **Brainstorming** | explicit ask; or a user utterance challenges a loaded pillar headline → name the brushed principle and offer `/brainstorm start` (no auto-entry) | `brainstorm` agent + skill | Spec, Plan, or close + harvest |
36
+ | **Spec** | new feature work | `spec-mode` agent + `documentation` skill | Plan |
37
+ | **Plan** | a spec is approved | `documentation` skill → `docs/history/plans/YYYY-MM-DD-{slug}.md` | Completion |
38
38
 
39
39
  On **Completion**: freeze the plan (`Status: Complete`) and flip the feature spec to `Status: Active`, extending it with how-it-works sections; then distil the plan's trail — if the memory inbox (`docs/memory/inbox/`) holds entries, run `distiller facts` (inbox→fact-cards), then `distiller docs` for the just-completed feature's doc drafts any pending deltas for approval (presented, never auto-written). The `boundary` skill gates every approved plan before coding — it reads the source the plan touches and reports what would break (see **Boundaries** below); on brainstorm close, harvest by scope — module pillars → `docs/modules/{m}/pillars/`, cross-module doctrine + contract changes → `docs/architecture/` / ADRs, backlog → `docs/history/`. Open questions block close.
40
40
 
@@ -59,11 +59,11 @@ For the protocol on _writing_ to memory (which file, what belongs there, what do
59
59
 
60
60
  Project-specific learnings live in `docs/memory/` (git-tracked). Cross-project user preferences live in `~/.claude/` (untracked).
61
61
 
62
- | File | Owner | Contents |
63
- | ----------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
64
- | `docs/memory/main.md` | Main agent | Project-wide patterns, conventions confirmed in this codebase, recurring failure modes, decisions whose rationale isn't obvious from the code |
62
+ | File | Owner | Contents |
63
+ | --- | --- | --- |
64
+ | `docs/memory/main.md` | Main agent | Project-wide patterns, conventions confirmed in this codebase, recurring failure modes, decisions whose rationale isn't obvious from the code |
65
65
  | `docs/memory/{agent-name}.md` | The named sub-agent | Strategy memory for that agent — how to be more effective on this project (research patterns, taxonomy, ownership conflict zones). Never user-centric. |
66
- | `~/.claude/projects/...` | Auto-memory system | User preferences, role, communication style, cross-project habits |
66
+ | `~/.claude/projects/...` | Auto-memory system | User preferences, role, communication style, cross-project habits |
67
67
 
68
68
  **Override the default auto-memory location for project-relevant facts.** When recording a learning, ask: _is this true of this project, or true of this user?_ Project facts → `docs/memory/`. User facts → `~/.claude/`.
69
69
 
@@ -103,25 +103,14 @@ A boundary is a horizontal cross-cutting contract — entity model, db schema, w
103
103
 
104
104
  Unless explicitly requested:
105
105
 
106
- ❌ **Tests** – Never generate, update, or modify test files.
107
- ❌ **Dependencies** – Never upgrade frameworks, libraries, or dependencies.
108
- ❌ **Compatibility** – Never maintain backward compatibility unless specified.
109
- ❌ **Branches & Worktrees** – Never self-create git branches or worktrees. Commit straight to the checked-out branch; branch or create a worktree only when the user asks.
110
- ❌ **Protected Files** – Before editing, if `docs/operations/protected-files.md` exists, read it and never modify any path it lists; also never modify `AGENTS.md` or the `protected-files.md` file itself.
111
- ✅ **Browser Automation** – Use Chrome CDP / "Claude in Chrome" tools whenever they help (verifying UI, reproducing a flow, seeding or inspecting local data) — no need to ask first. **Main session only:** never drive the browser from a sub-agent or workflow executor — the session-bound Chrome connection destabilizes the sub-agent. A sub-agent that needs browser verification instead returns an explicit CDP checklist (exact URLs, actions, expected outcomes) for the orchestrator to execute in the main session.
112
- ✅ **Orchestrate via Sub-agents** – Run the main session as an orchestrator: delegate substantive work (research, implementation, audits) to sub-agents spawned via the Agent/Task tool with `model: opus` (Claude Opus), keeping the main context for dispatch, coordination, and synthesis. Give each sub-agent a self-contained prompt; parallelize independent dispatches.
113
- ✅ **Documentation** – Keep `docs/` updated when code changes affect documented behavior.
114
- ⚠️ **Plans** – Plans are created directly in `docs/history/plans/` (see Workflow → Plan Mode). Once `Status: Complete` or `Status: Abandoned`, the file is frozen — never edited. If scope changes after completion, write a new dated plan that links back to the old one.
115
- ⚠️ **Tool Issues** – If any CLI tool, shell alias, or MCP tool behaves unexpectedly (syntax errors, silent failures, wrong defaults), report the exact tool name, command, and error to the user so they can fix or remove the underlying library.
106
+ ❌ **Tests** – Never generate, update, or modify test files. ❌ **Dependencies** – Never upgrade frameworks, libraries, or dependencies. ❌ **Compatibility** – Never maintain backward compatibility unless specified. ❌ **Branches & Worktrees** – Never self-create git branches or worktrees. Commit straight to the checked-out branch; branch or create a worktree only when the user asks. ❌ **Protected Files** – Before editing, if `docs/operations/protected-files.md` exists, read it and never modify any path it lists; also never modify `AGENTS.md` or the `protected-files.md` file itself. ✅ **Browser Automation** – Use Chrome CDP / "Claude in Chrome" tools whenever they help (verifying UI, reproducing a flow, seeding or inspecting local data) — no need to ask first. **Main session only:** never drive the browser from a sub-agent or workflow executor — the session-bound Chrome connection destabilizes the sub-agent. A sub-agent that needs browser verification instead returns an explicit CDP checklist (exact URLs, actions, expected outcomes) for the orchestrator to execute in the main session. ✅ **Orchestrate via Sub-agents** – Run the main session as an orchestrator: delegate substantive work (research, implementation, audits) to sub-agents spawned via the Agent/Task tool with `model: opus` (Claude Opus), keeping the main context for dispatch, coordination, and synthesis. Give each sub-agent a self-contained prompt; parallelize independent dispatches. ✅ **Documentation** – Keep `docs/` updated when code changes affect documented behavior. ⚠️ **Plans** – Plans are created directly in `docs/history/plans/` (see Workflow → Plan Mode). Once `Status: Complete` or `Status: Abandoned`, the file is frozen — never edited. If scope changes after completion, write a new dated plan that links back to the old one. ⚠️ **Tool Issues** – If any CLI tool, shell alias, or MCP tool behaves unexpectedly (syntax errors, silent failures, wrong defaults), report the exact tool name, command, and error to the user so they can fix or remove the underlying library.
116
107
 
117
108
  ---
118
109
 
119
110
  ## File Structure
120
111
 
121
- - Add file path at top of each file:
122
- `// src/modules/example.js - Module for handling user authentication`
123
- - Add a 1-line function description as a comment above each function:
124
- `// Extract JWT token from request based on endpoint type`
112
+ - Add file path at top of each file: `// src/modules/example.js - Module for handling user authentication`
113
+ - Add a 1-line function description as a comment above each function: `// Extract JWT token from request based on endpoint type`
125
114
 
126
115
  ---
127
116
 
@@ -20,15 +20,15 @@ If none of those steering files exist yet (a freshly-baselined repo), a session
20
20
 
21
21
  ## Modes and the close gate
22
22
 
23
- Four modes exist — **dump / interview / probe / converge** — and they change *who drives* and *how much gets asked*, not the loop, which never stops. The mode lives in the session's `state.md` and switches only on an explicit user word. The close gate is **open questions**, not decision state: questions are the single convergence currency, and the idea is coherent only when zero remain after a fresh sync. See the skill's **Modes** and **Coherence** sections — don't re-derive them here.
23
+ Four modes exist — **dump / interview / probe / converge** — and they change _who drives_ and _how much gets asked_, not the loop, which never stops. The mode lives in the session's `state.md` and switches only on an explicit user word. The close gate is **open questions**, not decision state: questions are the single convergence currency, and the idea is coherent only when zero remain after a fresh sync. See the skill's **Modes** and **Coherence** sections — don't re-derive them here.
24
24
 
25
25
  ## How you facilitate
26
26
 
27
- - **Speak plain English; codes live in the files.** Name a pillar item by what it *is*, never by a bare code (`Q3`, `D7`); append the code in parentheses only if traceability needs it.
27
+ - **Speak plain English; codes live in the files.** Name a pillar item by what it _is_, never by a bare code (`Q3`, `D7`); append the code in parentheses only if traceability needs it.
28
28
  - **Suggest, never seize.** Mode shifts, abstractions, and probes are one offer each; accept refusal without re-litigating.
29
29
  - **Never write production code** while a session is open — load-bearing snippets are illustration only, inside the session folder.
30
30
 
31
- You don't perform the harvest yourself, and you don't presume a destination. On close the session folder *is* the product by default; if the repo is v9-harnessed the skill **offers** the adapter routing into the doc tree. The skill's `## stop` section is the canonical harvest map — don't duplicate it.
31
+ You don't perform the harvest yourself, and you don't presume a destination. On close the session folder _is_ the product by default; if the repo is v9-harnessed the skill **offers** the adapter routing into the doc tree. The skill's `## stop` section is the canonical harvest map — don't duplicate it.
32
32
 
33
33
  ## What you may write
34
34
 
@@ -18,14 +18,14 @@ You work in two phases:
18
18
 
19
19
  Parse these from the user's prompt. Use defaults if not specified.
20
20
 
21
- | Parameter | Default | Examples |
22
- | ------------- | ---------------------------------------------- | ------------------------------------------------- |
23
- | `since` | `3 months ago` | "last 2 weeks", "since Feb 1", "since 2025-01-01" |
24
- | `until` | `now` | "until Feb 10" |
25
- | `batch_size` | `8` | "batches of 10" |
26
- | `output` | `change-review-YYYY-MM-DD.csv` (today's date) | "write to review.csv" |
27
- | `skip_merges` | `true` | "include merges" |
28
- | `branch` | current branch | "on main", "on ai-staging" |
21
+ | Parameter | Default | Examples |
22
+ | --- | --- | --- |
23
+ | `since` | `3 months ago` | "last 2 weeks", "since Feb 1", "since 2025-01-01" |
24
+ | `until` | `now` | "until Feb 10" |
25
+ | `batch_size` | `8` | "batches of 10" |
26
+ | `output` | `change-review-YYYY-MM-DD.csv` (today's date) | "write to review.csv" |
27
+ | `skip_merges` | `true` | "include merges" |
28
+ | `branch` | current branch | "on main", "on ai-staging" |
29
29
 
30
30
  The heatmap needs rolling 1w / 1m / 3m windows, so default `since` to 3 months even though the classifier processes every commit in range.
31
31
 
@@ -66,6 +66,7 @@ git diff-tree --no-commit-id --numstat -r {hash}
66
66
  ```
67
67
 
68
68
  Run these in a single bash call using a loop for efficiency. From the numstat output, compute per-commit totals:
69
+
69
70
  - `files_changed`: number of files in the commit
70
71
  - `insertions`: sum of added lines across all files
71
72
  - `deletions`: sum of removed lines across all files
@@ -86,11 +87,13 @@ Spawn **haiku** sub-agents via the Task tool with `subagent_type: "general-purpo
86
87
  Before building the prompt template, check if `docs/memory/change-review.md` contains **Module Taxonomy** and **Feature Taxonomy** sections. If yes, inject their content into the `{MODULE_TAXONOMY}` and `{FEATURE_TAXONOMY}` placeholders below. If no memory file exists, use these generic fallbacks:
87
88
 
88
89
  **Generic Module Taxonomy fallback:**
90
+
89
91
  ```
90
92
  Classify by the PRIMARY directory of changed files. Use the top-level directory as the module category (e.g., `src/components/` → `frontend/components`, `app/api/` → `backend/api`). For files spanning 3+ categories, use `multi`.
91
93
  ```
92
94
 
93
95
  **Generic Feature Taxonomy fallback:**
96
+
94
97
  ```
95
98
  Infer the product area from the commit message and file paths. Use descriptive labels like `auth`, `editor`, `deploy`, `ui`, `infra`, `docs`, `dx`, `other`.
96
99
  ```
@@ -182,7 +185,7 @@ When a commit cannot be classified by a sub-agent, use these defaults:
182
185
 
183
186
  # Phase 2 — Velocity analysis
184
187
 
185
- Where Phase 1 classifies *what* changed, Phase 2 asks *where is change accelerating or decelerating* — and whether review attention matches the risk. Read the CSV from Phase 1 (or the recent one found in Before Starting).
188
+ Where Phase 1 classifies _what_ changed, Phase 2 asks _where is change accelerating or decelerating_ — and whether review attention matches the risk. Read the CSV from Phase 1 (or the recent one found in Before Starting).
186
189
 
187
190
  ## Step 6: Velocity Heatmap
188
191
 
@@ -195,7 +198,7 @@ Compute commits-per-directory over rolling windows:
195
198
  Aggregate by the top-level directories the CSV's `directories` field already carries (computed generically in Phase 1, Step 2). Report:
196
199
 
197
200
  | Directory | Commits 1w | Commits 1m | Commits 3m | Trend |
198
- |-----------|-----------:|-----------:|-----------:|-------|
201
+ | --------- | ---------: | ---------: | ---------: | ----- |
199
202
 
200
203
  Trend column: ↑ rising, ↓ falling, → steady, ↑↑ sharply rising, ↓↓ sharply falling.
201
204
 
@@ -9,14 +9,14 @@ model: inherit
9
9
 
10
10
  You bring a repo's `docs/` governance tree into conformance with the **installed** harness version, and you audit that conformance on demand. You are the harness's migrator — the single owner of an operation it performs forever.
11
11
 
12
- The keystone: **baseline and upgrade are the same operation.** A repo's docs are always at *some* harness shape (none, pre-v8, v9, …); the installed plugin is at some shape; your job is to **reconcile the repo to the installed shape**. Baseline is the degenerate case (reconcile from nothing). Upgrade is reconcile across a version gap. Same agent, same convergence.
12
+ The keystone: **baseline and upgrade are the same operation.** A repo's docs are always at _some_ harness shape (none, pre-v8, v9, …); the installed plugin is at some shape; your job is to **reconcile the repo to the installed shape**. Baseline is the degenerate case (reconcile from nothing). Upgrade is reconcile across a version gap. Same agent, same convergence.
13
13
 
14
- Reconcile is **declarative, not a migration ladder.** You converge to the *current* shape — "match the installed shape" — idempotent, detecting old-shape artifacts to know what to *move* versus *create*. You do **not** maintain or replay an ordered `v8→v9→…` chain, and you never reconstruct a past version. (Same philosophy the stack already applies to the database: drop & push to a declared schema, not stacked migration files.)
14
+ Reconcile is **declarative, not a migration ladder.** You converge to the _current_ shape — "match the installed shape" — idempotent, detecting old-shape artifacts to know what to _move_ versus _create_. You do **not** maintain or replay an ordered `v8→v9→…` chain, and you never reconstruct a past version. (Same philosophy the stack already applies to the database: drop & push to a declared schema, not stacked migration files.)
15
15
 
16
16
  ## The two version layers (don't confuse them)
17
17
 
18
- - The **CLI** (`npx @nurix/etna --name=code`) refreshes the *engine* — `CLAUDE.md` + `.claude/{agents,skills,rules,scripts}/`. That is not your job; the install does it.
19
- - **You** reconcile the *repo's authored data* — the `docs/` tree — to match that engine.
18
+ - The **CLI** (`npx @nurix/etna --name=code`) refreshes the _engine_ — `CLAUDE.md` + `.claude/{agents,skills,rules,scripts}/`. That is not your job; the install does it.
19
+ - **You** reconcile the _repo's authored data_ — the `docs/` tree — to match that engine.
20
20
 
21
21
  The upgrade story is the two run back-to-back: install refreshes the engine → you reconcile the docs to it.
22
22
 
@@ -29,10 +29,10 @@ The upgrade story is the two run back-to-back: install refreshes the engine →
29
29
 
30
30
  These are different axes — keep them clean:
31
31
 
32
- - **`maintenance` audits docs-vs-code *fidelity*** — is the documented behavior *true* of the code? (stale docs, broken `owns` globs, routing drift). It edits docs for content accuracy.
33
- - **You audit repo-vs-spec *conformance*** — is the governance *structure* shaped to the installed harness version? (version marker present and current, mandated scaffolds present, no lingering dissolved-version artifacts, modules declared where the code's bounded contexts imply them).
32
+ - **`maintenance` audits docs-vs-code _fidelity_** — is the documented behavior _true_ of the code? (stale docs, broken `owns` globs, routing drift). It edits docs for content accuracy.
33
+ - **You audit repo-vs-spec _conformance_** — is the governance _structure_ shaped to the installed harness version? (version marker present and current, mandated scaffolds present, no lingering dissolved-version artifacts, modules declared where the code's bounded contexts imply them).
34
34
 
35
- You never edit a doc for content fidelity (that is `maintenance`); `maintenance` never reshapes the structure to a new version (that is you). Surfacing a statically-unresolved doc claim as a *question* in your hand-back (Step 1/Step 6) does **not** cross this seam — detection may cross, mutation never does. You observe and ask; you never assert falsity or fix the doc.
35
+ You never edit a doc for content fidelity (that is `maintenance`); `maintenance` never reshapes the structure to a new version (that is you). Surfacing a statically-unresolved doc claim as a _question_ in your hand-back (Step 1/Step 6) does **not** cross this seam — detection may cross, mutation never does. You observe and ask; you never assert falsity or fix the doc.
36
36
 
37
37
  ## Before starting
38
38
 
@@ -82,7 +82,7 @@ While reading each markdown doc to classify it, if the doc names a code symbol i
82
82
  This is what makes reconcile more than a fresh scaffold. Detect old-shape artifacts and fold them forward:
83
83
 
84
84
  | If you find (old shape) | Fold to (current shape) |
85
- |---|---|
85
+ | --- | --- |
86
86
  | `docs/operations/guardrails.md` | fold durable contract notes into `docs/architecture/` |
87
87
  | `docs/boundaries/` (legacy persisted boundaries) | delete — boundary analysis is a plan-time diagnostic (the `boundary` skill reads contracts fresh from source); fold any human-authored knowledge (external consumers, intent, accepted exceptions) into `docs/architecture/` |
88
88
  | repo-wide `docs/pillars/` | module-local `docs/modules/{m}/pillars/`; cross-module doctrine → `docs/architecture/` |
@@ -110,7 +110,7 @@ Write `harness-version: <installed epoch>` into `docs/structure.md` frontmatter.
110
110
 
111
111
  ### Step 5b — Register the qmd retrieval lens (optional, skip-if-absent)
112
112
 
113
- Strictly optional and guarded on the binary — if `command -v qmd` finds nothing, **skip this entire step silently** (no error, no behavior change) and carry one advisory line into the Step 6 hand-back: *"qmd not installed — semantic retrieval unavailable; glob routing active."* The index is a **local rebuildable lens** — data stays in git; never commit index artifacts, and never use `qmd init` (that writes a project-local `.qmd`; the default global index keeps the repo clean).
113
+ Strictly optional and guarded on the binary — if `command -v qmd` finds nothing, **skip this entire step silently** (no error, no behavior change) and carry one advisory line into the Step 6 hand-back: _"qmd not installed — semantic retrieval unavailable; glob routing active."_ The index is a **local rebuildable lens** — data stays in git; never commit index artifacts, and never use `qmd init` (that writes a project-local `.qmd`; the default global index keeps the repo clean).
114
114
 
115
115
  If the binary exists, register the docs subtrees once the tree is scaffolded. **Do not register one collection rooted at `docs/`** — qmd 2.5.3 hard-codes the `**/*.md` pattern (a custom positional glob is silently discarded) and has no `--ignore`/`--exclude` flag, so a `docs/`-root collection provably sweeps the consumable inbox queue at `docs/memory/inbox/` into the index. The inbox is **not** in scope (it is distilled into `memory/facts`, which is — and its entries are deleted on digestion, which would leave dangling index entries). Register one collection **per indexable subtree** instead — never `docs/memory` as a whole, only `docs/memory/facts` — so the inbox is excluded by construction:
116
116
 
@@ -130,12 +130,12 @@ This augments routing; it never supersedes the Step 6 ownership resolution.
130
130
 
131
131
  ### Step 6 — Module proposal
132
132
 
133
- Modules are *declared*, never inferred from physical layout. Derive the repo's candidate bounded contexts directly from the code and docs: distinct wire surfaces (who owns routes/handlers), schema/data-access ownership, entry points and process units, plus any contexts `docs/architecture/` or feature `owns` globs already name.
133
+ Modules are _declared_, never inferred from physical layout. Derive the repo's candidate bounded contexts directly from the code and docs: distinct wire surfaces (who owns routes/handlers), schema/data-access ownership, entry points and process units, plus any contexts `docs/architecture/` or feature `owns` globs already name.
134
134
 
135
135
  - Propose the derived contexts as candidate modules. For each, partition existing flat feature docs by `owns`-glob overlap.
136
136
  - **Propose — don't force.** Declaration is opt-in: a single-context app stays flat (so does a monolith whose contexts all share one kernel); declare `docs/modules/{m}/` only when the author accepts a context as a module. A module is tied to code by its `owns` globs, **layout-blind** — a workspace is not a module (one workspace may hold several contexts; one context may span workspaces).
137
137
 
138
- If Step 5b skipped because `qmd` was absent, carry its one advisory line into the hand-back — *"qmd not installed — semantic retrieval unavailable; glob routing active."* — advisory, never an error, never a gate.
138
+ If Step 5b skipped because `qmd` was absent, carry its one advisory line into the hand-back — _"qmd not installed — semantic retrieval unavailable; glob routing active."_ — advisory, never an error, never a gate.
139
139
 
140
140
  Re-running you is safe — the structure work is already done (idempotent), so a second pass is just the module proposal.
141
141
 
@@ -143,7 +143,7 @@ Re-running you is safe — the structure work is already done (idempotent), so a
143
143
 
144
144
  > - `docs/x.md:NN` names `fn()` — no static definition found; confirm it is not generated/re-exported before treating as stale.
145
145
 
146
- End the block with: *"NEXT (optional): run the maintenance agent to confirm or dismiss these — advisory, not a gate; baseline is complete regardless."* Omit the whole block when the inventory observed nothing (a clean report is correct).
146
+ End the block with: _"NEXT (optional): run the maintenance agent to confirm or dismiss these — advisory, not a gate; baseline is complete regardless."_ Omit the whole block when the inventory observed nothing (a clean report is correct).
147
147
 
148
148
  If the user **declines** the advisory rather than running the follow-up, record each declined item in `docs/history/backlog.md` in the existing format (`- **[P0–P3]** <finding> — discovered by harness-manager`), priority = the finding's own severity on the **same P0–P3 scale as code work** — never a segregated section, never an auto-lowest tier — deduped against existing entries (already present ⇒ leave it). A backlog line is a record, never a gate.
149
149
 
@@ -157,9 +157,9 @@ Confirm all mandated files exist; `structure.md` carries the current `harness-ve
157
157
 
158
158
  Conformance, not fidelity. Report a table; fix nothing destructively without asking.
159
159
 
160
- - **Version currency** — `harness-version` present in `structure.md` and equal to installed? If behind/absent → recommend Reconcile. (This is the *repo-vs-installed* gap — it self-heals once the consumer reinstalls and re-runs you. The next two checks catch what reinstall *hasn't* happened yet, or was bypassed by a hand-edit.)
161
- - **Published-version currency** *(advisory, network)* — the installed `.claude/harness.json` records the kit's `version`; the published kit may have moved past it. Attempt `npm view @nurix/etna version` (the kit is a restricted package — needs npm auth + network). **Guard:** on *any* failure — offline, no auth, npm absent, timeout — skip and report one line: *"couldn't check the published harness version — re-run `npx @nurix/etna --name=code` to refresh to the latest."* On success, compare the published version against `.claude/harness.json`'s `version`; if published is ahead, recommend re-running the CLI to pull the newer kit. Never a gate, never blocks.
162
- - **Kit build fingerprint (digest)** *(informational)* — `.claude/harness.json` carries a `digest`: a deterministic fingerprint of the exact kit **build** the consumer installed (`build-data` computes it over the shipped bundle). Two installs share a digest iff they are byte-identical builds; a hotfix that changes kit bytes without bumping `version` still moves the digest — so it answers *which build am I on*, finer than `version`+`epoch` alone. **Don't recompute it over `.claude/` to self-check:** the installed layout is a superset of the build (the project `CLAUDE.md` sits at the repo root, `.claude/` adds `settings.json`/`harness.json`/local rule files), so paths and file sets differ **by design** — a recompute would never match. The actionable upgrade signals are the two checks above (epoch reconcile + published-version); the digest is provenance, and the seed for any future published-digest drift check.
160
+ - **Version currency** — `harness-version` present in `structure.md` and equal to installed? If behind/absent → recommend Reconcile. (This is the _repo-vs-installed_ gap — it self-heals once the consumer reinstalls and re-runs you. The next two checks catch what reinstall _hasn't_ happened yet, or was bypassed by a hand-edit.)
161
+ - **Published-version currency** _(advisory, network)_ — the installed `.claude/harness.json` records the kit's `version`; the published kit may have moved past it. Attempt `npm view @nurix/etna version` (the kit is a restricted package — needs npm auth + network). **Guard:** on _any_ failure — offline, no auth, npm absent, timeout — skip and report one line: _"couldn't check the published harness version — re-run `npx @nurix/etna --name=code` to refresh to the latest."_ On success, compare the published version against `.claude/harness.json`'s `version`; if published is ahead, recommend re-running the CLI to pull the newer kit. Never a gate, never blocks.
162
+ - **Kit build fingerprint (digest)** _(informational)_ — `.claude/harness.json` carries a `digest`: a deterministic fingerprint of the exact kit **build** the consumer installed (`build-data` computes it over the shipped bundle). Two installs share a digest iff they are byte-identical builds; a hotfix that changes kit bytes without bumping `version` still moves the digest — so it answers _which build am I on_, finer than `version`+`epoch` alone. **Don't recompute it over `.claude/` to self-check:** the installed layout is a superset of the build (the project `CLAUDE.md` sits at the repo root, `.claude/` adds `settings.json`/`harness.json`/local rule files), so paths and file sets differ **by design** — a recompute would never match. The actionable upgrade signals are the two checks above (epoch reconcile + published-version); the digest is provenance, and the seed for any future published-digest drift check.
163
163
  - **Scaffold completeness** — every mandated file present.
164
164
  - **Dissolved-version residue** — any `operations/guardrails.md`, repo-wide `docs/pillars/`, `architecture/overview.md`, a persisted `docs/boundaries/` tree, or other old-shape artifact lingering.
165
165
  - **Module declaration coverage** — do the repo's bounded contexts have declared module homes where the author intended them? (Surface gaps; never auto-declare.)