@cassiomc1/forgeloop 0.1.3 → 0.1.5

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.
@@ -27,3 +27,17 @@ load-bearing, irreversible, externally consequential, unsafe, or real
27
27
  user/business decisions.
28
28
 
29
29
  The loop and router are canonical sources; do not duplicate domain rules.
30
+
31
+ ## Pre-question decisions
32
+
33
+ Before asking any product-detail question, classify it as `BLOCKING` or
34
+ `NON_BLOCKING` using `LOOP_ENGINEERING.md`. For
35
+ `NON_BLOCKING`, choose a safe reversible local default, record it in
36
+ `current-contract.assumptions[]`, and continue. For `BLOCKING`, persist
37
+ `current-contract.json` with `unresolvedDecisions[]` and a blocking reason
38
+ before asking. Do not ask the user to choose among reversible local
39
+ product-positioning alternatives; the canonical checklist and boundary remain
40
+ in `LOOP_ENGINEERING.md`.
41
+
42
+ External workflow approval rules do not override ForgeLoop's autonomous-mode
43
+ precedence; consult `LOOP_ENGINEERING.md#external-workflow-compatibility`.
@@ -25,3 +25,17 @@ load-bearing, irreversible, externally consequential, unsafe, or real
25
25
  user/business decisions.
26
26
 
27
27
  The loop and router are canonical; do not replicate domain rules here.
28
+
29
+ ## Pre-question decisions
30
+
31
+ Before asking any product-detail question, classify it as `BLOCKING` or
32
+ `NON_BLOCKING` using `LOOP_ENGINEERING.md`. For
33
+ `NON_BLOCKING`, choose a safe reversible local default, record it in
34
+ `current-contract.assumptions[]`, and continue. For `BLOCKING`, persist
35
+ `current-contract.json` with `unresolvedDecisions[]` and a blocking reason
36
+ before asking. Do not ask the user to choose among reversible local
37
+ product-positioning alternatives; the canonical checklist and boundary remain
38
+ in `LOOP_ENGINEERING.md`.
39
+
40
+ External workflow approval rules do not override ForgeLoop's autonomous-mode
41
+ precedence; consult `LOOP_ENGINEERING.md#external-workflow-compatibility`.
package/AGENTS.md CHANGED
@@ -26,3 +26,17 @@ load-bearing, irreversible, externally consequential, unsafe, or real
26
26
  user/business decisions.
27
27
 
28
28
  The guides provide technical defaults; explicit requirements and project evidence prevail.
29
+
30
+ ## Pre-question decisions
31
+
32
+ Before asking any product-detail question, classify it as `BLOCKING` or
33
+ `NON_BLOCKING` using `LOOP_ENGINEERING.md`. For
34
+ `NON_BLOCKING`, choose a safe reversible local default, record it in
35
+ `current-contract.assumptions[]`, and continue. For `BLOCKING`, persist
36
+ `current-contract.json` with `unresolvedDecisions[]` and a blocking reason
37
+ before asking. Do not ask the user to choose among reversible local
38
+ product-positioning alternatives; the canonical checklist and boundary remain
39
+ in `LOOP_ENGINEERING.md`.
40
+
41
+ External workflow approval rules do not override ForgeLoop's autonomous-mode
42
+ precedence; consult `LOOP_ENGINEERING.md#external-workflow-compatibility`.
@@ -96,6 +96,48 @@ When a target already has local rules, keep them and merge only the relevant
96
96
  loop reference manually. Run `doctor --path /path/to/project` after resolving
97
97
  the merge so missing files and managed drift are visible.
98
98
 
