@nurix/etna 0.19.20 → 0.19.22
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.
- package/data/harness-index.json +1 -1
- package/data/harnesses/code/.prettierignore +6 -0
- package/data/harnesses/code/CLAUDE.md +15 -14
- package/data/harnesses/code/agents/maintenance.md +1 -1
- package/data/harnesses/code/codex/agents/maintenance.toml +1 -1
- package/data/harnesses/code/harness.json +2 -2
- package/data/harnesses/code/skills/boundary/SKILL.md +1 -1
- package/data/harnesses/code/skills/brainstorm/SKILL.md +1 -1
- package/data/harnesses/code/skills/documentation/SKILL.md +64 -107
- package/data/harnesses/code/skills/documentation/references/examples.md +83 -7
- package/data/harnesses/code/skills/documentation/references/frontmatter.md +44 -0
- package/data/harnesses/code/skills/documentation/references/style-guide.md +44 -19
- package/data/harnesses/code/skills/documentation/references/untemplated.md +38 -0
- package/data/harnesses/code/skills/documentation/scripts/doc-lint.mjs +117 -0
- package/data/harnesses/code/skills/documentation/templates/Readme.md +31 -0
- package/data/harnesses/code/skills/documentation/templates/api-reference.md +20 -0
- package/data/harnesses/code/skills/documentation/templates/architecture-decision.md +121 -0
- package/data/harnesses/code/skills/documentation/templates/backlog.md +33 -0
- package/data/harnesses/code/skills/documentation/templates/changelog-entry.md +62 -0
- package/data/harnesses/code/skills/documentation/templates/changelog-index.md +41 -0
- package/data/harnesses/code/skills/documentation/templates/docs-readme.md +70 -0
- package/data/harnesses/code/skills/documentation/templates/domain-model.md +30 -0
- package/data/harnesses/code/skills/documentation/templates/environment-registry.md +15 -0
- package/data/harnesses/code/skills/documentation/templates/feature.md +149 -0
- package/data/harnesses/code/skills/documentation/templates/glossary.md +11 -0
- package/data/harnesses/code/skills/documentation/templates/memory-main.md +25 -0
- package/data/harnesses/code/skills/documentation/templates/migration-runbook.md +34 -0
- package/data/harnesses/code/skills/documentation/templates/non-goals.md +11 -0
- package/data/harnesses/code/skills/documentation/templates/operations-procedure.md +36 -0
- package/data/harnesses/code/skills/documentation/templates/plan.md +64 -0
- package/data/harnesses/code/skills/documentation/templates/protected-files.md +37 -0
- package/data/harnesses/code/skills/documentation/templates/root-readme.md +104 -0
- package/data/harnesses/code/skills/documentation/templates/security-overview.md +27 -0
- package/data/harnesses/code/skills/documentation/templates/structure.md +65 -0
- package/data/harnesses/code/skills/documentation/templates/system-overview.md +32 -0
- package/data/harnesses/code/skills/documentation/templates/testing-strategy.md +29 -0
- package/data/harnesses/code/skills/workflow-mapper/SKILL.md +1 -1
- package/data/harnesses/discover/.prettierignore +6 -0
- package/data/harnesses/discover/CLAUDE.md +11 -12
- package/data/harnesses/discover/harness.json +2 -2
- package/data/harnesses/discover/tooling-recommendations.md +10 -10
- package/data/harnesses/discussion/.prettierignore +6 -0
- package/data/harnesses/discussion/harness.json +1 -1
- package/data/harnesses/etna/.prettierignore +6 -0
- package/data/harnesses/etna/CLAUDE.md +12 -11
- package/data/harnesses/etna/agents/maintenance.md +1 -1
- package/data/harnesses/etna/codex/agents/maintenance.toml +1 -1
- package/data/harnesses/etna/harness.json +2 -2
- package/data/harnesses/etna/skills/boundary/SKILL.md +1 -1
- package/data/harnesses/etna/skills/brainstorm/SKILL.md +1 -1
- package/data/harnesses/etna/skills/documentation/SKILL.md +64 -107
- package/data/harnesses/etna/skills/documentation/references/examples.md +83 -7
- package/data/harnesses/etna/skills/documentation/references/frontmatter.md +44 -0
- package/data/harnesses/etna/skills/documentation/references/style-guide.md +44 -19
- package/data/harnesses/etna/skills/documentation/references/untemplated.md +38 -0
- package/data/harnesses/etna/skills/documentation/scripts/doc-lint.mjs +117 -0
- package/data/harnesses/etna/skills/documentation/templates/Readme.md +31 -0
- package/data/harnesses/etna/skills/documentation/templates/api-reference.md +20 -0
- package/data/harnesses/etna/skills/documentation/templates/architecture-decision.md +121 -0
- package/data/harnesses/etna/skills/documentation/templates/backlog.md +33 -0
- package/data/harnesses/etna/skills/documentation/templates/changelog-entry.md +62 -0
- package/data/harnesses/etna/skills/documentation/templates/changelog-index.md +41 -0
- package/data/harnesses/etna/skills/documentation/templates/docs-readme.md +70 -0
- package/data/harnesses/etna/skills/documentation/templates/domain-model.md +30 -0
- package/data/harnesses/etna/skills/documentation/templates/environment-registry.md +15 -0
- package/data/harnesses/etna/skills/documentation/templates/feature.md +149 -0
- package/data/harnesses/etna/skills/documentation/templates/glossary.md +11 -0
- package/data/harnesses/etna/skills/documentation/templates/memory-main.md +25 -0
- package/data/harnesses/etna/skills/documentation/templates/migration-runbook.md +34 -0
- package/data/harnesses/etna/skills/documentation/templates/non-goals.md +11 -0
- package/data/harnesses/etna/skills/documentation/templates/operations-procedure.md +36 -0
- package/data/harnesses/etna/skills/documentation/templates/plan.md +64 -0
- package/data/harnesses/etna/skills/documentation/templates/protected-files.md +37 -0
- package/data/harnesses/etna/skills/documentation/templates/root-readme.md +104 -0
- package/data/harnesses/etna/skills/documentation/templates/security-overview.md +27 -0
- package/data/harnesses/etna/skills/documentation/templates/structure.md +65 -0
- package/data/harnesses/etna/skills/documentation/templates/system-overview.md +32 -0
- package/data/harnesses/etna/skills/documentation/templates/testing-strategy.md +29 -0
- package/data/harnesses/etna/skills/workflow-mapper/SKILL.md +1 -1
- package/data/harnesses/hr/.prettierignore +6 -0
- package/data/harnesses/hr/CLAUDE.md +19 -23
- package/data/harnesses/hr/harness.json +2 -2
- package/data/harnesses/hr/skills/evaluator/SKILL.md +1 -1
- package/data/harnesses/hr/skills/interview-eval/SKILL.md +1 -1
- package/data/harnesses/kb-agi/.prettierignore +6 -0
- package/data/harnesses/kb-agi/CLAUDE.md +12 -12
- package/data/harnesses/kb-agi/harness.json +1 -1
- package/package.json +1 -1
- package/data/harnesses/code/skills/documentation/references/templates.md +0 -1091
- package/data/harnesses/etna/skills/documentation/references/templates.md +0 -1091
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# hr — AI-Steering Evaluation harness
|
|
2
2
|
|
|
3
|
-
This repo evaluates **how a person steered a Claude Code session** — for interview and hiring assessment.
|
|
3
|
+
This repo evaluates **how a person steered a Claude Code session** — for interview and hiring assessment. The harness reads session transcripts (`.jsonl`) and produces a calibrated, evidence-anchored read on the candidate's ability to drive an AI coding agent.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The work is the `interview-eval` skill (its `rubric.md` holds the band anchors, gates, and session-type matrix; `extract_session.py` is the deterministic extractor; `TEMPLATE.md` holds the output shapes). This `CLAUDE.md` is the **policy** over that skill: the pipeline, the discipline that keeps scores honest, and the standing prohibitions.
|
|
6
6
|
|
|
7
|
-
## Two
|
|
7
|
+
## Two evaluation modes
|
|
8
8
|
|
|
9
|
-
Pick the mode from what the user hands
|
|
9
|
+
Pick the mode from what the user hands over:
|
|
10
10
|
|
|
11
11
|
- **Session steering** (`.jsonl` transcripts) — score how the candidate drove the agent. That is the `interview-eval` skill and the pipeline below; it is the default and the bulk of this file.
|
|
12
12
|
- **Code-project quality** (one or more repos / paths) — score the project the candidate produced. For a *set* of projects, follow the **`code-eval-batcher`** rule (it fans the `evaluator` skill across them and ranks the result); for a single project, invoke the `evaluator` skill directly. The session-steering discipline below does not apply to this mode — the skill and the rule are self-contained.
|
|
@@ -15,13 +15,13 @@ Pick the mode from what the user hands you:
|
|
|
15
15
|
|
|
16
16
|
## The one rule above all others
|
|
17
17
|
|
|
18
|
-
**
|
|
18
|
+
**Score the human, not the model.** Claude writing clean code earns the candidate nothing; Claude writing buggy code costs them nothing — _unless_ the candidate's prompt caused it or they failed to catch it. Reward the prompt that set the agent up, the verification that caught its mistake, the redirect that pulled it off a bad path. Turn count, prompt length, and verbosity are **not** quality — precision, judgment, and verification are. Re-read this before every scoring pass.
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
22
|
## Step 0 — first run
|
|
23
23
|
|
|
24
|
-
If the `interview-eval` skill isn't resolvable (no `.claude/skills/interview-eval/`), this project isn't set up — tell the user to run `npx --yes @nurix/etna --name=hr` (or point
|
|
24
|
+
If the `interview-eval` skill isn't resolvable (no `.claude/skills/interview-eval/`), this project isn't set up — tell the user to run `npx --yes @nurix/etna --name=hr` (or point at an existing copy of the skill) before continuing. Confirm `python3` is on PATH; the extractor is stdlib-only and needs nothing else.
|
|
25
25
|
|
|
26
26
|
## Step 1 — intake interview
|
|
27
27
|
|
|
@@ -35,35 +35,31 @@ Keep it to those. Carry the answers forward; don't re-interview per session.
|
|
|
35
35
|
|
|
36
36
|
## Step 2 — run the pipeline (delegate to `interview-eval`)
|
|
37
37
|
|
|
38
|
-
For each candidate, invoke the `interview-eval` skill. It owns the mechanics;
|
|
38
|
+
For each candidate, invoke the `interview-eval` skill. It owns the mechanics; this policy drives it and holds the discipline below. The flow it runs:
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
Classify
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
│ → <out_dir>/<slug>/{report.md, scorecard.yaml}
|
|
47
|
-
Roll up → if >1 session: dimension trends + consistency + one calibrated level
|
|
48
|
-
→ <out_dir>/candidate-rollup.md
|
|
49
|
-
```
|
|
40
|
+
| Step | Mechanics | Output |
|
|
41
|
+
| --- | --- | --- |
|
|
42
|
+
| **Extract** | `python3 extract_session.py SESSION.jsonl --out <out_dir>/<slug>/ --json` — read the FULL evidence pack before scoring; open raw `.jsonl` around any quoted turn | evidence pack in `<out_dir>/<slug>/` |
|
|
43
|
+
| **Classify** | dominant session type (greenfield / feature / debugging / refactor / ops / research / review) | which dimensions are primary / secondary / N/A |
|
|
44
|
+
| **Score** | 9 dimensions × 0–5 absolute bands, ≥2 quoted turn cites each; gates; green flags | `<out_dir>/<slug>/{report.md, scorecard.yaml}` |
|
|
45
|
+
| **Roll up** | if >1 session: dimension trends + consistency + one calibrated level | `<out_dir>/candidate-rollup.md` |
|
|
50
46
|
|
|
51
47
|
After the rollup, **always produce a one-page candidate brief** (verdict + level, the standout evidence, the single biggest risk, and 3–4 interview follow-ups that would confirm or kill that risk). That brief is the deliverable a hiring manager reads first.
|
|
52
48
|
|
|
53
49
|
## Step 3 — calibration discipline (non-negotiable)
|
|
54
50
|
|
|
55
51
|
- **Evidence or it didn't happen.** Every band cites real `U<n>` turns with short verbatim quotes. "Seems thorough" is not a finding.
|
|
56
|
-
- **Absolute bands, not a curve.** Score each session against `rubric.md`'s anchors. With multiple candidates
|
|
52
|
+
- **Absolute bands, not a curve.** Score each session against `rubric.md`'s anchors. With multiple candidates, relative ranking may be _reported_ — but each band is assigned absolutely.
|
|
57
53
|
- **Exclude harness noise.** API 529s / connection drops are Anthropic-side — never penalize them. Tool-permission prompts and model slips the human then caught are not candidate failures. Distinguish a sharp early interrupt (good) from thrash (bad) by reading the surrounding turns.
|
|
58
54
|
- **Gates require human direction.** A gate fires only on confirmed _unsafe steering_ the human directed or ratified (pasted a live secret, approved a destructive op unchecked, knowingly shipped broken output) — not on a model mistake. Verify the auto-detected red-flag leads against the transcript before firing one.
|
|
59
55
|
- **Charity with a spine.** Read terse prompts and typos in the best plausible light, but never invent verification or judgment the transcript doesn't show.
|
|
60
56
|
|
|
61
|
-
##
|
|
57
|
+
## Standing prohibitions
|
|
62
58
|
|
|
63
|
-
- **
|
|
64
|
-
- **
|
|
65
|
-
- **
|
|
66
|
-
- **
|
|
59
|
+
- **The hire decision stays with the human.** The output is a level and a brief; frame the level as a calibrated lens, never a verdict.
|
|
60
|
+
- **Source transcripts are never mutated.** The skill is read-only over `.jsonl`; writes land only in `out_dir`.
|
|
61
|
+
- **Claude's code quality is never scored as the candidate's.** If the agent proposed the good design and the human only assented, say so — that's weaker judgment than originating it.
|
|
62
|
+
- **A score is never fabricated from thin evidence.** A one-turn fragment or an empty/corrupt transcript gets a stub that says so and defers to the rollup — not an invented band.
|
|
67
63
|
|
|
68
64
|
Every output lands under `out_dir` and is plain markdown/YAML — reviewable, quotable, and reversible.
|
|
69
65
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: evaluator
|
|
3
|
-
description: Apply a
|
|
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."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Evaluator
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: interview-eval
|
|
3
|
-
description:
|
|
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."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# interview-eval
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Knowledge vault — router
|
|
2
2
|
|
|
3
|
-
This repo is a flat Obsidian vault
|
|
3
|
+
This repo is a flat Obsidian vault, read on the reader's behalf. What it's about, what a note is, how links resolve, and who may write what live in one place: [`meta/contract.md`](meta/contract.md) — read it before writing anything. This file is the **router**: establish what brings the user, then follow the **ask** path (read the vault and answer) or the **contribute** path (help them add to it).
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## Step 0 — first run
|
|
8
8
|
|
|
9
|
-
If `meta/contract.md` is missing, the vault isn't initialized. Conduct the **identity interview**
|
|
9
|
+
If `meta/contract.md` is missing, the vault isn't initialized. Conduct the **identity interview** in the main session with `AskUserQuestion` (the agents can't ask questions):
|
|
10
10
|
|
|
11
11
|
1. What is this vault called, and what is it about? (one sentence)
|
|
12
12
|
2. Who reads it? Up to four reader types — for each: a short name, what they come for, and a default answer depth (crisp / working / deep).
|
|
@@ -20,8 +20,8 @@ Then dispatch the **kb-init** agent with the answers verbatim, and continue once
|
|
|
20
20
|
|
|
21
21
|
Establish two things from the **first message** when it already says them; interview only for what's missing:
|
|
22
22
|
|
|
23
|
-
- **Path.** A question → *ask*. Something to add ("here are my notes from…", "we decided X") → *contribute*. A blank arrival ("hi", just looking around) → ask both questions with `AskUserQuestion`: what brings
|
|
24
|
-
- **Genre** is a soft prior on the reader, never a gate: consult the matching `meta/genres/` template when
|
|
23
|
+
- **Path.** A question → *ask*. Something to add ("here are my notes from…", "we decided X") → *contribute*. A blank arrival ("hi", just looking around) → ask both questions with `AskUserQuestion`: what brings them (ask / contribute), and which reader type from `meta/genres/` fits.
|
|
24
|
+
- **Genre** is a soft prior on the reader, never a gate: consult the matching `meta/genres/` template when the genre is known, use plain working depth when it isn't, and ask at most once — only when the depth of the answer genuinely turns on it.
|
|
25
25
|
|
|
26
26
|
Carry both through the session; don't re-interview on follow-ups.
|
|
27
27
|
|
|
@@ -29,34 +29,34 @@ Carry both through the session; don't re-interview on follow-ups.
|
|
|
29
29
|
|
|
30
30
|
## The ask path — read-only
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
The only write on this path is the session log. **Never edit a note.**
|
|
33
33
|
|
|
34
34
|
1. **Enter** via [`meta/index.md`](meta/index.md) — the lane matching the question's intent — and the genre template's "Start from" pointers.
|
|
35
35
|
2. **Search before declaring anything missing.** Grep the whole vault for the question's terms. Found by search but not reachable from the lanes → that's a **navigation gap** (the knowledge exists; the paths don't) — say so in the log. Truly absent → a **content gap**.
|
|
36
|
-
3. **Traverse** the `[[wikilinks]]` both ways — up toward summaries, down into detail. Lead with `canonical` notes; `canonical: false` is background. A `visibility: hidden` note may inform
|
|
36
|
+
3. **Traverse** the `[[wikilinks]]` both ways — up toward summaries, down into detail. Lead with `canonical` notes; `canonical: false` is background. A `visibility: hidden` note may inform an answer only with explicit disclosure — never present it as the vault's position to an external-facing reader.
|
|
37
37
|
4. **Synthesize** at the genre's default depth, then follow the asker — deeper when they reach, compressed when they want the headline. Depth shapes the answer, never which notes exist.
|
|
38
38
|
5. **Cite** the notes used. Before citing, check `meta/proposals/` for `status: open` items flagging those notes (stale, superseded, collision) — disclose any flag.
|
|
39
|
-
6. **Log the session** to `meta/sessions/` per its README — honestly, including whether
|
|
39
|
+
6. **Log the session** to `meta/sessions/` per its README — honestly, including whether the vault could answer. Only a search-verified miss is logged as a gap.
|
|
40
40
|
|
|
41
|
-
If the vault can't answer, say so plainly and log it. Never invent an answer the notes don't support
|
|
41
|
+
If the vault can't answer, say so plainly and log it. **Never invent an answer the notes don't support.**
|
|
42
42
|
|
|
43
43
|
**"Where is the knowledge gap?"** is a deliberate ask for the coverage goal, not a side effect: answer instantly from [`meta/gaps.md`](meta/gaps.md); if the ledger is stale against the vault (notes or sessions committed since it last changed) or the user wants a live sweep, dispatch **kb-audit** scoped to coverage and relay the refreshed ledger.
|
|
44
44
|
|
|
45
45
|
## The contribute path — the human steers
|
|
46
46
|
|
|
47
|
-
The user is adding knowledge.
|
|
47
|
+
The user is adding knowledge. Drafting and placement happen here; the human decides. Every write is theirs, and every write is a git commit.
|
|
48
48
|
|
|
49
49
|
1. **Orient** with `meta/contract.md` (the note model, where things belong) and the target folder's `Readme.md`. For "what does the vault want next?", read `meta/gaps.md` and any unprocessed session logs.
|
|
50
50
|
2. **Check for a rival before placing.** Search for an existing note on the topic. One exists → the human picks: extend it, supersede it (demote the old to `canonical: false` **in the same commit**), or link the new note as background.
|
|
51
|
-
3. **Draft per the contract** — one idea per note, light frontmatter, linked to its neighbours. Links form
|
|
51
|
+
3. **Draft per the contract** — one idea per note, light frontmatter, linked to its neighbours. Links form during drafting.
|
|
52
52
|
|
|
53
53
|
---
|
|
54
54
|
|
|
55
55
|
## Upkeep — deliberate, never a side effect
|
|
56
56
|
|
|
57
57
|
- **kb-audit** (six goals: coverage, descriptions, freshness, graph, entrances, shape) audits and writes a **proposal** to `meta/proposals/` plus the gap ledger — never canon. Run it when asked, whole or scoped.
|
|
58
|
-
- **kb-apply** executes exactly one human-reviewed proposal — the only agent that writes canon. Never run it unprompted
|
|
59
|
-
- The derived graph `meta/_derived/graph.json` is regenerated by `node .claude/scripts/kb-export.mjs` — never hand-edited, by
|
|
58
|
+
- **kb-apply** executes exactly one human-reviewed proposal — the only agent that writes canon. **Never run it unprompted.**
|
|
59
|
+
- The derived graph `meta/_derived/graph.json` is regenerated by `node .claude/scripts/kb-export.mjs` — never hand-edited, by anyone.
|
|
60
60
|
|
|
61
61
|
Everything is git-checked-in: any write is reviewable and reversible. When anything here seems to conflict with `meta/contract.md`, the contract wins.
|
|
62
62
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nurix/etna",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.22",
|
|
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": {
|