harness-everything 0.19.0 → 0.20.0
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.releaserc.json +1 -1
- package/AGENTS.md +3 -2
- package/CHANGELOG.md +9 -0
- package/README.md +14 -14
- package/RELEASING.md +10 -2
- package/ci/invariant-routing.test.js +42 -19
- package/ci/mechanism-2af-worktree-isolation.test.js +3 -3
- package/ci/mechanism-2ag-router-worktree-contract.test.js +1 -0
- package/ci/mechanism-2an-workflow-obligations.test.js +1 -0
- package/ci/mechanism-2ap-sbom.test.js +92 -0
- package/ci/mechanism-33-issues-205-207.test.js +2 -2
- package/ci/openai-plugin-package.test.js +6 -6
- package/ci/router-workflow-plan.test.js +12 -9
- package/ci/workflow-execution-contract.test.js +2 -2
- package/docs/architecture.md +15 -15
- package/docs/enforcement-locks.md +17 -15
- package/docs/philosophy.md +43 -8
- package/docs/routing.md +23 -16
- package/docs/workflow-runtime.md +20 -19
- package/environment-detection/SKILL.md +3 -1
- package/evals/harness-everything/tasks/positive-tier1.yaml +1 -1
- package/evals/harness-everything/tasks/positive-tier2.yaml +1 -1
- package/evals/harness-everything/tasks/positive-tier3.yaml +1 -1
- package/evals/using-git-worktrees/tasks/positive-trigger.yaml +1 -1
- package/find-skills/SKILL.md +20 -29
- package/git-commit/SKILL.md +4 -4
- package/harness-everything/SKILL.md +16 -17
- package/harness-everything/references/triage-and-tiers.md +17 -16
- package/harness-everything/scripts/kernel-router-core.js +26 -24
- package/harness-everything/scripts/kernel-router.js +8 -8
- package/harness-everything/scripts/router-contract-core.js +7 -7
- package/harness-everything/scripts/router-contract.js +1 -1
- package/hooks/scripts/atomic-commit-check.js +1 -1
- package/hooks/scripts/boundary-guard.js +2 -2
- package/hooks/scripts/depth-guard.js +5 -6
- package/hooks/scripts/subagent-scope-guard.js +2 -2
- package/hooks/scripts/workflow-gate.js +1 -1
- package/install-cognitive-os/SKILL.md +3 -3
- package/opencode-plugin/plugin.json +1 -1
- package/package.json +5 -2
- package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
- package/plugins/harness-everything/hooks/scripts/atomic-commit-check.js +1 -1
- package/plugins/harness-everything/hooks/scripts/boundary-guard.js +2 -2
- package/plugins/harness-everything/hooks/scripts/depth-guard.js +5 -6
- package/plugins/harness-everything/hooks/scripts/subagent-scope-guard.js +2 -2
- package/plugins/harness-everything/hooks/scripts/workflow-gate.js +1 -1
- package/plugins/harness-everything/plugin.json +1 -1
- package/plugins/harness-everything/scripts/lib/advisory-text.js +19 -17
- package/plugins/harness-everything/skills/environment-detection/SKILL.md +3 -1
- package/plugins/harness-everything/skills/find-skills/SKILL.md +20 -29
- package/plugins/harness-everything/skills/git-commit/SKILL.md +4 -4
- package/plugins/harness-everything/skills/harness-everything/SKILL.md +16 -17
- package/plugins/harness-everything/skills/harness-everything/references/triage-and-tiers.md +17 -16
- package/plugins/harness-everything/skills/harness-everything/scripts/kernel-router-core.js +26 -24
- package/plugins/harness-everything/skills/harness-everything/scripts/kernel-router.js +8 -8
- package/plugins/harness-everything/skills/harness-everything/scripts/router-contract-core.js +7 -7
- package/plugins/harness-everything/skills/harness-everything/scripts/router-contract.js +1 -1
- package/plugins/harness-everything/skills/install-cognitive-os/SKILL.md +3 -3
- package/plugins/harness-everything/skills/rewrite-commits/SKILL.md +2 -2
- package/plugins/harness-everything/skills/to-tickets/SKILL.md +2 -2
- package/plugins/harness-everything/skills/using-git-worktrees/SKILL.md +6 -6
- package/rewrite-commits/SKILL.md +2 -2
- package/sbom.cdx.json +2110 -0
- package/scripts/generate-sbom.js +239 -0
- package/scripts/lib/advisory-text.js +19 -17
- package/to-tickets/SKILL.md +2 -2
- package/using-git-worktrees/SKILL.md +6 -6
|
@@ -165,7 +165,7 @@ process.stdin.on('end', () => {
|
|
|
165
165
|
} else if (declaredContracts.length === 0) {
|
|
166
166
|
console.error(`[Subagent Scope Reminder] ${newlyChanged.length} file(s) changed with no machine-readable writeSet contract:`);
|
|
167
167
|
newlyChanged.forEach(line => console.error(` ${line}`));
|
|
168
|
-
console.error('
|
|
168
|
+
console.error('Semantic MUST: reconcile every changed path against the declared scope before trusting or committing this output.');
|
|
169
169
|
} else {
|
|
170
170
|
for (const entry of classified.expected) {
|
|
171
171
|
console.log(`[Subagent Scope Reminder] in-scope ${entry.statusLine} -> ${entry.planId}/${entry.runId}/${entry.stageId}${entry.workerId ? ` worker=${entry.workerId}` : ''}`);
|
|
@@ -174,7 +174,7 @@ process.stdin.on('end', () => {
|
|
|
174
174
|
console.error(`[Subagent Scope Reminder] ambiguous scope ${entry.statusLine}; matches ${entry.stages.map(stage => `${stage.runId}/${stage.stageId}`).join(', ')}`);
|
|
175
175
|
}
|
|
176
176
|
for (const entry of classified.outOfScope) {
|
|
177
|
-
console.error(`[Subagent Scope Reminder] OUT-OF-SCOPE ${entry.statusLine}${entry.workerId ? ` worker=${entry.workerId}` : ''}
|
|
177
|
+
console.error(`[Subagent Scope Reminder] OUT-OF-SCOPE ${entry.statusLine}${entry.workerId ? ` worker=${entry.workerId}` : ''}; MUST reconcile/revert or explicitly re-authorize scope before accepting the result.`);
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
|
|
@@ -35,7 +35,7 @@ function decide(payload) {
|
|
|
35
35
|
if (String(workflow.strategy || '').startsWith('fable-') && !matchingRun(context)) warn('Selected Fable workflow has no correlated run; consider creating/updating the stage map before broad changes.');
|
|
36
36
|
if (isMajorWorkflow(workflow)) {
|
|
37
37
|
const isolatedRoot = linkedWorktree(cwd, root);
|
|
38
|
-
if (!isolatedRoot) warn('
|
|
38
|
+
if (!isolatedRoot) warn('Tier-3/Fable isolation disposition is a semantic MUST before broad mutation: enter a linked Git worktree or record an explicit degraded fallback. This reminder does not hard-block.');
|
|
39
39
|
else {
|
|
40
40
|
try { if (DIRECT.has(tool)) assertTargets(payload, cwd, isolatedRoot); else assertShellScope(command, cwd, isolatedRoot); }
|
|
41
41
|
catch (error) { warn(error.message); }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "harness-everything",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.20.0",
|
|
5
5
|
"description": "Invariant-first engineering harness for routing, verification, and failure recovery while preserving agent autonomy.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Miya Daniel",
|
|
@@ -7,14 +7,14 @@ const MARKER = "Harness OS Guidance (Advisory)";
|
|
|
7
7
|
|
|
8
8
|
const advisoryInstructions = [
|
|
9
9
|
`\n# ${MARKER}`,
|
|
10
|
-
`Harness is an observer/router/reminder layer on this surface; do not treat
|
|
10
|
+
`Harness is an observer/router/reminder layer on this surface. Instruction/advisory delivery describes the mechanism, not semantic optionality; do not treat Harness as a hard scheduler.`,
|
|
11
11
|
``,
|
|
12
|
-
`## 🚦 ENTRY TRIAGE &
|
|
12
|
+
`## 🚦 ENTRY TRIAGE & SEMANTIC CONTRACT`,
|
|
13
13
|
`For software/project work, load the \`harness-everything\` skill and establish routing context before broad mutation:`,
|
|
14
|
-
`1.
|
|
15
|
-
`2.
|
|
16
|
-
`3.
|
|
17
|
-
`4.
|
|
14
|
+
`1. MUST route before broad mutation; run \`npx github:dyphn1/Harness-everything next "<Brief summary of user's prompt>"\` when terminal execution is available and no equivalent routing state was injected.`,
|
|
15
|
+
`2. MUST read/evaluate EVERY suggested skill. If applicable, MUST follow its core contract; if not-applicable, keep a flow-grounded reason.`,
|
|
16
|
+
`3. Selected-topology required obligations are MUSTs. Implementation tactics MAY adapt; numeric iteration/revision/replan/worker values MAY guide planning but never hard-block.`,
|
|
17
|
+
`4. MUST verify before claiming completion. Tier-3/Fable broad mutation MUST resolve isolation: linked worktree or explicit degraded fallback.`,
|
|
18
18
|
`5. Use the routing checkpoint only as internal source state for the first Harness Status; do not render a competing progress block.`,
|
|
19
19
|
``,
|
|
20
20
|
`## 📣 USER-VISIBLE STATUS (MUST)`,
|
|
@@ -31,10 +31,11 @@ const advisoryInstructions = [
|
|
|
31
31
|
`- **No universal skill pipeline**: do not force every task through TODO/TDD/Fable.`,
|
|
32
32
|
`- **Rule of 3**: after 3 same-signature failures, stop micro-retrying and use a fresh diagnosis / zoom-out. This reflection boundary may block mutation until completed.`,
|
|
33
33
|
`- **Permission boundaries are separate**: explicit host/user approval for destructive or external actions remains authoritative.`,
|
|
34
|
-
`- **
|
|
35
|
-
`- **
|
|
36
|
-
`- **
|
|
37
|
-
`- **
|
|
34
|
+
`- **Contract strength**: MUST = required semantic obligation; SHOULD = default with evidence-based exception; MAY = optional optimization. Reminder-only mechanics never downgrade MUST.`,
|
|
35
|
+
`- **Verification is evidence, not a cage**: MUST verify before completion claims; host hooks may remind rather than persistently block.`,
|
|
36
|
+
`- **Environment discovery**: MUST establish relevant OS/shell/toolchain/host facts before relying on environment-sensitive behavior.`,
|
|
37
|
+
`- **Memory / self-evolve**: durable writes MUST be authorized by the active workflow/session contract and backed by verified reusable evidence.`,
|
|
38
|
+
`- **Editing / commits**: targeted edits SHOULD be preferred; before committing, MUST inspect the staged diff and SHOULD split unrelated concerns.`,
|
|
38
39
|
``
|
|
39
40
|
].join('\n');
|
|
40
41
|
|
|
@@ -144,15 +145,16 @@ function buildCodexGlobalContent() {
|
|
|
144
145
|
`# ${MARKER}`,
|
|
145
146
|
`This instruction surface cannot be assumed to provide hard lifecycle blocking.`,
|
|
146
147
|
``,
|
|
147
|
-
`-
|
|
148
|
-
`- For software/project work,
|
|
148
|
+
`- MUST establish relevant environment/host facts before relying on environment-sensitive behavior.`,
|
|
149
|
+
`- For software/project work, MUST establish routing before broad mutation; use \`npx github:dyphn1/Harness-everything next "<summary>"\` when terminal execution is available and routing state was not already injected.`,
|
|
149
150
|
`- For non-trivial work, MUST render one Markdown \`### 🚦 Harness Status\` with bullet-aligned bold \`Current\`, \`Read / Evidence\`, \`Next\`, and optional \`Risk / Blocked\`; repeat it at major phase/direction boundaries and before final completion.`,
|
|
150
|
-
`-
|
|
151
|
-
`-
|
|
151
|
+
`- MUST read/evaluate every suggested skill; applicable skill core contracts MUST be followed, while not-applicable needs a flow-grounded reason.`,
|
|
152
|
+
`- Selected-topology required obligations are MUSTs; implementation tactics MAY adapt and numeric planning values MAY guide but never hard-block.`,
|
|
152
153
|
`- Do not impose a universal TODO/TDD/Fable sequence; use the smallest useful topology plus applicable skills.`,
|
|
153
|
-
`-
|
|
154
|
-
`-
|
|
155
|
-
`-
|
|
154
|
+
`- MUST verify before declaring done; a reminder-only host mechanism does not make verification optional.`,
|
|
155
|
+
`- Tier-3/Fable broad mutation MUST resolve isolation: verified linked worktree or explicit degraded fallback.`,
|
|
156
|
+
`- After 3 same-signature failures, MUST stop retrying and use a fresh diagnosis / zoom-out.`,
|
|
157
|
+
`- Targeted edits SHOULD be preferred; before committing, MUST inspect the staged diff and SHOULD split unrelated concerns.`,
|
|
156
158
|
``
|
|
157
159
|
].join('\n');
|
|
158
160
|
}
|
|
@@ -4,7 +4,7 @@ description: Use at session start (Discover phase) to detect and align with the
|
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: Miya Daniel
|
|
7
|
-
version: 0.
|
|
7
|
+
version: 0.19.1
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Environment Detection & Shell Alignment
|
|
@@ -20,6 +20,8 @@ metadata:
|
|
|
20
20
|
|
|
21
21
|
Boundary: stay inside `process.cwd()`. Detection never writes integrations or searches parent/cache paths for another runtime.
|
|
22
22
|
|
|
23
|
+
**Strength:** before relying on environment-sensitive commands, paths, package managers, or host capabilities, relevant discovery is a semantic **MUST**. Hosts may satisfy it from trusted injected environment context instead of rerunning probes.
|
|
24
|
+
|
|
23
25
|
## Workflow
|
|
24
26
|
|
|
25
27
|
1. Run `node "<this-skill-dir>/scripts/preflight.js"`; detect OS, shell, CLIs.
|
|
@@ -4,45 +4,36 @@ description: Search the agent-skills ecosystem (skills.sh / npx skills) when no
|
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: Miya Daniel
|
|
7
|
-
version: 0.
|
|
7
|
+
version: 0.19.1
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Find Skills
|
|
11
11
|
|
|
12
|
-
##
|
|
12
|
+
## Skill Contract
|
|
13
13
|
|
|
14
|
-
| Component |
|
|
14
|
+
| Component | Contract |
|
|
15
15
|
| :--- | :--- |
|
|
16
|
-
| **
|
|
17
|
-
| **
|
|
18
|
-
| **State
|
|
19
|
-
| **
|
|
16
|
+
| **Input** | No installed skill fits, or user asks to find one. |
|
|
17
|
+
| **Output** | Vetted skill pointer, approved application, or fallback. |
|
|
18
|
+
| **State** | Temp cache by default; permanent install is opt-in. |
|
|
19
|
+
| **Gate** | Third-party fetch/apply/install requires explicit approval. |
|
|
20
20
|
|
|
21
21
|
## Workflow
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
3. Present name/source/count; NEVER fetch/apply without explicit approval.
|
|
31
|
-
4. Apply ephemerally (default, zero footprint):
|
|
32
|
-
```bash
|
|
33
|
-
node "<this-skill-dir>/scripts/use-skill.js" <owner/repo[@skill]>
|
|
34
|
-
```
|
|
35
|
-
Treat the printed output as binding for this request, like a loaded skill — not reference material. OS-temp cache (6h); nothing written to repo or manifest.json.
|
|
36
|
-
5. Permanent install ONLY when the user says they will reuse it: `npx skills add <owner/repo[@skill]> --agent <agent> [-g] -y`
|
|
37
|
-
6. Nothing exists? Help directly; suggest `npx skills init <name>` if recurring.
|
|
38
|
-
|
|
39
|
-
Deep dive: <this-skill-dir>/references/discovery-flow.md
|
|
23
|
+
1. Check local coverage first: `npx skills list --json` and `npx skills list -g --json`.
|
|
24
|
+
2. If uncovered, search skills.sh / `npx skills find [query] [--owner <owner>]`.
|
|
25
|
+
3. Official/1K+ sources **SHOULD** rank first; **MUST** read the unaudited `SKILL.md`.
|
|
26
|
+
4. Present name/source/count; **MUST** get explicit approval before fetching or applying third-party code.
|
|
27
|
+
5. Ephemeral use is default: `node "<this-skill-dir>/scripts/use-skill.js" <owner/repo[@skill]>`. Treat its output as binding for this request.
|
|
28
|
+
6. Permanent install **MUST** be explicitly requested: `npx skills add <owner/repo[@skill]> --agent <agent> [-g] -y`.
|
|
29
|
+
7. No match: help directly; `npx skills init <name>` **MAY** be suggested for recurring needs.
|
|
40
30
|
|
|
41
31
|
## USE FOR:
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
- ephemeral skill use without permanent installs
|
|
32
|
+
- external skill discovery/vetting
|
|
33
|
+
- approved ephemeral use
|
|
45
34
|
|
|
46
35
|
## DO NOT USE FOR:
|
|
47
|
-
- authoring
|
|
48
|
-
-
|
|
36
|
+
- skill authoring (`skill-creator`)
|
|
37
|
+
- unapproved third-party application/install
|
|
38
|
+
|
|
39
|
+
Deep dive: <this-skill-dir>/references/discovery-flow.md
|
|
@@ -4,7 +4,7 @@ description: "Generate Angular-style commit messages after verifying the environ
|
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: Miya Daniel
|
|
7
|
-
version: 0.
|
|
7
|
+
version: 0.19.1
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Git Commit (Angular Style)
|
|
@@ -20,10 +20,10 @@ metadata:
|
|
|
20
20
|
|
|
21
21
|
## Quick Workflow
|
|
22
22
|
|
|
23
|
-
1. `git status`; no repo → offer `git init` or skip; submodules changed → commit first per `<this-skill-dir>/guides/SUBMODULES.md`.
|
|
24
|
-
2. `git diff --cached
|
|
23
|
+
1. **MUST** run `git status`; no repo → offer `git init` or skip; submodules changed → commit first per `<this-skill-dir>/guides/SUBMODULES.md`.
|
|
24
|
+
2. **MUST** inspect `git diff --cached` before committing. Nothing staged → prompt user / stage only user-authorized targeted files. Unrelated concerns **SHOULD** be split unless coupling or explicit user intent justifies one commit.
|
|
25
25
|
3. Format `<type>(<scope>): <subject>` per `<this-skill-dir>/guides/ANGULAR_STYLE.md`. Multiline/Windows → `.git-commit-msg.txt` + `git commit -F`, clean up.
|
|
26
|
-
4. `git commit -m "..."`, verify with `git log -1`.
|
|
26
|
+
4. `git commit -m "..."`, then **MUST** verify the result with `git log -1`.
|
|
27
27
|
|
|
28
28
|
## USE FOR:
|
|
29
29
|
- Commit request from the user
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: harness-everything
|
|
3
|
-
description: "Route software/project work through
|
|
3
|
+
description: "Route software/project work through Harness: classify tier/topology, resolve suggested skills, apply semantic obligations, and keep tactics flexible. Use for software triage/routing/re-routing; not general Q&A or non-software writing."
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: Miya Daniel
|
|
7
|
-
version: 0.
|
|
7
|
+
version: 0.19.1
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Harness Everything
|
|
@@ -12,28 +12,27 @@ metadata:
|
|
|
12
12
|
Kernel routing entry.
|
|
13
13
|
|
|
14
14
|
## USE FOR:
|
|
15
|
-
- Software/project triage, routing, re-routing,
|
|
15
|
+
- Software/project triage, routing, re-routing, workflow selection.
|
|
16
16
|
- Work that names or matches another skill.
|
|
17
17
|
|
|
18
18
|
## DO NOT USE FOR:
|
|
19
19
|
- General Q&A or non-software writing.
|
|
20
20
|
|
|
21
21
|
## Invariants
|
|
22
|
-
1. **Route
|
|
23
|
-
2. **Verify
|
|
24
|
-
3. **Zoom out
|
|
25
|
-
4. **
|
|
26
|
-
5. **Surface status** — non-trivial work
|
|
27
|
-
6. **Keep agency** —
|
|
22
|
+
1. **Route (MUST)** — establish scope/tier and selected/deferred topology.
|
|
23
|
+
2. **Verify (MUST)** — completion claims need objective evidence.
|
|
24
|
+
3. **Zoom out (MUST)** — after 3 same-signature failures, use `zoom-out`.
|
|
25
|
+
4. **Resolve suggestions (MUST)** — read/evaluate each suggested `SKILL.md`; applicable core contracts MUST run, otherwise retain a flow-grounded reason.
|
|
26
|
+
5. **Surface status (MUST)** — non-trivial work renders `### 🚦 Harness Status` with bold `Current`, `Read / Evidence`, `Next`; optional `Risk / Blocked`.
|
|
27
|
+
6. **Keep agency** — required obligations are MUST; tactics MAY adapt. Numeric planning values MAY guide, never hard-stop.
|
|
28
28
|
|
|
29
29
|
## Workflow
|
|
30
|
-
1. Reuse kernel output
|
|
31
|
-
2. Keep the
|
|
32
|
-
3.
|
|
33
|
-
4.
|
|
34
|
-
5.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
**Rule:** guidance may become louder when evidence is weak, but only Rule-of-3 reflection and explicit user/host permission boundaries may block.
|
|
30
|
+
1. Reuse kernel output or run `node "<this-skill-dir>/scripts/kernel-router.js" "<prompt summary>"`.
|
|
31
|
+
2. Keep the routing checkpoint internal.
|
|
32
|
+
3. Resolve each suggestion as `use`, `not-applicable`, or `unresolved`; `use` follows its core contract.
|
|
33
|
+
4. Resolve selected-topology required invariants/stages/checks before completion.
|
|
34
|
+
5. Tier-3/Fable broad mutation MUST resolve isolation: linked worktree or explicit degraded fallback.
|
|
35
|
+
|
|
36
|
+
**Rule:** semantic MUST is not hard blocking; only Rule-of-3 reflection and explicit user/host permission boundaries may block.
|
|
38
37
|
|
|
39
38
|
Deep dive: <this-skill-dir>/references/triage-and-tiers.md
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Harness uses tiers to estimate scope and select the smallest sufficient execution topology. A tier is **not** a fixed TODO/TDD/Fable pipeline. Once the router selects an applicable topology, however, that topology becomes the run's execution contract.
|
|
4
4
|
|
|
5
|
-
> Architecture rule: **
|
|
5
|
+
> Architecture rule: **Contract-first lifecycle; flexible reasoning/implementation; semantic MUSTs may be reminder-observed, while only Rule-of-3 reflection and explicit permission boundaries may hard-block.**
|
|
6
6
|
|
|
7
7
|
## 0. When Harness Routing Applies
|
|
8
8
|
|
|
@@ -43,7 +43,7 @@ The kernel protects lifecycle obligations without micromanaging model reasoning.
|
|
|
43
43
|
2. **Verify before claim** — completion requires objective evidence appropriate to the change.
|
|
44
44
|
3. **Re-plan on repetition** — after three same-signature failures, stop micro-retrying and use a fresh diagnosis / `zoom-out`.
|
|
45
45
|
4. **Evaluate before omission** — when the router suggests a skill, read its complete `SKILL.md` entry/basic flow before deciding applicability.
|
|
46
|
-
5. **
|
|
46
|
+
5. **Resolve selected workflow** — selected-topology required obligations are semantic MUSTs; implementation tactics MAY adapt where the contract allows.
|
|
47
47
|
6. **Surface status** — non-trivial software/project work MUST use the single Harness Status format at required phase boundaries.
|
|
48
48
|
|
|
49
49
|
The model remains free to choose tools, implementation technique, decomposition details, and reasoning inside the workflow.
|
|
@@ -55,7 +55,7 @@ The model remains free to choose tools, implementation technique, decomposition
|
|
|
55
55
|
- Every router-suggested skill when its evaluated flow is objectively not applicable.
|
|
56
56
|
- Every optional deep-dive/reference linked from a skill.
|
|
57
57
|
|
|
58
|
-
A suggested skill may resolve as `use`, `not-applicable`, or `unresolved/unavailable`. `not-applicable` needs a flow-grounded reason; a metadata-only or confidence-only judgement is insufficient.
|
|
58
|
+
A suggested skill may resolve as `use`, `not-applicable`, or `unresolved/unavailable`. Resolution is a **MUST**. `not-applicable` needs a flow-grounded reason; a metadata-only or confidence-only judgement is insufficient. If disposition is `use`, the skill's core contract is a **MUST**. The selected **topology** is also a semantic execution contract; neither concept implies a persistent runtime lock.
|
|
59
59
|
|
|
60
60
|
## 2. Routing Mechanism
|
|
61
61
|
|
|
@@ -69,12 +69,12 @@ npx github:dyphn1/Harness-everything next "<brief prompt summary>"
|
|
|
69
69
|
|
|
70
70
|
`kernel-router.js` delegates classification/guide discovery to `tier-router.js` and emits:
|
|
71
71
|
|
|
72
|
-
-
|
|
72
|
+
- classified tier + rationale,
|
|
73
73
|
- structured workflow plan,
|
|
74
74
|
- compact **Harness Routing Checkpoint**,
|
|
75
75
|
- required invariants,
|
|
76
76
|
- suggested skills whose applicability must be evaluated,
|
|
77
|
-
- **Workflow
|
|
77
|
+
- **Workflow Contract** for the selected topology.
|
|
78
78
|
|
|
79
79
|
If `UserPromptSubmit` already ran the kernel this turn, reuse that output. Do not infer a silent Tier 1/direct path from missing or degraded routing.
|
|
80
80
|
|
|
@@ -82,23 +82,24 @@ If `UserPromptSubmit` already ran the kernel this turn, reuse that output. Do no
|
|
|
82
82
|
|
|
83
83
|
For every router-suggested skill:
|
|
84
84
|
|
|
85
|
-
1.
|
|
86
|
-
2.
|
|
85
|
+
1. **MUST** read the complete `SKILL.md` entry.
|
|
86
|
+
2. **MUST** evaluate `USE FOR`, `DO NOT USE FOR`, workflow/basic flow, and hard rules.
|
|
87
87
|
3. Read extra material only when the entry explicitly requires it to decide applicability.
|
|
88
|
-
4.
|
|
88
|
+
4. **MUST** resolve the suggestion as `use`, `not-applicable`, or `unresolved/unavailable`.
|
|
89
|
+
5. `use` means the skill's core contract **MUST** be followed; `not-applicable` **MUST** keep a flow-grounded reason.
|
|
89
90
|
|
|
90
91
|
A name, description, router summary, tier label, or generic "routine/common task" judgement is not enough to mark a suggestion not applicable. Using one suggestion does not resolve the others automatically.
|
|
91
92
|
|
|
92
93
|
### Workflow escape contract
|
|
93
94
|
|
|
94
|
-
Escape is audit metadata for a bounded
|
|
95
|
+
Escape is audit metadata for a bounded contract exception. Use it only when the selected topology genuinely cannot represent part of the task. The permitted reason codes are:
|
|
95
96
|
|
|
96
97
|
- `workflow-uncovered-scope` — the selected topology cannot represent a bounded part of the task;
|
|
97
98
|
- `host-capability-unavailable` — the host lacks a capability required to execute the selected topology.
|
|
98
99
|
|
|
99
|
-
Every escape must name a declared stage in the correlated run and record the reason code, uncovered scope, and evidence explaining the coverage/capability gap. Host capability loss and missing isolation
|
|
100
|
+
Every escape must name a declared stage in the correlated run and record the reason code, uncovered scope, and evidence explaining the coverage/capability gap. Host capability loss and missing isolation **MUST** remain visible as warnings/evidence, without creating a persistent execution lock.
|
|
100
101
|
|
|
101
|
-
## 3. Tier
|
|
102
|
+
## 3. Tier Routing
|
|
102
103
|
|
|
103
104
|
### Tier 1 — Trivial
|
|
104
105
|
|
|
@@ -118,7 +119,7 @@ When an evaluated skill is applicable, follow its workflow rather than reading i
|
|
|
118
119
|
|
|
119
120
|
Typical shape: repository-wide/architectural work, large ambiguous requirements, cross-source synthesis, or bounded delegation.
|
|
120
121
|
|
|
121
|
-
The router may select `fable-staged`, `fable-parallel`, or `fable-multi-agent-workspace`. A selected Fable topology is
|
|
122
|
+
The router may select `fable-staged`, `fable-parallel`, or `fable-multi-agent-workspace`. A selected Fable topology is a semantic execution contract: its required stages, dependencies/write sets, checks, synthesis barrier, and verifier **MUST** resolve. Missing lifecycle evidence may produce reminders rather than a persistent workflow lock; fail-open mechanics do not make the contract optional.
|
|
122
123
|
|
|
123
124
|
Tier 3 does **not** automatically mean multi-agent; the router still chooses the smallest sufficient topology.
|
|
124
125
|
|
|
@@ -141,8 +142,8 @@ This describes a reasoning policy. The workflow contract governs lifecycle oblig
|
|
|
141
142
|
|
|
142
143
|
| Host mode | Expected behavior |
|
|
143
144
|
|---|---|
|
|
144
|
-
| Lifecycle hooks available | Kernel records selected workflow
|
|
145
|
-
|
|
|
145
|
+
| Lifecycle hooks available | Kernel records the selected semantic workflow contract. PreToolUse/Stop hooks observe/remind; Rule-of-3 and permission gates are the intentional blocking exceptions. |
|
|
146
|
+
| Instruction-only / advisory delivery | Agent receives the same MUST/SHOULD/MAY semantic contract without lifecycle observations or hard-enforcement claims. |
|
|
146
147
|
| Manual use | Invoke `harness-everything` / `harness next`, then execute the selected topology explicitly. |
|
|
147
148
|
|
|
148
149
|
On Claude and the local OpenAI package, supported hooks observe workflow/worktree/verification state and emit reminders. Rule-of-3 reflection and explicit action/permission gates remain separate blocking boundaries.
|
|
@@ -185,11 +186,11 @@ For software/project work, consume this internal runtime state when producing th
|
|
|
185
186
|
- Escape: <none | reason + uncovered scope + evidence>
|
|
186
187
|
```
|
|
187
188
|
|
|
188
|
-
The checkpoint is runtime/source state, not a competing user-facing template. Render user progress through the single Harness Status contract above. The key distinction is: **skill suggestions
|
|
189
|
+
The checkpoint is runtime/source state, not a competing user-facing template. Render user progress through the single Harness Status contract above. The key distinction is: **skill suggestions MUST resolve applicability; applicable skill core contracts and selected-topology obligations are MUSTs, while tactics MAY adapt.**
|
|
189
190
|
|
|
190
191
|
## 8. Self-Healing and Dynamic Skills
|
|
191
192
|
|
|
192
|
-
Self-heal, generated-skill discovery, knowledge-guide matching, and fact-audit behavior remain part of the runtime. Dynamic
|
|
193
|
+
Self-heal, generated-skill discovery, knowledge-guide matching, and fact-audit behavior remain part of the runtime. Dynamic skill suggestions still require applicability evaluation.
|
|
193
194
|
|
|
194
195
|
If bootstrap reports missing integration touchpoints:
|
|
195
196
|
|
|
@@ -22,29 +22,31 @@ const { applyEnsemblePolicy } = require('./ensemble-policy');
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
const INVARIANT_TEXT = {
|
|
25
|
-
'scope-lock': '
|
|
26
|
-
'
|
|
27
|
-
'
|
|
28
|
-
'
|
|
29
|
-
'
|
|
30
|
-
'
|
|
31
|
-
'
|
|
32
|
-
'
|
|
33
|
-
'
|
|
34
|
-
'
|
|
35
|
-
'
|
|
36
|
-
'
|
|
37
|
-
'
|
|
38
|
-
'
|
|
39
|
-
'
|
|
40
|
-
'
|
|
41
|
-
'
|
|
42
|
-
'
|
|
25
|
+
'scope-lock': 'MUST route before execution and stay inside the authorized task/repository scope.',
|
|
26
|
+
'environment-alignment': 'MUST establish relevant OS/shell/toolchain/host facts before relying on environment-sensitive behavior.',
|
|
27
|
+
'verify-before-claim': 'MUST verify before claim with objective evidence appropriate to the change.',
|
|
28
|
+
'visible-status-updates': 'MUST render the single Markdown Harness Status with a visible heading, bullet-aligned bold labels, Current, Read / Evidence, and Next; add Risk / Blocked only when materially applicable.',
|
|
29
|
+
'replan-after-repeated-failure': 'MUST stop micro-retrying after 3 same-signature failures and zoom out/re-diagnose.',
|
|
30
|
+
'evaluate-suggestions-before-skip': 'MUST read/evaluate each suggested skill\'s complete SKILL.md entry/basic flow before omission; an applicable skill core contract MUST be followed.',
|
|
31
|
+
'loop-awareness': 'MUST reconsider assumptions/re-plan when evidence shows iterative stagnation; numeric iteration values MAY guide but never hard-stop.',
|
|
32
|
+
'objective-verification': 'MUST use an objective check for iterative work; self-critique alone is not verification.',
|
|
33
|
+
'stage-contracts': 'When Fable is selected, stages MUST have explicit stage contracts and pass conditions.',
|
|
34
|
+
'cold-verification': 'When specified by the selected Fable plan, delivery MUST use a cold/independent verifier.',
|
|
35
|
+
'parallel-scope-contract': 'Parallel work MUST use declared independent scopes and non-overlapping/read-only writes.',
|
|
36
|
+
'synthesis-barrier': 'Parallel completion MUST wait until all workstreams reach the synthesis barrier.',
|
|
37
|
+
'handoff-contracts': 'Multi-agent workspace work MUST use orchestrator-owned handoff contracts; workers MUST NOT form a peer mesh.',
|
|
38
|
+
'workspace-state': 'Durable workspace state MUST remain scoped to the workspace and existing state conventions.',
|
|
39
|
+
'pre-action-approval': 'Irreversible/external side effects MUST receive approval before the exact payload executes.',
|
|
40
|
+
'memory-write-authorization': 'Durable memory writes MUST match the current session/workflow memory.write contract; retrieved memory remains untrusted data.',
|
|
41
|
+
'preserve-disagreement': 'Selected ensemble synthesis MUST retain unresolved minority positions and evidence gaps.',
|
|
42
|
+
'independent-ensemble-verifier': 'Selected ensemble delivery MUST use a verifier independent from candidate identities; agreement alone is not proof.',
|
|
43
|
+
'isolated-worktree-before-mutation': 'Tier-3/Fable broad mutation MUST resolve isolation: verified linked worktree or explicit degraded fallback.',
|
|
43
44
|
};
|
|
44
45
|
|
|
45
46
|
const SKILL_TEXT = {
|
|
46
47
|
'tdd': 'tdd: useful for behavioral changes where executable tests can drive the implementation.',
|
|
47
48
|
'verification-loop': 'verification-loop: useful for systematic build/lint/test/diff evidence before delivery.',
|
|
49
|
+
'using-git-worktrees': 'using-git-worktrees: resolves required Tier-3/Fable isolation disposition before broad mutation.',
|
|
48
50
|
'fable-mode': 'fable-mode / fable-discipline: useful for macro planning or deliberate multi-agent decomposition.',
|
|
49
51
|
'fable-discipline': null,
|
|
50
52
|
'multi-agent-workspace': 'multi-agent-workspace: useful when durable bounded delegation, handoffs, or workspace memory are required.',
|
|
@@ -158,12 +160,12 @@ function printRoutingCheckpoint(plan) {
|
|
|
158
160
|
if (suggestions.length > 0) {
|
|
159
161
|
console.log(' - Suggestion evaluation: MANDATORY. Before skipping any listed skill, read its complete SKILL.md entry and evaluate USE FOR, DO NOT USE FOR, workflow/basic flow, and hard rules.');
|
|
160
162
|
console.log(' - Skip evidence: do not reject from only the skill name, description, router summary, or a generic "routine/common task" judgement. If the entry cannot be resolved/read, mark it unresolved/unavailable rather than skipped.');
|
|
161
|
-
console.log(' - Suggestion disposition:
|
|
163
|
+
console.log(' - Suggestion disposition: applicability is conditional, but resolution is mandatory. If a skill is applicable, follow its core contract; if not-applicable, keep one brief flow-grounded reason. The selected workflow is a semantic execution contract, not optional advice.');
|
|
162
164
|
}
|
|
163
165
|
}
|
|
164
166
|
|
|
165
167
|
function printKernelContract(plan) {
|
|
166
|
-
console.log('\n=> REQUIRED HARNESS INVARIANTS:');
|
|
168
|
+
console.log('\n=> REQUIRED HARNESS INVARIANTS (SEMANTIC MUST):');
|
|
167
169
|
for (const invariant of plan.requiredInvariants || []) {
|
|
168
170
|
console.log(` - ${invariant}: ${INVARIANT_TEXT[invariant] || 'Required by the selected workflow plan.'}`);
|
|
169
171
|
}
|
|
@@ -182,7 +184,7 @@ function printKernelContract(plan) {
|
|
|
182
184
|
console.log(' - Emit it before substantive execution, after a major phase, when direction materially changes, at meaningful long-running phase boundaries, and before final completion (the final response may merge it naturally).');
|
|
183
185
|
console.log(' - This is a semantic communication MUST, not a hard execution lock, counter, or reset condition.');
|
|
184
186
|
|
|
185
|
-
console.log('\n=> WORKFLOW SKILLS (
|
|
187
|
+
console.log('\n=> WORKFLOW SKILLS (APPLICABILITY MUST BE RESOLVED):');
|
|
186
188
|
if (Array.isArray(plan.suggestedSkills) && plan.suggestedSkills.length > 0) {
|
|
187
189
|
const emitted = new Set();
|
|
188
190
|
for (const skill of plan.suggestedSkills) {
|
|
@@ -192,12 +194,12 @@ function printKernelContract(plan) {
|
|
|
192
194
|
emitted.add(skill);
|
|
193
195
|
if (skill === 'fable-mode') emitted.add('fable-discipline');
|
|
194
196
|
}
|
|
195
|
-
console.log(' - Read-before-skip: evaluate every suggested skill entry before omission; adopting one suggestion does not waive
|
|
197
|
+
console.log(' - Read-before-skip: MUST evaluate every suggested skill entry before omission. If applicable, MUST follow its core contract; adopting one suggestion does not waive resolution of the others.');
|
|
196
198
|
if (plan.strategy && plan.strategy.startsWith('fable-')) {
|
|
197
199
|
console.log(' - Fable is not a universal pipeline, but a selected Fable topology must be entered and resolved before completion.');
|
|
198
200
|
}
|
|
199
201
|
} else if (plan.strategy === 'direct-single') {
|
|
200
|
-
console.log(' - No domain skill was suggested.
|
|
202
|
+
console.log(' - No domain skill was suggested. The bounded direct path SHOULD remain minimal; a focused skill MAY be loaded when it adds value.');
|
|
201
203
|
} else if (plan.strategySelection === 'deferred') {
|
|
202
204
|
console.log(' - Strategy is deferred/unclassified. Do not infer triviality; choose the smallest justified approach from task evidence.');
|
|
203
205
|
} else {
|
|
@@ -220,7 +222,7 @@ function printKernelContract(plan) {
|
|
|
220
222
|
console.log('\n=> ROUTING DEGRADATION: Structured routing is degraded. Keep the strategy deferred unless independent evidence supports a route; do not silently downgrade to Tier 1/direct execution.');
|
|
221
223
|
}
|
|
222
224
|
|
|
223
|
-
console.log('\n=> ORCHESTRATION POLICY: Selected
|
|
225
|
+
console.log('\n=> ORCHESTRATION POLICY: Selected-topology required obligations and applicable skill core contracts are semantic MUSTs; implementation tactics MAY adapt. Lifecycle hooks observe/remind rather than hard-block, except user/host permission boundaries and the Rule-of-3 zoom-out.');
|
|
224
226
|
}
|
|
225
227
|
|
|
226
228
|
function route(prompt, stdinPayload) {
|
|
@@ -91,7 +91,7 @@ function persistWorkflow(contract, payload, prompt) {
|
|
|
91
91
|
revision: 0,
|
|
92
92
|
escapes: [],
|
|
93
93
|
guidance: {
|
|
94
|
-
mode: '
|
|
94
|
+
mode: 'semantic-contract',
|
|
95
95
|
reasoningPolicy: 'model-controls-how',
|
|
96
96
|
hardBoundaries: ['rule-of-3-reflection', 'user-host-permission'],
|
|
97
97
|
},
|
|
@@ -136,15 +136,15 @@ function run(raw) {
|
|
|
136
136
|
core.printWorkflowPlan(plan);
|
|
137
137
|
core.printRoutingCheckpoint(plan);
|
|
138
138
|
core.printKernelContract(plan);
|
|
139
|
-
console.log('\n=> WORKFLOW
|
|
139
|
+
console.log('\n=> WORKFLOW SEMANTIC CONTRACT (NON-BLOCKING OBSERVATION):');
|
|
140
140
|
console.log(' - State: ' + (persisted?.workflow.state || (plan.strategy ? 'unpersisted' : 'deferred')));
|
|
141
141
|
console.log(' - Selected workflow: ' + (plan.strategy || 'deferred'));
|
|
142
142
|
if (plan.strategySelection === 'selected') {
|
|
143
|
-
console.log(' -
|
|
144
|
-
console.log(' - Before claiming completion,
|
|
145
|
-
console.log(' -
|
|
146
|
-
console.log(' - Tier 3 / Fable
|
|
147
|
-
console.log(' - Escape
|
|
143
|
+
console.log(' - Selected-topology required obligations are semantic MUSTs; implementation technique and local tactics MAY adapt.');
|
|
144
|
+
console.log(' - Before claiming completion, MUST resolve required workflow evidence and objective verification, or report an explicit blocked/degraded disposition.');
|
|
145
|
+
console.log(' - Every suggested skill MUST resolve applicability. If applicable, follow its core contract; if not-applicable, keep a flow-grounded reason.');
|
|
146
|
+
console.log(' - Tier 3 / Fable broad mutation MUST resolve isolation: verified linked worktree or explicit degraded fallback. Missing isolation is not a Harness lock.');
|
|
147
|
+
console.log(' - Escape is only for genuinely uncovered declared scope with evidence; it does not erase covered MUST obligations.');
|
|
148
148
|
}
|
|
149
149
|
if (persisted?.workflow) {
|
|
150
150
|
const controller = path.join(persisted.hooksRoot, 'workflow-disposition.js');
|
|
@@ -163,7 +163,7 @@ function run(raw) {
|
|
|
163
163
|
console.log(' - Runtime state was not persisted; reminders may be less precise, but execution remains available.');
|
|
164
164
|
}
|
|
165
165
|
if (failure) console.error('[Workflow Reminder] routing state was not persisted: ' + failure.message);
|
|
166
|
-
if (result && result.status !== 0) console.error('[Workflow Reminder] router returned status ' + result.status + ';
|
|
166
|
+
if (result && result.status !== 0) console.error('[Workflow Reminder] router returned status ' + result.status + '; contract observation is degraded, not blocking.');
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
if (typeof module !== 'undefined') module.exports = { isHostNotificationPrompt };
|
package/plugins/harness-everything/skills/harness-everything/scripts/router-contract-core.js
CHANGED
|
@@ -320,7 +320,7 @@ function selectWorkflowStrategy(input = {}) {
|
|
|
320
320
|
function planMetadataForStrategy(strategy) {
|
|
321
321
|
const base = {
|
|
322
322
|
patterns: ['router'],
|
|
323
|
-
requiredInvariants: ['scope-lock', 'verify-before-claim', 'replan-after-repeated-failure', 'visible-status-updates'],
|
|
323
|
+
requiredInvariants: ['scope-lock', 'environment-alignment', 'verify-before-claim', 'replan-after-repeated-failure', 'visible-status-updates'],
|
|
324
324
|
suggestedSkills: [],
|
|
325
325
|
maxIterations: null,
|
|
326
326
|
parallelAllowed: null,
|
|
@@ -365,8 +365,8 @@ function planMetadataForStrategy(strategy) {
|
|
|
365
365
|
return {
|
|
366
366
|
...base,
|
|
367
367
|
patterns: ['router', 'planner-executor', 'evaluator-optimizer'],
|
|
368
|
-
requiredInvariants: [...base.requiredInvariants, 'stage-contracts', 'cold-verification'],
|
|
369
|
-
suggestedSkills: ['fable-mode', 'fable-discipline', 'verification-loop'],
|
|
368
|
+
requiredInvariants: [...base.requiredInvariants, 'stage-contracts', 'cold-verification', 'isolated-worktree-before-mutation'],
|
|
369
|
+
suggestedSkills: ['using-git-worktrees', 'fable-mode', 'fable-discipline', 'verification-loop'],
|
|
370
370
|
parallelAllowed: false,
|
|
371
371
|
parallelReasonCodes: ['dependent-or-unproven-independent-stages'],
|
|
372
372
|
workspaceRequired: false,
|
|
@@ -380,8 +380,8 @@ function planMetadataForStrategy(strategy) {
|
|
|
380
380
|
return {
|
|
381
381
|
...base,
|
|
382
382
|
patterns: ['router', 'planner-executor', 'evaluator-optimizer'],
|
|
383
|
-
requiredInvariants: [...base.requiredInvariants, 'stage-contracts', 'cold-verification', 'parallel-scope-contract', 'synthesis-barrier'],
|
|
384
|
-
suggestedSkills: ['fable-mode', 'fable-discipline', 'verification-loop'],
|
|
383
|
+
requiredInvariants: [...base.requiredInvariants, 'stage-contracts', 'cold-verification', 'isolated-worktree-before-mutation', 'parallel-scope-contract', 'synthesis-barrier'],
|
|
384
|
+
suggestedSkills: ['using-git-worktrees', 'fable-mode', 'fable-discipline', 'verification-loop'],
|
|
385
385
|
parallelAllowed: true,
|
|
386
386
|
parallelReasonCodes: ['independent-read-only-or-disjoint-scopes'],
|
|
387
387
|
workspaceRequired: false,
|
|
@@ -395,8 +395,8 @@ function planMetadataForStrategy(strategy) {
|
|
|
395
395
|
return {
|
|
396
396
|
...base,
|
|
397
397
|
patterns: ['router', 'planner-executor', 'evaluator-optimizer', 'multi-agent-memory'],
|
|
398
|
-
requiredInvariants: [...base.requiredInvariants, 'stage-contracts', 'cold-verification', 'handoff-contracts', 'workspace-state'],
|
|
399
|
-
suggestedSkills: ['multi-agent-workspace', 'fable-mode', 'fable-discipline', 'verification-loop'],
|
|
398
|
+
requiredInvariants: [...base.requiredInvariants, 'stage-contracts', 'cold-verification', 'isolated-worktree-before-mutation', 'handoff-contracts', 'workspace-state'],
|
|
399
|
+
suggestedSkills: ['using-git-worktrees', 'multi-agent-workspace', 'fable-mode', 'fable-discipline', 'verification-loop'],
|
|
400
400
|
parallelAllowed: false,
|
|
401
401
|
parallelReasonCodes: ['workspace-orchestrator-controls-concurrency'],
|
|
402
402
|
workspaceRequired: true,
|
|
@@ -16,7 +16,7 @@ function augmentWorkflowPlan(plan) {
|
|
|
16
16
|
if (!requiredInvariants.includes('isolated-worktree-before-mutation')) requiredInvariants.push('isolated-worktree-before-mutation');
|
|
17
17
|
if (!suggestedSkills.includes('using-git-worktrees')) suggestedSkills.push('using-git-worktrees');
|
|
18
18
|
return { ...plan, requiredInvariants, suggestedSkills, mutationIsolation: {
|
|
19
|
-
required: true, mechanism: 'git-worktree', transition: 'before-first-mutation', onUnavailable: '
|
|
19
|
+
required: true, mechanism: 'git-worktree', transition: 'before-first-mutation', onUnavailable: 'degraded',
|
|
20
20
|
} };
|
|
21
21
|
}
|
|
22
22
|
|