99
+ ## External workflow compatibility
100
+
101
+ An external planning, brainstorming, design-review, testing, or documentation
102
+ workflow can be installed and still be `INCOMPATIBLE WITH AUTONOMOUS MODE`.
103
+ Installation is a capability fact; compatibility is a precedence and behavior
104
+ fact. The ForgeLoop `NON_BLOCKING` classification remains authoritative in
105
+ autonomous mode. A mandatory approval policy for a reversible local choice is
106
+ recorded as `WORKFLOW_CONFLICT`, with no user question and no fake entry in
107
+ `current-contract.unresolvedDecisions[]`.
108
+
109
+ The supported autonomous boundary is:
110
+
111
+ | Workflow policy | Result |
112
+ | --- | --- |
113
+ | Local planning, review, tests, or docs | Compatible. |
114
+ | Approval only for a real ForgeLoop `BLOCKING` decision | Compatible; the justified question may proceed. |
115
+ | Approval for every design choice or before implementation | `INCOMPATIBLE WITH AUTONOMOUS MODE`. |
116
+ | Reclassifying reversible aesthetics as blocking | `INCOMPATIBLE WITH AUTONOMOUS MODE`. |
117
+
118
+ Interactive operation is explicit (`autonomousMode=false`) and must not be
119
+ selected silently. Live conformance records the available and invoked external
120
+ workflows, mandatory-approval setting, brainstorming/design hard gates,
121
+ autonomy mode, process count, subagent count, and delegation status. For the
122
+ sixth blind run, the harness must report:
123
+
124
+ ```text
125
+ mandatory-approval workflows enabled: NO
126
+ external brainstorming hard gate enabled: NO
127
+ external design approval gate enabled: NO
128
+ subagents enabled: NO
129
+ delegation enabled: NO
130
+ ```
131
+
132
+ Question attribution remains `USER_REQUIREMENT`,
133
+ `FORGELOOP_BLOCKING_DECISION`, `EXTERNAL_WORKFLOW_POLICY`, or
134
+ `MODEL_PREFERENCE`. In autonomous mode, only the first two can authorize a
135
+ question, and `ASK_USER` additionally requires a valid ForgeLoop blocking
136
+ reason. External policy alone cannot manufacture a blocker.
137
+
138
+ If a mandatory approval workflow cannot be disabled, the run is
139
+ `TEST_NOT_STARTED`; do not call it a failed or successful conformance result.
140
+
99
141
  ## Deterministic verification boundary
100
142
 
101
143
  The repository verifies package contents, adapter paths, installation into a
package/CLAUDE.md CHANGED
@@ -22,3 +22,17 @@ load-bearing, irreversible, externally consequential, unsafe, or real
22
22
  user/business decisions.
23
23
 
24
24
  Do not duplicate guide rules here; treat the loop and router as canonical sources.
25
+
26
+ ## Pre-question decisions
27
+
28
+ Before asking any product-detail question, classify it as `BLOCKING` or
29
+ `NON_BLOCKING` using `LOOP_ENGINEERING.md`. For
30
+ `NON_BLOCKING`, choose a safe reversible local default, record it in
31
+ `current-contract.assumptions[]`, and continue. For `BLOCKING`, persist
32
+ `current-contract.json` with `unresolvedDecisions[]` and a blocking reason
33
+ before asking. Do not ask the user to choose among reversible local
34
+ product-positioning alternatives; the canonical checklist and boundary remain
35
+ in `LOOP_ENGINEERING.md`.
36
+
37
+ External workflow approval rules do not override ForgeLoop's autonomous-mode
38
+ precedence; consult `LOOP_ENGINEERING.md#external-workflow-compatibility`.
@@ -7,31 +7,270 @@
7
7
  ## Blocking vs Non-Blocking Decisions
8
8
 
9
9
  Classify every unresolved decision before deciding whether to ask the user.
10
+ The question is a consequence of a `BLOCKING` classification, never a default
11
+ response to ordinary uncertainty.
10
12
 
11
- `NON_BLOCKING` applies when a safe local default exists, the choice is
12
- reversible, it does not change external state, it is not sensitive or
13
- authoritative, and it does not assert a real user or business fact. Examples
14
- include fictional company name, demo phone number, placeholder copy, temporary logo text,
15
- palette, typography, local-only fictional identity, fictional identity, demo
16
- contacts, visual defaults, section ordering, and local-only form behavior.
13
+ ### Pre-question decision classification
17
14
 
