@nurix/etna 0.19.24 → 0.19.26

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 (38) hide show
  1. package/README.md +21 -15
  2. package/bin/etna.js +3 -3
  3. package/data/harness-index.json +1 -1
  4. package/data/harnesses/code/CLAUDE.md +7 -6
  5. package/data/harnesses/code/agents/maintenance.md +3 -3
  6. package/data/harnesses/code/agents/retro.md +20 -19
  7. package/data/harnesses/code/codex/agents/maintenance.toml +5 -5
  8. package/data/harnesses/code/codex/agents/retro.toml +21 -19
  9. package/data/harnesses/code/harness.json +2 -2
  10. package/data/harnesses/code/rules/changelog.md +37 -0
  11. package/data/harnesses/code/skills/boundary/SKILL.md +1 -1
  12. package/data/harnesses/code/skills/brainstorm/SKILL.md +1 -2
  13. package/data/harnesses/code/skills/design/SKILL.md +1 -1
  14. package/data/harnesses/code/skills/documentation/SKILL.md +2 -3
  15. package/data/harnesses/code/skills/documentation/templates/changelog-entry.md +41 -46
  16. package/data/harnesses/code/skills/documentation/templates/structure.md +2 -4
  17. package/data/harnesses/code/skills/test-plan/SKILL.md +1 -1
  18. package/data/harnesses/code/skills/workflow-mapper/SKILL.md +1 -1
  19. package/data/harnesses/discussion/harness.json +1 -1
  20. package/data/harnesses/etna/CLAUDE.md +27 -1
  21. package/data/harnesses/etna/agents/maintenance.md +3 -3
  22. package/data/harnesses/etna/agents/retro.md +46 -0
  23. package/data/harnesses/etna/codex/agents/maintenance.toml +5 -5
  24. package/data/harnesses/etna/codex/agents/retro.toml +45 -0
  25. package/data/harnesses/etna/harness.json +2 -2
  26. package/data/harnesses/etna/rules/changelog.md +37 -0
  27. package/data/harnesses/etna/skills/boundary/SKILL.md +1 -1
  28. package/data/harnesses/etna/skills/brainstorm/SKILL.md +1 -2
  29. package/data/harnesses/etna/skills/documentation/SKILL.md +2 -3
  30. package/data/harnesses/etna/skills/documentation/templates/changelog-entry.md +41 -46
  31. package/data/harnesses/etna/skills/documentation/templates/structure.md +2 -4
  32. package/data/harnesses/etna/skills/workflow-mapper/SKILL.md +1 -1
  33. package/data/harnesses/hr/harness.json +2 -2
  34. package/data/harnesses/hr/skills/evaluator/SKILL.md +1 -1
  35. package/data/harnesses/hr/skills/interview-eval/SKILL.md +1 -1
  36. package/package.json +2 -2
  37. package/data/harnesses/code/skills/documentation/templates/refinement-ledger.md +0 -33
  38. package/data/harnesses/etna/skills/documentation/templates/refinement-ledger.md +0 -33
@@ -29,8 +29,7 @@ Each topic has one canonical location. Read from here, not from plans or changel
29
29
  | Environment / config surface | `docs/operations/` | environment.md |
30
30
  | Testing strategy | `docs/tests/` | strategy.md |
31
31
  | Historical plans | `docs/history/plans/` | YYYY-MM-DD-name.md |
32
- | Change records | `docs/history/changelog/` | Individual entries |
33
- | Refinement Ledger | `docs/history/ledger/` | YYYY-MM.md (append-only, written at commit time) |
32
+ | Change records | `docs/history/changelog/` | `YYYY-MM-DD-{three-words}.md` — one per unit of work, written at commit time |
34
33
  | Migration runbooks | `docs/history/migrations/` | YYYY-MM-DD-name.md |
35
34
  | Deep-research artifacts | `docs/history/research/{topic}/` | README.md + findings.md + sources.md |
36
35
  | Brainstorm design records | `docs/research/{topic}-brainstorm/` (active; legacy `-brainstorming/`) → `docs/history/brainstorms/{topic}/` (harvested; user deletes or commits) | thesis.md + forks.md + ledger.md + state.md |
