harnessed 4.4.0 → 4.5.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.
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  // package.json
2
2
  var package_default = {
3
- version: "4.4.0"};
3
+ version: "4.5.1"};
4
4
 
5
5
  // src/index.ts
6
6
  var VERSION = package_default.version;
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/index.ts"],"names":[],"mappings":";AAAA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,OAgGb,CAAA;;;AC7FO,IAAM,UAAU,eAAA,CAAI","file":"index.mjs","sourcesContent":["{\n \"name\": \"harnessed\",\n \"version\": \"4.4.0\",\n \"description\": \"AI coding harness package manager + composition orchestrator\",\n \"type\": \"module\",\n \"license\": \"Apache-2.0\",\n \"author\": \"easyinplay\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/easyinplay/harnessed.git\"\n },\n \"homepage\": \"https://github.com/easyinplay/harnessed#readme\",\n \"bugs\": \"https://github.com/easyinplay/harnessed/issues\",\n \"keywords\": [\n \"claude-code\",\n \"ai-harness\",\n \"package-manager\",\n \"composition\",\n \"skill-pack\",\n \"mcp\",\n \"orchestrator\"\n ],\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"packageManager\": \"pnpm@10.12.0\",\n \"bin\": {\n \"harnessed\": \"./dist/cli.mjs\"\n },\n \"main\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"default\": \"./dist/index.mjs\"\n },\n \"./schemas\": {\n \"types\": \"./dist/schemas/index.d.ts\",\n \"import\": \"./dist/schemas/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"manifests\",\n \"messages\",\n \"workflows\",\n \"routing\",\n \"config-templates\",\n \"schemas\",\n \"README.md\",\n \"LICENSE\",\n \"NOTICE\",\n \"THIRD-PARTY-NOTICES.md\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsc --noEmit && tsup\",\n \"build:schema\": \"node ./scripts/build-schema.mjs\",\n \"validate:schema\": \"node ./scripts/validate-schema.mjs\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run --passWithNoTests\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage --passWithNoTests\",\n \"bench\": \"vitest bench --run\",\n \"lint\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"format\": \"biome format --write .\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"0.3.142\",\n \"@clack/prompts\": \"^0.10.1\",\n \"@sinclair/typebox\": \"^0.34.49\",\n \"ajv\": \"^8.20.0\",\n \"ajv-errors\": \"^3.0.0\",\n \"ajv-formats\": \"^3.0.1\",\n \"commander\": \"^13.0.0\",\n \"diff\": \"^9.0.0\",\n \"expr-eval\": \"^2.0.2\",\n \"picocolors\": \"^1.1.1\",\n \"proper-lockfile\": \"^4.1.2\",\n \"yaml\": \"^2.9.0\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.0.0\",\n \"@types/node\": \"^22.10.0\",\n \"@types/proper-lockfile\": \"^4.1.4\",\n \"@vitest/coverage-v8\": \"^4.0.0\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.6.0\",\n \"vitest\": \"^4.0.0\"\n },\n \"pnpm\": {\n \"onlyBuiltDependencies\": [\n \"esbuild\"\n ]\n }\n}\n","// Main library entry — re-exports public APIs.\n// phase 1.1 batch 1: skeleton only; schema validator wired in batch 2 (T3+).\n\nimport pkg from '../package.json' with { type: 'json' }\n\nexport const VERSION = pkg.version\n"]}
1
+ {"version":3,"sources":["../package.json","../src/index.ts"],"names":[],"mappings":";AAAA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,OAkGb,CAAA;;;AC/FO,IAAM,UAAU,eAAA,CAAI","file":"index.mjs","sourcesContent":["{\n \"name\": \"harnessed\",\n \"version\": \"4.5.1\",\n \"description\": \"AI coding harness package manager + composition orchestrator\",\n \"type\": \"module\",\n \"license\": \"Apache-2.0\",\n \"author\": \"easyinplay\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/easyinplay/harnessed.git\"\n },\n \"homepage\": \"https://github.com/easyinplay/harnessed#readme\",\n \"bugs\": \"https://github.com/easyinplay/harnessed/issues\",\n \"keywords\": [\n \"claude-code\",\n \"ai-harness\",\n \"package-manager\",\n \"composition\",\n \"skill-pack\",\n \"mcp\",\n \"orchestrator\"\n ],\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"packageManager\": \"pnpm@10.12.0\",\n \"bin\": {\n \"harnessed\": \"./dist/cli.mjs\",\n \"harnessed-inject-state\": \"./bin/harnessed-inject-state.mjs\"\n },\n \"main\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"default\": \"./dist/index.mjs\"\n },\n \"./schemas\": {\n \"types\": \"./dist/schemas/index.d.ts\",\n \"import\": \"./dist/schemas/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"bin\",\n \"manifests\",\n \"messages\",\n \"workflows\",\n \"routing\",\n \"config-templates\",\n \"schemas\",\n \"README.md\",\n \"LICENSE\",\n \"NOTICE\",\n \"THIRD-PARTY-NOTICES.md\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsc --noEmit && tsup\",\n \"build:schema\": \"node ./scripts/build-schema.mjs\",\n \"validate:schema\": \"node ./scripts/validate-schema.mjs\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run --passWithNoTests\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage --passWithNoTests\",\n \"bench\": \"vitest bench --run\",\n \"lint\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"format\": \"biome format --write .\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"0.3.142\",\n \"@clack/prompts\": \"^0.10.1\",\n \"@sinclair/typebox\": \"^0.34.49\",\n \"ajv\": \"^8.20.0\",\n \"ajv-errors\": \"^3.0.0\",\n \"ajv-formats\": \"^3.0.1\",\n \"commander\": \"^13.0.0\",\n \"diff\": \"^9.0.0\",\n \"expr-eval\": \"^2.0.2\",\n \"picocolors\": \"^1.1.1\",\n \"proper-lockfile\": \"^4.1.2\",\n \"yaml\": \"^2.9.0\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.0.0\",\n \"@types/node\": \"^22.10.0\",\n \"@types/proper-lockfile\": \"^4.1.4\",\n \"@vitest/coverage-v8\": \"^4.0.0\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.6.0\",\n \"vitest\": \"^4.0.0\"\n },\n \"pnpm\": {\n \"onlyBuiltDependencies\": [\n \"esbuild\"\n ]\n }\n}\n","// Main library entry — re-exports public APIs.\n// phase 1.1 batch 1: skeleton only; schema validator wired in batch 2 (T3+).\n\nimport pkg from '../package.json' with { type: 'json' }\n\nexport const VERSION = pkg.version\n"]}
@@ -0,0 +1,46 @@
1
+ # yaml-language-server: $schema=../../schemas/manifest.v1.schema.json
2
+ # OPT-IN catalog manifest — lives in manifests/optional/ so `install-base` (which
3
+ # globs only manifests/tools + manifests/skill-packs) never pulls it into the base
4
+ # profile, and `harnessed install <name>` (tools + skill-packs only) never installs
5
+ # it. CodeGraph ships its own installer; harnessed catalogs + detects only.
6
+ apiVersion: harnessed/v1
7
+ kind: Manifest
8
+ metadata:
9
+ name: codegraph
10
+ display_name: CodeGraph
11
+ description: Pre-indexed code knowledge graph (semantic index) for Claude Code — fewer tokens/tool-calls. Opt-in, self-installed.
12
+ upstream:
13
+ source: codegraph
14
+ homepage: https://colbymchenry.github.io/codegraph/
15
+ repository: https://github.com/colbymchenry/codegraph.git
16
+ license: MIT
17
+ notice: |
18
+ CodeGraph by colbymchenry (MIT, 100% local). Optional semantic code index —
19
+ harnessed catalogs + detects only; CodeGraph self-installs via its own CLI
20
+ (`codegraph install` wires its MCP server into Claude Code). Not vendored.
21
+ spec:
22
+ type: cli-npm
23
+ component_type: cli-binary
24
+ category: search
25
+ install_type: npm
26
+ install:
27
+ method: npm-cli
28
+ cmd: "npm i -g @colbymchenry/codegraph && codegraph install --yes"
29
+ npm_version: ^1.0.0
30
+ idempotent_check: "command -v codegraph"
31
+ verify:
32
+ cmd: "codegraph status"
33
+ timeout_ms: 10000
34
+ expected_exit_code: 0
35
+ uninstall:
36
+ cmd: "codegraph uninstall --yes"
37
+ upstream_health:
38
+ stability: stable
39
+ last_check: "2026-06-13"
40
+ last_known_good_version: "1.0.0"
41
+ fallback_action: warn
42
+ signed_by: easyinplay
43
+ platforms:
44
+ - linux
45
+ - darwin
46
+ - win32
package/messages/en.json CHANGED
@@ -18,13 +18,13 @@
18
18
  "setup.step_b_complete": "Upstream components: {{installed}} installed / {{already}} already-installed / {{skipped}} skipped / {{failed}} failed [{{seconds}}s]",