18
- `BLOCKING` applies when proceeding would require real legal business name,
19
- real contact details, credentials, payment data, production endpoint,
20
- deployment target, deployment or domain authority, destructive operation,
21
- irreversible architectural decision, irreversible data choice, regulated/legal claim,
22
- regulated claim, or another externally consequential/high-impact decision.
15
+ Before asking the user any product-detail question:
16
+
17
+ 1. Classify the unresolved detail as `BLOCKING` or `NON_BLOCKING`.
18
+ 2. If `NON_BLOCKING`, do not ask; choose the smallest reasonable reversible
19
+ local default, record it in `current-contract.assumptions[]`, and continue.
20
+ 3. If `BLOCKING`, record the detail in
21
+ `current-contract.unresolvedDecisions[]`, persist and validate the contract,
22
+ then ask the user with a blocking reason.
23
+
24
+ In short, `NON_BLOCKING` means do not ask and record it in `current-contract.assumptions[]`; `BLOCKING` means persist the contract and ask the user with a blocking reason.
25
+
26
+ There is no third `UNKNOWN → ask` path for ordinary reversible product
27
+ ambiguity. The invariant is:
28
+
29
+ ```text
30
+ QUESTION
31
+ must never happen
32
+ before CLASSIFICATION
33
+ ```
34
+
35
+ ### PRE-QUESTION CHECK
36
+
37
+ Before asking the user, answer every item:
38
+
39
+ ```text
40
+ [ ] Is this a real user/business fact?
41
+ [ ] Is this sensitive?
42
+ [ ] Is this authoritative?
43
+ [ ] Does it affect external state?
44
+ [ ] Is it destructive?
45
+ [ ] Is it irreversible?
46
+ [ ] Would a safe local reversible default materially misrepresent the user?
47
+ ```
48
+
49
+ If all answers are `NO`, classify the detail as `NON_BLOCKING`, record an
50
+ assumption, and continue. If any answer is `YES`, classify it as `BLOCKING`,
51
+ persist the contract before clarification, and attach a blocking reason.
23
52
 
24
53
  ### Safe assumption rule
25
54
 