@@ -51,8 +50,7 @@ Every doc is a **truth document** (states current absolutes, topic-named, update
51
50
  - `docs/operations/`: How-to procedures for setup, development, and deployment, plus the environment registry. Update when workflows change. One-shot migrations do NOT live here — they are records (`docs/history/migrations/`).
52
51
  - `docs/tests/`: Testing strategy and test docs. Present when the repo has a test posture worth documenting.
53
52
  - `docs/history/plans/`: Records. Must have `Status:` field. Never modify after completion.
54
- - `docs/history/changelog/`: Records. Append-only.
55
- - `docs/history/ledger/`: Records. The Refinement Ledger — an append-only per-commit refinement journal (monthly `YYYY-MM.md` files) written by the committing agent, each block staged inside the commit it describes; block format is the `documentation` skill's `templates/refinement-ledger.md`, distillation is the `retro` agent. Blocks are immutable — never edited, never reconciled; the folder is never scaffolded empty.
53
+ - `docs/history/changelog/`: Records. One entry per unit of work (`YYYY-MM-DD-{three-words}.md`), written by whoever does the work and frozen inside the commit it describes. Entries carry the refinement context a diff cannot show — the ask in the user's words, iterations and rejections, skill survived/overridden verdicts, discoveries, pins. Format is the `documentation` skill's `templates/changelog-entry.md`; trigger and lifecycle are the `changelog` rule; distillation is the `retro` agent. Immutability begins at commit — a draft in the working tree is mutable until then, never after. Every entry appends a row to `docs/history/CHANGELOG.md`.
56
54
  - `docs/history/migrations/`: Records. One-shot migration/upgrade runbooks — authored before execution, outcome-stamped and frozen after.
57
55
  - `docs/history/research/{topic}/`: Deep-research artifacts — the dumped output of a research pass, one folder per topic (conventionally `README.md` synthesis + `findings.md` verified claims & citations + `sources.md`). A point-in-time, cited record — **not** a living authority doc: it owns no code (no `owns:` frontmatter) and is never edited to "stay current." A spec/plan links to it for grounding; a new question gets a new topic folder.
58
56
  - `docs/research/{topic}-brainstorm/` → `docs/history/brainstorms/{topic}/`: Brainstorm design records — the Brainstorming-Mode session for a topic (working surface `thesis.md` + `forks.md` + `ledger.md` + `state.md` + `basis/` + `fragments/`, plus an untracked `ops/` capture layer deleted at stop), written by the `brainstorm` skill and its twin agent. An active session lives under `docs/research/` (legacy folders carry the older `-brainstorming/` suffix); on a **passed harvest** it **moves** to `docs/history/brainstorms/` — the completion marker — and the **user decides whether the moved folder is deleted or committed** as provenance. Each of the two folders carries a `Readme.md` index (the skill reads it at start instead of scanning). Author-created (never scaffolded empty), one folder per design conversation. Owns no code (no `owns:` frontmatter); the harvest routes its conclusions into `architecture/`/`features/`/`history/`. (Distinct from `docs/history/research/{topic}/` above — that is a frozen deep-research record, not a brainstorm session.)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: workflow-mapper
3
- description: "Discover and document a codebase's major workflows by tracing call chains from user action to database or external system — produces mermaid sequence diagrams and markdown. Triggers on 'map workflows', 'trace flows', 'sequence diagram', or 'how does X work end-to-end'."
3
+ description: "Use when mapping a codebase's major workflows — traces call chains from user action to database or external system and produces mermaid sequence diagrams + markdown. Triggers on 'map workflows', 'trace flows', 'sequence diagram', 'how does X work end-to-end'."
4
4
  ---
5
5
 
6
6
  # Workflow Mapper Skill
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "harness": "hr",
3
3
  "name": "hr",
4
- "version": "0.1.9",
4
+ "version": "0.1.10",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
8
8
  ".vscode/settings.json"
9
9
  ],
10
- "digest": "ddd603da8a04"
10
+ "digest": "b9e1f9989578"
11
11
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: evaluator
3
- description: "Apply a production-readiness + product-quality rubric to a single software project. Takes a repo + output dir; writes a per-project workspace (README, `scorecard.yaml`, flat `raw/`) scoring 8 sub-criteria (4 Code + 4 Product) to /100 with evidence and gates. Scores one project, no cohort."
3
+ description: "Use when scoring a single software project for production-readiness + product quality. Takes a repo + output dir; writes a per-project workspace (README, `scorecard.yaml`, flat `raw/`) scoring 8 sub-criteria (4 Code + 4 Product) to /100 with evidence and gates. One project, no cohort."
4
4
  ---
5
5
 