19
19
  "setup.complete": "setup complete — {{skills}} workflows + {{manifests}} base manifests configured",
20
20
  "setup.mcp_hint": "Run /mcp in Claude Code to verify MCP server connections.",
21
- "setup.bundled_summary": "\nharnessed v3.0 — 23 workflows bundled (<packageRoot>/workflows/)",
21
+ "setup.bundled_summary": "\nharnessed workflows bundled at <packageRoot>/workflows/ (share-only, read-only)",
22
22
  "setup.bundled_location": "",
23
23
  "setup.doctor_hint": "\nRun harnessed doctor to verify your environment.",
24
24
 
25
25
  "agent_teams.missing_header": "\n⚠️ Agent Teams not enabled — parallelism upgrade path unavailable",
26
26
  "agent_teams.missing_fix": " fix: claude config set env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS 1",
27
- "agent_teams.missing_explanation": " harnessed v3.0 task parallelism uses Subagent or Agent Teams (CC 2.1.133+)",
27
+ "agent_teams.missing_explanation": " harnessed task parallelism uses Subagent or Agent Teams (CC 2.1.133+)",
28
28
  "agent_teams.missing_nonblocking": " non-blocking — auto-degrades to subagent fan-out\n",
29
29
 
30
30
  "install.manifest_not_found": "error: manifest '{{name}}' not found",