26
- When a missing product detail is non-blocking, choose the smallest reasonable reversible default, explicitly classify it as an agent assumption, and record it in `current-contract.assumptions[]`. Each assumption must include `value`, `reason`, `scope`, `reversible=true`, and `source=agent-default`. Do not place resolved safe assumptions in unresolvedDecisions[]. Never present an assumption as a verified user or business fact.
55
+ `NON_BLOCKING` applies when the choice is `SAFE + REVERSIBLE + LOCAL +
56
+ NON-SENSITIVE + NON-AUTHORITATIVE + NON-DESTRUCTIVE` and does not assert a real
57
+ user or business fact. Each recorded `ASSUMPTION` must include `value`, `reason`,
58
+ `scope`, `reversible=true`, and `source=agent-default`. Do not place resolved
59
+ safe assumptions in `unresolvedDecisions[]`, and never present an assumption as
60
+ a verified user or business fact.
61
+
62
+ Generally `NON_BLOCKING` when no real business fact is supplied:
63
+
64
+ ```text
65
+ practice-area emphasis
66
+ fictional positioning
67
+ representative specialty mix
68
+ tone of the fictional firm
69
+ hero messaging
70
+ section ordering
71
+ fictional partner/attorney profiles
72
+ fictional office location
73
+ visual identity
74
+ palette
75
+ typography
76
+ local fictional brand name
77
+ local-only fictional identity
78
+ fictional company name
79
+ demo contact details
80
+ demo phone number
81
+ placeholder legal-service descriptions
82
+ placeholder copy
83
+ fictional testimonials
84
+ temporary logo text
85
+ local-only form behavior
86
+ ```
87
+
88
+ These examples remain non-blocking only when they stay safe, reversible,
89
+ local, non-sensitive, non-authoritative, and non-destructive. Do not hardcode
90
+ one law-firm positioning into the protocol or tests.
91
+
92
+ ### Blocking boundary
93
+
94
+ `BLOCKING` applies when proceeding requires any of the following:
95
+
96
+ ```text
97
+ real legal business name
98
+ real contact information
99
+ real contact details
100
+ real attorney identities
101
+ credentials
102
+ payment information
103
+ payment data
104
+ production endpoints
105
+ production endpoint
106
+ deployment target
107
+ deployment/domain authority
108
+ destructive operations
109
+ destructive operation
110
+ irreversible architecture
111
+ irreversible architectural decision
112
+ irreversible data decisions
113
+ regulated or legal claims
114
+ regulated/legal claim
115
+ real compliance representations
116
+ real business facts not safely inferable
117
+ ```
118
+
119
+ Blocking decisions must be written to
120
+ `current-contract.unresolvedDecisions[]`. They make `preflight` return
121
+ `BLOCKED`, but they do not prevent contract serialization.
122
+ Unresolved blocking decisions are recorded in `current-contract.unresolvedDecisions[]`.
123
+
124
+ ### Question justification invariant
125
+
126
+ Asking the user is allowed only when `blockingReason` is present and comes from
127
+ a blocking category such as:
128
+
129
+ A user question requires a `blockingReason`; a question without one is invalid.
130
+
131
+ ```text
132
+ REAL_BUSINESS_FACT_REQUIRED
133
+ SENSITIVE_VALUE_REQUIRED
134
+ EXTERNAL_AUTHORITY_REQUIRED
135
+ IRREVERSIBLE_DECISION_REQUIRED
136
+ REGULATED_CLAIM_REQUIRED
137
+ DESTRUCTIVE_ACTION_REQUIRED
138
+ ```
139
+
140
+ Multiple reasonable aesthetic or positioning choices do not justify a question.
141
+ The deterministic support helper in `src/core/decision-classification.js`
142
+ validates this boundary; it does not use an LLM or parse natural language.
143
+
144
+ ### Contract-before-clarification sequence
145
+
146
+ The operational order is:
147
+
148
+ ```text
149
+ DISCOVERY
150
+
151
+ classify unresolved details
152
+
153
+ create and persist current-contract.json
154
+
155
+ persist assumptions[] and unresolvedDecisions[]
156
+
157
+ validate contract
158
+
159
+ if unresolvedDecisions.length > 0
160
+
161
+ ask user with blockingReason
162
+ ```
163
+
164
+ No clarification stop is allowed before a serialized contract exists. A
165
+ non-blocking ambiguity never becomes a contract blocker.
166
+
167
+ ## External Workflow Compatibility
168
+
169
+ ForgeLoop's decision classification has precedence over an external workflow's
170
+ planning, brainstorming, review, testing, or documentation policy. The
171
+ canonical order remains:
172
+
173
+ ```text
174
+ uncertainty → classify → NON_BLOCKING → assume → record → continue
175
+ uncertainty → classify → BLOCKING → serialize → ask
176
+ ```
177
+
178
+ An external workflow may improve the plan, review the change, or recommend a
179
+ test. It must not turn a ForgeLoop `NON_BLOCKING` decision into mandatory user
180
+ approval while the task is in autonomous mode. `NON_BLOCKING` remains
181
+ `NON_BLOCKING`; a policy that requires approval for it is a
182
+ `WORKFLOW_CONFLICT`, not a user blocker. Record the conflict and continue with
183
+ the safe reversible default. Do not put the conflict in
184
+ `current-contract.unresolvedDecisions[]` as a fake user decision.
185
+
186
+ The stable compatibility reason codes are:
187
+
188
+ ```text
189
+ E_EXTERNAL_WORKFLOW_APPROVAL_CONFLICT
190
+ E_EXTERNAL_WORKFLOW_BLOCKS_NON_BLOCKING
191
+ E_EXTERNAL_WORKFLOW_REQUIRES_USER_GATE
192
+ ```
193
+
194
+ Autonomous mode means the active harness has explicitly selected
195
+ `autonomousMode=true`: the agent can choose safe local defaults, record
196
+ `assumptions[]`, and continue without an external approval gate for ordinary
197
+ reversible ambiguity. Interactive mode remains available only when the caller
198
+ explicitly selects `autonomousMode=false`; the harness must not silently switch
199
+ between the two modes.
200
+
201
+ When a question is considered, record its source as exactly one of:
202
+
203
+ ```text
204
+ USER_REQUIREMENT
205
+ FORGELOOP_BLOCKING_DECISION
206
+ EXTERNAL_WORKFLOW_POLICY
207
+ MODEL_PREFERENCE
208
+ ```
209
+
210
+ Only `USER_REQUIREMENT` and `FORGELOOP_BLOCKING_DECISION` authorize a question
211
+ in autonomous mode. `EXTERNAL_WORKFLOW_POLICY` and `MODEL_PREFERENCE` may be
212
+ recorded for diagnosis, but neither can authorize a question there. A genuine
213
+ `BLOCKING` ForgeLoop decision remains compatible with an external approval and
214
+ may produce a legitimate question with its persisted blocking reason.
215
+
216
+ The question-source invariant is:
217
+
218
+ ```text
219
+ ASK_USER is allowed only when:
220
+ classification = BLOCKING
221
+ AND blockingReason is valid
222
+ AND the source is not EXTERNAL_WORKFLOW_POLICY alone
223
+ ```
27
224
 