6
6
  # Evaluator
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: interview-eval
3
- description: "Score how a human steered a Claude Code session — prompting, decomposition, verification, debugging, judgment — from `.jsonl` transcripts. For interview/hiring assessment of engineers using AI coding agents; writes a per-session report + scorecard plus a rollup. Judges the human, not the code."
3
+ description: "Use when assessing how a human steered a Claude Code session — prompting, decomposition, verification, debugging, judgment — from `.jsonl` transcripts. For interview/hiring of engineers using AI coding agents; writes a per-session report + scorecard plus a rollup. Judges the human, not the code."
4
4
  ---
5
5
 
6
6
  # interview-eval
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nurix/etna",
3
- "version": "0.19.24",
3
+ "version": "0.19.26",
4
4
  "description": "Bootstrap a project with a Nurix harness — copies the harness's CLAUDE.md, skills, agents, rules, and hooks directly into the project from a bundled payload (no marketplace fetch, no network).",
5
5
  "type": "module",
6
6
  "bin": {
@@ -31,7 +31,7 @@
31
31
  "homepage": "https://github.com/nurixlabs/etna/tree/dev/packages/cli",
32
32
  "license": "UNLICENSED",
33
33
  "publishConfig": {
34
- "access": "restricted"
34
+ "access": "public"
35
35
  },
36
36
  "keywords": [
37
37
  "claude",
@@ -1,33 +0,0 @@
1
- # Refinement Ledger
2
-
3
- Record. Use for: the append-only per-commit journal of session refinement — one block per non-mechanical commit, written by the committing agent at commit time and staged **inside the commit it describes**. Blocks are immutable once committed: never edited, renumbered, or reconciled; a correction is a new block referencing the old. The ledger is exempt from doc-health passes by genre — it is history and can never be "wrong".
4
-
5
- Monthly files: `docs/history/ledger/YYYY-MM.md`, created on first block — the folder is never scaffolded empty. Distillation is the `retro` agent's job; this template owns only the capture format.
6
-
7
- ## Block format
8
-
9
- ```
10
- ### {YYYY-MM-DD} · {surface} — {one-line outcome}
11
- - **Ask:** {what the user asked, compressed — taste and preference statements quoted verbatim}
12
- - **Iterations:** {N} · rejected: {what was rejected and why} | none
13
- - **Skills:** {skill}@{version} — survived | partially survived | overridden ({why, briefly}) | none used
14
- - **Change:** {added/changed X, which does Y, because Z — behavior first, mechanism second}
15
- - **Discovered:** {non-obvious fact learned by running the product — environment quirk, platform ceiling, seam behavior, dependency constraint} | none
16
- - **Class:** {one or more keywords — suggestive vocabulary, not a closed enum; see Field rules}
17
- - **Pin:** {enforced artifact written in this commit: test / token / guardrail / schema} | none — candidate: {what should hold it}
18
- ```
19
-
20
- ## Field rules
21
-
22
- - **Every field present; "none" stated explicitly.** An absent field is a template violation. Sessions assert success by default — the required `rejected:` and `overridden` entries are the counterweight; an honestly empty failure field is information too.
23
- - **`surface`** uses the repo's ownership vocabulary — the owning feature doc's topic or an `owns:` path stem — so the ledger is queryable per surface.
24
- - **`Ask` quotes taste verbatim.** The user's preference wording is the one thing no skill can infer and no rebuild recovers; the ledger is its durable home.
25
- - **`Skills` records efficacy honestly** — survived / partially survived / overridden with a reason. These verdicts are the raw data the `retro` agent aggregates into skill-evolution findings; sanitizing them into success stories destroys the mechanism's value.
26
- - **`Discovered` holds what only running the product teaches.** If it was learned in use, it is recorded here the same day — this field feeds the pin candidates.
27
- - **`Class` is a suggestive vocabulary, not a closed enum.** Tag with one or more keywords, preferring an existing term over a synonym so the `retro` agent can cluster; coin a new one when nothing fits — a recurring coinage is itself retro signal that the vocabulary (or the doc set) is missing a category. Suggested keywords: `ux` · `ui` · `visual` · `taste` · `layout` · `motion` · `interaction` · `copy` · `a11y` · `responsiveness` · `navigation` · `state` · `structure` · `architecture` · `seam` · `contract` · `schema` · `data` · `content` · `seed` · `performance` · `caching` · `resilience` · `error-handling` · `security` · `auth` · `observability` · `logging` · `testing` · `tooling` · `dependency` · `ops` · `deploy` · `env` · `ci` · `i18n` · `docs`.
28
- - **`Pin` closes the loop:** the enforced artifact written in this commit, or the named candidate for the `retro` agent to flag. A taste-verified behavior with `Pin: none` and no candidate is a template smell.
29
- - **Out-of-session commits** (the committing session did not do the work): fill what the diff and conversation evidence support; mark the rest `unknown — committed out-of-session`.
30
-
31
- ## Exemptions (closed list)
32
-
33
- No block for: release/bot commits, harness installs and bumps, lockfile-only changes, pure renames/moves, and ledger housekeeping itself. Everything else gets a block, however short.
@@ -1,33 +0,0 @@
1
- # Refinement Ledger
2
-
3
- Record. Use for: the append-only per-commit journal of session refinement — one block per non-mechanical commit, written by the committing agent at commit time and staged **inside the commit it describes**. Blocks are immutable once committed: never edited, renumbered, or reconciled; a correction is a new block referencing the old. The ledger is exempt from doc-health passes by genre — it is history and can never be "wrong".
4
-
5
- Monthly files: `docs/history/ledger/YYYY-MM.md`, created on first block — the folder is never scaffolded empty. Distillation is the `retro` agent's job; this template owns only the capture format.
6
-
7
- ## Block format
8
-
9
- ```
10
- ### {YYYY-MM-DD} · {surface} — {one-line outcome}
11
- - **Ask:** {what the user asked, compressed — taste and preference statements quoted verbatim}
12
- - **Iterations:** {N} · rejected: {what was rejected and why} | none
13
- - **Skills:** {skill}@{version} — survived | partially survived | overridden ({why, briefly}) | none used
14
- - **Change:** {added/changed X, which does Y, because Z — behavior first, mechanism second}
15
- - **Discovered:** {non-obvious fact learned by running the product — environment quirk, platform ceiling, seam behavior, dependency constraint} | none
16
- - **Class:** {one or more keywords — suggestive vocabulary, not a closed enum; see Field rules}
17
- - **Pin:** {enforced artifact written in this commit: test / token / guardrail / schema} | none — candidate: {what should hold it}
18
- ```
19
-
20
- ## Field rules
21
-
22
- - **Every field present; "none" stated explicitly.** An absent field is a template violation. Sessions assert success by default — the required `rejected:` and `overridden` entries are the counterweight; an honestly empty failure field is information too.
23
- - **`surface`** uses the repo's ownership vocabulary — the owning feature doc's topic or an `owns:` path stem — so the ledger is queryable per surface.
24
- - **`Ask` quotes taste verbatim.** The user's preference wording is the one thing no skill can infer and no rebuild recovers; the ledger is its durable home.
25
- - **`Skills` records efficacy honestly** — survived / partially survived / overridden with a reason. These verdicts are the raw data the `retro` agent aggregates into skill-evolution findings; sanitizing them into success stories destroys the mechanism's value.
26
- - **`Discovered` holds what only running the product teaches.** If it was learned in use, it is recorded here the same day — this field feeds the pin candidates.
27
- - **`Class` is a suggestive vocabulary, not a closed enum.** Tag with one or more keywords, preferring an existing term over a synonym so the `retro` agent can cluster; coin a new one when nothing fits — a recurring coinage is itself retro signal that the vocabulary (or the doc set) is missing a category. Suggested keywords: `ux` · `ui` · `visual` · `taste` · `layout` · `motion` · `interaction` · `copy` · `a11y` · `responsiveness` · `navigation` · `state` · `structure` · `architecture` · `seam` · `contract` · `schema` · `data` · `content` · `seed` · `performance` · `caching` · `resilience` · `error-handling` · `security` · `auth` · `observability` · `logging` · `testing` · `tooling` · `dependency` · `ops` · `deploy` · `env` · `ci` · `i18n` · `docs`.
28
- - **`Pin` closes the loop:** the enforced artifact written in this commit, or the named candidate for the `retro` agent to flag. A taste-verified behavior with `Pin: none` and no candidate is a template smell.
29
- - **Out-of-session commits** (the committing session did not do the work): fill what the diff and conversation evidence support; mark the rest `unknown — committed out-of-session`.
30
-
31
- ## Exemptions (closed list)
32
-
33
- No block for: release/bot commits, harness installs and bumps, lockfile-only changes, pure renames/moves, and ledger housekeeping itself. Everything else gets a block, however short.