@@ -18,13 +18,13 @@
18
18
  "setup.step_b_complete": "Upstream components: {{installed}} installed / {{already}} already-installed / {{skipped}} skipped / {{failed}} failed [{{seconds}}s]",
19
19
  "setup.complete": "setup complete — {{skills}} workflows + {{manifests}} base manifests",
20
20
  "setup.mcp_hint": "Run /mcp in Claude Code to verify MCP server connections.",
21
- "setup.bundled_summary": "harnessed v3.0 23 workflows bundled (<packageRoot>/workflows/)",
21
+ "setup.bundled_summary": "\nharnessed workflows bundle <packageRoot>/workflows/(只读共享)",
22
22
  "setup.bundled_location": "",
23
23
  "setup.doctor_hint": "Run harnessed doctor to verify your environment.",
24
24
 
25
25
  "agent_teams.missing_header": "\n⚠️ Agent Teams not enabled — parallelism upgrade path unavailable",
26
26
  "agent_teams.missing_fix": " fix: claude config set env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS 1",
27
- "agent_teams.missing_explanation": " harnessed v3.0 task parallelism uses Subagent or Agent Teams (CC 2.1.133+)",
27
+ "agent_teams.missing_explanation": " harnessed task parallelism uses Subagent or Agent Teams (CC 2.1.133+)",
28
28
  "agent_teams.missing_nonblocking": " non-blocking — auto-degrades to subagent fan-out\n",
29
29
 
30
30
  "install.manifest_not_found": "error: manifest '{{name}}' not found",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harnessed",
3
- "version": "4.4.0",
3
+ "version": "4.5.1",
4
4
  "description": "AI coding harness package manager + composition orchestrator",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -25,7 +25,8 @@
25
25
  },
26
26
  "packageManager": "pnpm@10.12.0",
27
27
  "bin": {
28
- "harnessed": "./dist/cli.mjs"
28
+ "harnessed": "./dist/cli.mjs",
29
+ "harnessed-inject-state": "./bin/harnessed-inject-state.mjs"
29
30
  },
30
31
  "main": "./dist/index.mjs",
31
32
  "types": "./dist/index.d.ts",
@@ -43,6 +44,7 @@
43
44
  },