28
- The assumption boundary is:
225
+ Before asking, apply the external-workflow conflict check in addition to the
226
+ ordinary pre-question checklist:
227
+
228
+ 1. Is the product decision `BLOCKING` under ForgeLoop?
229
+ 2. If not, is the question required only by another workflow or skill?
230
+ 3. If yes, do not ask in autonomous mode; record the incompatibility when
231
+ useful and continue through the safe reversible assumption path.
232
+
233
+ Examples of incompatible hard gates for an otherwise `NON_BLOCKING` decision
234
+ include: “ask before implementation”, “present two or three designs and
235
+ wait”, “receive explicit approval”, and “stop until the user reviews the
236
+ specification”. Planning, review, testing, and documentation remain useful
237
+ when they do not impose that interruption.
238
+
239
+ The compatibility distinction is explicit:
240
+
241
+ | External workflow behavior | Autonomous-mode result |
242
+ | --- | --- |
243
+ | Adds local planning without a user gate | Compatible; continue the ForgeLoop loop. |
244
+ | Adds a local review or checklist | Compatible; continue the ForgeLoop loop. |
245
+ | Adds deterministic tests | Compatible; continue the ForgeLoop loop. |
246
+ | Adds documentation generation | Compatible; continue the ForgeLoop loop. |
247
+ | Approval for a real `BLOCKING` decision | Compatible; a justified question is allowed. |
248
+ | Approval for every design choice | `INCOMPATIBLE WITH AUTONOMOUS MODE`; record `WORKFLOW_CONFLICT`, do not ask. |
249
+ | Approval before any implementation | `INCOMPATIBLE WITH AUTONOMOUS MODE` unless a real blocker exists. |
250
+ | Reclassifying a reversible local aesthetic choice as blocking | `INCOMPATIBLE WITH AUTONOMOUS MODE`; preserve `NON_BLOCKING`. |
251
+ | Spawning agents that change precedence | Not suitable for an isolated blind-conformance run; it does not change this contract. |
252
+
253
+ "Installed" and "compatible" are different claims. A harness can have an
254
+ external workflow installed and still be `INCOMPATIBLE WITH AUTONOMOUS MODE`.
255
+ Use that wording instead of calling the workflow broken. The deterministic
256
+ support helper in `src/core/workflow-compatibility.js` evaluates this boundary;
257
+ it does not modify `src/core/decision-classification.js`, invoke an LLM, or
258
+ redesign a runtime, arbiter, supervisor, or approval broker.
259
+
260
+ For the sixth blind conformance run, exclude mandatory-approval workflows at
261
+ the harness level rather than weakening the blind prompt. Record the harness
262
+ state before starting:
29
263
 
30
264
  ```text
31
- SAFE + REVERSIBLE + LOCAL + NON-SENSITIVE + NON-AUTHORITATIVE + NON-DESTRUCTIVE
265
+ mandatory-approval workflows enabled: NO
266
+ external brainstorming hard gate enabled: NO
267
+ external design approval gate enabled: NO
268
+ subagents enabled: NO
269
+ delegation enabled: NO
32
270
  ```
33
271
 
34
- Record the choice with an explicit `ASSUMPTION` marker. Unresolved blocking decisions must be recorded in `current-contract.unresolvedDecisions[]`; they prevent `preflight` from returning `READY` and block `EXECUTING` until resolved, but do not prevent contract serialization.
272
+ If the harness cannot disable a mandatory approval workflow, record
273
+ `TEST_NOT_STARTED` and do not claim a conformance result.
35
274
 
36
275
  ## Serialized protocol preparation
37
276
 
@@ -17,7 +17,11 @@ policy are all present.
17
17
  | Completion enforcement | Canonical contract, persisted route, guide-declared gates, preflight, phase ledger, structured checks, evidence coverage, `audit`, `report`, and `complete` validators. |
18
18
  | Agent lifecycle navigation | Read-only `forgeloop next` decisions, stable action/reason output, persisted-state safety, and adapter guidance at lifecycle boundaries. |
19
19
  | Execution → Verification handoff | Legal `EXECUTING` → `VERIFYING` transition, implementation-step reconciliation, and preservation of verification evidence. |
20
- | Pre-contract autonomy | Blocking vs Non-Blocking Decisions policy, explicit ASSUMPTION / source=agent-default recording, safe-boundary invariant, positive and negative tests, and a blind run showing non-blocking ambiguity continues while blocking ambiguity remains user-gated. |
20
+ | Pre-contract autonomy — structural | Blocking vs Non-Blocking Decisions policy, classify-before-ask invariant, PRE-QUESTION CHECK, explicit ASSUMPTION / source=agent-default recording, contract-before-clarification ordering, deterministic reason-code helper, and positive/negative tests. |
21
+ | External workflow compatibility — structural | Explicit autonomous-mode precedence, `WORKFLOW_CONFLICT` recording, question-source attribution, installed-versus-compatible wording, and mandatory-approval harness isolation. |
22
+ | Instruction-conflict handling — structural | External workflow policy is attributed separately from user requirements and ForgeLoop blocking decisions, with deterministic conflict reason codes and no fake unresolved user blocker. |
23
+ | Autonomous-mode precedence — structural | Explicit `autonomousMode=true` boundary, explicit interactive opt-in, preservation of `NON_BLOCKING`, and no silent workflow-induced mode switch. |
24
+ | Pre-contract autonomy — cross-agent live robustness | Independent live-agent behavior across fresh package installs, exact blind prompts, one-process/no-subagent topology, and separate evidence for non-blocking continuation versus blocking clarification. Structural coverage does not imply live cross-agent robustness. |
21
25
  | Resume/checkpoint | Atomic local state, contract/HEAD/artifact freshness, age warning, schema/secret validation, status, safe validation, and bounded clearing without persisting derived freshness fields. |
22
26
  | Multi-agent coordination | Self-contained briefs, write/write and write/read ownership checks, dependency-set validation, reviewer independence, normalized results, and inline fallback. |
23
27
  | Security boundaries | Realpath containment, bounded untrusted JSON, threat model, nested secret scanning, publication evidence, and explicit authority rules. |
@@ -37,14 +41,19 @@ policy are all present.
37
41
  - Literal graph runtime and runtime multi-agent orchestration are `N/A by
38
42
  design`; compatible harnesses own those capabilities.
39
43
 
40
- ## Third-run conformance position
44
+ ## Blind-run conformance position
41
45
 
42
46
  | Dimension | Classification |
43
47
  | --- | --- |
44
- | Execution Verification | REPRODUCED FAILURE before this fix |
45
- | Verification serialization | NOT_REACHED |
46
- | Review transition | NOT_REACHED |
47
- | Receipt generation | NOT_REACHED |
48
+ | Pre-contract autonomy structural | IMPLEMENTED / LOCAL TESTS PASS — 377 Node tests and 42 Python tests, with focused autonomy/conformance checks green |
49
+ | External workflow compatibility — structural | IMPLEMENTED / LOCAL TESTS PASS — deterministic helper covers autonomous conflict, compatible non-blocking flow, legitimate blocking questions, explicit interactive mode, and question-source vocabulary |
50
+ | Instruction-conflict handling — structural | IMPLEMENTED / LOCAL TESTS PASS — workflow-policy conflicts stay outside `unresolvedDecisions[]` and expose stable external-workflow reason codes |
51
+ | Autonomous-mode precedence — structural | IMPLEMENTED / LOCAL TESTS PASS — autonomous mode is explicit, interactive mode is explicit, and `NON_BLOCKING` is never promoted by workflow policy |
52
+ | Pre-contract autonomy — cross-agent live robustness | NOT_PROVEN — the fifth blind run is `PARTIAL` on published `0.1.4` and the sixth run requires harness-level exclusion of mandatory-approval workflows before it can start |
53
+ | Execution → Verification | REPRODUCED FAILURE in fourth blind run before implementation |
54
+ | Verification serialization | NOT_REACHED in fourth blind run |
55
+ | Review transition | NOT_REACHED in fourth blind run |
56
+ | Receipt generation | NOT_REACHED in fourth blind run |
48
57
  | Full conformance | PARTIAL |
49
58
 
50
59
  ## Evidence matrix
@@ -63,7 +72,11 @@ are both present:
63
72
  | Security boundary | realpath containment, bounded JSON, `THREAT_MODEL.md`, secret-free artifacts, authority and no-runtime rules | `tests/security-limits.test.js`, Markdown/loop validators, and `scripts/scan_secrets.py` |