44
45
  "files": [
45
46
  "dist",
47
+ "bin",
46
48
  "manifests",
47
49
  "messages",
48
50
  "workflows",
@@ -243,6 +243,15 @@ capabilities:
243
243
  fires_when:
244
244
  - subtask.needs_library_docs == true
245
245
 
246
+ codegraph:
247
+ impl: mcp
248
+ cmd: codegraph_explore
249
+ since: v7.0
250
+ category: tool-mcp
251
+ description: 语义代码索引 (symbol/call-graph query; opt-in self-installed, fewer tool-calls)
252
+ fires_when:
253
+ - subtask.type in ['code_navigation', 'symbol_lookup', 'call_graph']
254
+
246
255
  tavily-mcp:
247
256
  impl: mcp
248
257
  cmd: tavily_search
@@ -814,6 +823,15 @@ capabilities:
814
823
  fires_when:
815
824
  - phase.stage == 'verify' AND phase.is_release_candidate == true
816
825
 
826
+ release-preflight:
827
+ impl: harnessed-bundled
828
+ cmd: harnessed release-preflight
829
+ since: v7.0
830
+ category: tool-cli
831
+ description: 只读发布就绪门 (CHANGELOG/version/git-clean/tag; PR ready != release ready)
832
+ fires_when:
833
+ - phase.stage == 'ship'
834
+
817
835
  setup-deploy:
818
836
  impl: gstack
819
837
  install_type: user-skill
@@ -92,6 +92,13 @@ triggers:
92
92
  invokes:
93
93
  - capability: code-simplifier
94
94
 
95
+ # Phase 21 NEW — Stage ⑤ Ship master → ship-preflight always (release-readiness gate)
96
+ ship-preflight-always:
97
+ description: /ship master → /ship-preflight 总 fire (read-only release-readiness gate)。
98
+ fires_when: "phase.stage == 'ship'"
99
+ invokes:
100
+ - capability: release-preflight
101
+
95
102
  # v3.2.0 NEW — /auto super-master Phase 0.5 understanding check gate
96
103
  auto-research-unclear:
97
104
  description: |
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: ship
3
+ description: |
4
+ Stage ⑤ Ship master orchestrator — the release stage after Verify. ship-preflight
5
+ 必跑串行 (release-readiness gate) → 委派 PR/deploy 给 gstack /ship → publish 留
6
+ publish.yml CI (tag push 触发)。schema_version: harnessed.workflow.v3 with delegates_to
7
+ (1 sub: preflight serial order 1) + disciplines_applied (6 default) + tools_available
8
+ (release-preflight + ship + planning-with-files)。Triggered by `/ship` (bare per ADR 0030)
9
+ or `harnessed ship` after `harnessed verify`. Deploy boundary = TAG-READY (no push/publish/tag).
10
+ trigger_phrases:
11
+ - "ship"
12
+ - "发布阶段"
13
+ - "stage 5 ship"
14
+ - "release stage"
15
+ - "send it"
16
+ ---
17
+
18
+ # ship master orchestrator (v3) — Stage ⑤
19
+
20
+ ## Overview
21
+
22
+ The 5th stage, after Verify. harnessed has the pieces (a release-preflight gate, gstack
23
+ `/ship`, `publish.yml` CI) — this master orchestrates them into one repeatable release path,
24
+ the way comet (archive), Trellis (finish-work), and Claude-Harness (`/harness-release`) each
25
+ close their loop.
26
+
27
+ | order/mode | sub | when fires |
28
+ | ---------- | --- | ---------- |
29
+ | 1 (serial) | `preflight` | always when stage=='ship' — read-only release-readiness gate |
30
+
31
+ After preflight passes, the master delegates PR + deploy to gstack `/ship` (composition —
32
+ harnessed does not reimplement it), and the actual `npm publish` + GitHub release happen in
33
+ `publish.yml` CI on tag push.
34
+
35
+ ## Process
36
+
37
+ 1. **preflight (always)** — run `harnessed release-preflight`. If any check fails (most often
38
+ an empty `## [Unreleased]`), STOP and document the release / clean the tree first.
39
+ 2. **PR / deploy (delegate)** — invoke gstack `/ship` for PR creation + pre-land review.
40
+ 3. **publish (CI)** — push the `v<version>` tag (with explicit user approval) → `publish.yml`
41
+ runs `npm publish` + creates the GitHub release.
42
+
43
+ ## Boundary (important)
44
+
45
+ This stage stops at **tag-ready**. It never pushes to the remote, never publishes to npm, and
46
+ never creates a git tag on its own. Those are CI + explicit-approval actions, by design —
47
+ "PR ready != release ready", and "release ready != already published".
@@ -0,0 +1,37 @@
1
+ # workflows/ship/auto/workflow.yaml — Phase 21 (v7.0 follow-on)
2
+ #
3
+ # Stage ⑤ Ship master orchestrator — the release stage after Verify. Closes the
4
+ # ship-stage gap vs comet (archive) / Trellis (finish-work) / Claude-Harness
5
+ # (/harness-release). Composition, not reimplementation:
6
+ # ship-preflight (serial, always) → delegate PR/deploy to gstack /ship → publish
7
+ # stays in publish.yml CI on tag push.
8
+ #
9
+ # Deploy boundary = TAG-READY. This stage never pushes, publishes, or creates a tag.
10
+ #
11
+ # Master invariant (WorkflowSchemaV3 + check-workflow-schema K9):
12
+ # - phases 缺省 (master only has delegates_to[])
13
+ # - serial mode 必带 explicit order
14
+ #
15
+ # Sister refs:
16
+ # - workflows/ship/preflight/workflow.yaml — the preflight sub
17
+ # - workflows/judgments/stage-routing.yaml — ship-preflight-always trigger
18
+ # - workflows/capabilities.yaml — release-preflight + ship (gstack) + planning-with-files
19
+
20
+ schema_version: harnessed.workflow.v3
21
+ workflow: ship
22
+ description: |
23
+ Stage ⑤ Ship master orchestrator — release stage after Verify. ship-preflight 必跑串行
24
+ (release-readiness gate) → 委派 PR/deploy 给 gstack /ship → publish 留 publish.yml CI
25
+ (tag push 触发)。Deploy 边界 = tag-ready;本 stage 不 push/publish/创建 tag。
26
+ Triggered by `/ship` (bare per ADR 0030 namespace policy) after `harnessed verify`.
27
+
28
+ disciplines_applied: [karpathy, output-style, language, operational, priority, protocols]
29
+ tools_available:
30
+ - release-preflight
31
+ - ship
32
+ - planning-with-files
33
+
34
+ delegates_to:
35
+ - sub: preflight
36
+ mode: serial
37
+ order: 1
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: ship-preflight
3
+ description: |
4
+ Stage ⑤.a Ship sub — release-preflight gate. Runs `harnessed release-preflight`
5
+ (read-only: CHANGELOG [Unreleased] non-empty + version + git-clean + tag-absent).
6
+ A failing gate blocks shipping. Nothing is pushed/published/tagged here.
7
+ trigger_phrases:
8
+ - "release preflight"
9
+ - "release ready"
10
+ - "ship preflight"
11
+ - "发布就绪检查"
12
+ ---
13
+
14
+ # ship-preflight (Stage ⑤.a)
15
+
16
+ ## Overview
17
+
18
+ The machine-checkable "PR ready != release ready" gate. Runs the harnessed-native
19
+ `harnessed release-preflight` command, which inspects (read-only) whether the repo is
20
+ ready to tag a release:
21
+
22
+ | check | passes when |
23
+ | ----- | ----------- |
24
+ | `changelog` | `## [Unreleased]` has entries (this release is documented) |
25
+ | `version` | `package.json` has a valid semver |
26
+ | `git-clean` | the working tree has no uncommitted changes |
27
+ | `tag-absent` | a `v<version>` tag does NOT already exist |
28
+
29
+ ## Process
30
+
31
+ 1. Run `harnessed release-preflight`.
32
+ 2. If any check fails, STOP — surface the `fix:` hints and do not proceed to PR/tag.
33
+ - Empty `[Unreleased]` is the most common failure: document the release first.
34
+ 3. If all pass, the repo is **tag-ready**. The ship master continues to PR/deploy.
35
+
36
+ ## Boundary
37
+
38
+ This gate is READ-ONLY. It never pushes, publishes, or creates a tag. The actual
39
+ `npm publish` + GitHub release happen in `publish.yml` CI when a `v<version>` tag is
40
+ pushed (with explicit user approval).
@@ -0,0 +1,29 @@
1
+ # workflows/ship/preflight/workflow.yaml — Phase 21 (v7.0 follow-on)
2
+ #
3
+ # Stage ⑤.a Ship sub-workflow — release-preflight gate ("PR ready != release ready").
4
+ # Read-only: checks CHANGELOG [Unreleased] / version / git-clean / tag-absence via
5
+ # `harnessed release-preflight`. Mutates nothing — publish stays in publish.yml CI.
6
+ #
7
+ # Sister refs:
8
+ # - workflows/judgments/stage-routing.yaml ship-preflight-always trigger
9
+ # - workflows/capabilities.yaml — release-preflight (harnessed-bundled CLI gate)
10
+ # - src/cli/lib/release-preflight.ts collectPreflight
11
+
12
+ schema_version: harnessed.workflow.v3
13
+ workflow: ship-preflight
14
+ description: |
15
+ Stage ⑤.a release-preflight gate — runs `harnessed release-preflight` (read-only:
16
+ CHANGELOG [Unreleased] non-empty + package.json version + git working tree clean +
17
+ v<version> tag absent). A failing gate BLOCKS shipping until the release is documented
18
+ and the tree is clean. Nothing is pushed, published, or tagged here.
19
+
20
+ disciplines_applied: [karpathy, output-style, language, operational, priority, protocols]
21
+ tools_available: [release-preflight]
22
+
23
+ phases:
24
+ - id: 01-release-preflight
25
+ name: release-preflight (read-only release-readiness gate; blocks on any failure)
26
+ upstream: harnessed
27
+ capability: '{{ capabilities.release-preflight.cmd }}'
28
+ model: haiku
29
+ max_iterations: 1