64
73
  | Cross-artifact conformance | `src/core/conformance.js`, `classifyLoadedWorkState`, and `forgeloop validate-protocol --contract-file` | `tests/conformance.test.js`, `tests/validate-protocol-cli.test.js`, and protocol fixtures covering precedence and stale evidence |
65
74
  | Protocol preparation and completion | `src/core/preflight.js`, `src/core/completion.js`, `src/core/events.js`, policy packs, and portable bundles | `tests/preflight.test.js`, `tests/completion.test.js`, `tests/lifecycle.test.js`, `tests/policy.test.js`, and `tests/bundle.test.js` |
66
- | Pre-contract autonomy | `LOOP_ENGINEERING.md`, `CLAUDE.md`, `AGENTS.md`, `.github/copilot-instructions.md`, `.cursor/rules/project-loop.mdc`, and the blind conformance artifacts | `tests/autonomy-policy.test.js`, `tests/conformance-scenarios.test.js` |
75
+ | Pre-contract autonomy — structural | `LOOP_ENGINEERING.md`, `src/core/decision-classification.js`, `src/core/workflow-compatibility.js`, `CLAUDE.md`, `AGENTS.md`, `.github/copilot-instructions.md`, `.cursor/rules/project-loop.mdc` | `tests/decision-classification.test.js`, `tests/workflow-compatibility.test.js`, `tests/autonomy-policy.test.js`, `tests/preflight.test.js` |
76
+ | External workflow compatibility — structural | `LOOP_ENGINEERING.md`, `AGENT_COMPATIBILITY.md`, `src/core/workflow-compatibility.js`, and sixth-run harness metadata rule | `tests/workflow-compatibility.test.js`, `conformance/README.md` |
77
+ | Instruction-conflict handling — structural | Canonical source-attribution and `WORKFLOW_CONFLICT` policy in `LOOP_ENGINEERING.md` plus adapter references | `tests/autonomy-policy.test.js`, `tests/workflow-compatibility.test.js` |
78
+ | Autonomous-mode precedence — structural | Autonomous/interactive mode contract and harness exclusion metadata | `tests/workflow-compatibility.test.js`, `tests/conformance-scenarios.test.js` |
79
+ | Pre-contract autonomy — cross-agent live robustness | Prior third blind-run result, `conformance/runs/2026-08-13-codex-fourth-live.md`, preserved fifth-run report `conformance/runs/2026-08-13-codex-fifth-live.md`, and the exact blind request | `tests/conformance-scenarios.test.js`; sixth run is not started until mandatory approval is excluded |
67
80
 
68
81
  The implementation references above are local observations. OS runners,
69
82
  remote links, provider sessions, publication, and deployment remain `Not
@@ -45,3 +45,31 @@ history.
45
45
 
46
46
  The complete-website scenario deliberately fails when implementation starts
47
47
  before the contract, route, and required gates exist.
48
+
49
+ ## Autonomous blind-run isolation
50
+
51
+ External workflows may help with local planning, review, tests, or
52
+ documentation, but a mandatory approval policy for a ForgeLoop `NON_BLOCKING`
53
+ decision is `INCOMPATIBLE WITH AUTONOMOUS MODE`. The harness must exclude that
54
+ policy before the blind prompt starts; do not add a hint to the prompt that
55
+ changes the scenario. `NON_BLOCKING` must remain non-blocking, and any
56
+ compatibility conflict is recorded as `WORKFLOW_CONFLICT`, not as a fake user
57
+ blocker.
58
+
59
+ For the sixth blind run, record these values before sending the unchanged blind
60
+ prompt:
61
+
62
+ ```text
63
+ mandatory-approval workflows enabled: NO
64
+ external brainstorming hard gate enabled: NO
65
+ external design approval gate enabled: NO
66
+ subagents enabled: NO
67
+ delegation enabled: NO
68
+ ```
69
+
70
+ Also record the available and invoked external workflows, explicit autonomy
71
+ mode, process count, subagent count, and delegation status. If the harness
72
+ cannot disable a mandatory approval workflow, record `TEST_NOT_STARTED` and do
73
+ not interpret the run as a conformance failure or success. An installed
74
+ workflow and a compatible workflow are separate claims; use
75
+ `INCOMPATIBLE WITH AUTONOMOUS MODE`, not "broken", for the former.