@cassiomc1/forgeloop 1.11.1 → 1.13.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.
Files changed (71) hide show
  1. package/.github/copilot-instructions.md +1 -1
  2. package/AGENTS.md +1 -1
  3. package/CLAUDE.md +1 -1
  4. package/CONTRIBUTING.md +90 -0
  5. package/DOCS_INDEX.md +13 -11
  6. package/ENG/c-development-eng.md +112 -0
  7. package/ENG/cpp-development-eng.md +109 -0
  8. package/ENG/dotnet-aspnetcore-development-eng.md +401 -0
  9. package/ENG/flutter-development-eng.md +2106 -0
  10. package/ENG/go-development-eng.md +103 -0
  11. package/ENG/java-development-eng.md +125 -0
  12. package/ENG/nodejs-backend-development-eng.md +605 -0
  13. package/ENG/php-development-eng.md +104 -0
  14. package/ENG/rust-development-eng.md +422 -0
  15. package/ENG/sql-development-eng.md +108 -0
  16. package/ENG/swift-development-eng.md +111 -0
  17. package/ENG/typescript-development-eng.md +108 -0
  18. package/GUIDE_ROUTER.md +455 -4
  19. package/LOOP_SYSTEM_DESIGN.md +10 -6
  20. package/QUALITY_SCORECARD.md +2 -0
  21. package/README.md +50 -38
  22. package/THIRD_PARTY_NOTICES.md +19 -7
  23. package/completions/_forgeloop +3 -3
  24. package/completions/forgeloop.bash +3 -3
  25. package/completions/forgeloop.fish +7 -0
  26. package/docs/AGENT_PROTOCOL_SUMMARY.md +55 -2
  27. package/docs/CLI_REFERENCE.md +28 -6
  28. package/docs/DOCUMENTATION_GUIDE.md +2 -1
  29. package/docs/GETTING_STARTED.md +59 -0
  30. package/docs/MCP.md +1 -1
  31. package/docs/PACKAGE_CONTENTS.md +29 -8
  32. package/docs/RECIPES.md +23 -0
  33. package/docs/RELEASE_CHECKLIST.md +51 -9
  34. package/docs/TROUBLESHOOTING.md +100 -2
  35. package/docs/assets/diagrams/forgeloop-engineering-flow.html +19 -6
  36. package/docs/assets/diagrams/forgeloop-engineering-flow.receipt.json +6 -6
  37. package/docs/assets/diagrams/forgeloop-engineering-flow.svg +5 -5
  38. package/docs/diagrams/forgeloop-engineering-flow.workflow.json +12 -2
  39. package/docs/diagrams/reviews/forgeloop-engineering-flow.review.json +3 -3
  40. package/docs/documentation-manifest.json +652 -0
  41. package/docs/protocol-requirements.json +77 -0
  42. package/package.json +19 -4
  43. package/schemas/routing-input.schema.json +14 -1
  44. package/scripts/CI_VALIDATORS.md +84 -11
  45. package/scripts/generate-agent-protocol-summary.mjs +36 -0
  46. package/src/commands/next.js +19 -7
  47. package/src/commands/route.js +5 -0
  48. package/src/commands/task-create.js +84 -25
  49. package/src/commands/task-list.js +22 -2
  50. package/src/config/guides.json +48 -0
  51. package/src/core/build-script.js +151 -0
  52. package/src/core/c-cpp-project.js +143 -0
  53. package/src/core/cli-command-definitions.js +8 -1
  54. package/src/core/command-executors.js +5 -3
  55. package/src/core/command-input.js +140 -102
  56. package/src/core/contract-presets.js +82 -0
  57. package/src/core/error-codes.js +3 -3
  58. package/src/core/filesystem.js +1 -10
  59. package/src/core/go-project.js +206 -0
  60. package/src/core/java-project.js +403 -0
  61. package/src/core/multi-language-project.js +117 -0
  62. package/src/core/next-explanation.js +63 -0
  63. package/src/core/php-project.js +85 -0
  64. package/src/core/project-detection.js +2227 -0
  65. package/src/core/reconcile-closure.js +4 -1
  66. package/src/core/router.js +233 -7
  67. package/src/core/rust-project.js +400 -0
  68. package/src/core/sql-project.js +141 -0
  69. package/src/core/swift-project.js +200 -0
  70. package/src/core/typescript-project.js +349 -0
  71. package/src/core/xml-structure.js +123 -0
package/docs/RECIPES.md CHANGED
@@ -35,6 +35,18 @@ Concise, copy-paste friendly recipes for common ForgeLoop tasks.
35
35
 
36
36
  ### Recipe 1 — Start a New Task
37
37
 
38
+ When the task shape is known but the final contract has not been written, first
39
+ request a read-only preset proposal:
40
+
41
+ ```bash
42
+ forgeloop task-create --task task-001 --claim src --claim tests \
43
+ --preset feature --preview --json
44
+ ```
45
+
46
+ Review the bounded proposal, then repeat without `--preview` before continuing
47
+ with the task workflow below. Preview creates no task namespace and acquires no
48
+ project claim lock.
49
+
38
50
  <!-- FORGELOOP EXAMPLE: recipes:create-task | exit=0 | json.taskId=task-001 -->
39
51
  ```bash
40
52
  forgeloop task-create --task task-001 --claim src --claim tests --json
@@ -243,6 +255,12 @@ forgeloop task-create --task billing-feature --claim src/billing --claim tests/b
243
255
  # 3. List active tasks
244
256
  forgeloop task-list --json
245
257
 
258
+ # 3a. Filter and page the read-only ownership-aware projection
259
+ forgeloop task-list --active --limit 20 --offset 0 --json
260
+
261
+ # 3b. Ask for a bounded blocker/recovery explanation when needed
262
+ forgeloop next --task auth-feature --explain --json
263
+
246
264
  # 4. Work on task-1
247
265
  forgeloop route --task auth-feature --work clean-code --surface backend
248
266
  forgeloop preflight --task auth-feature --json
@@ -256,6 +274,11 @@ forgeloop complete --task auth-feature --json
256
274
  forgeloop task-unlock --task auth-feature --force --json
257
275
  ```
258
276
 
277
+ `task-list` discovers all valid task namespaces before applying filters and
278
+ pagination. Its JSON response reports `total` and `hasMore`; filtering does not
279
+ skip ownership or corruption checks, and listing never deletes ledger or
280
+ recovery evidence.
281
+
259
282
  ---
260
283
 
261
284
  ### Recipe 12 — Migrate Legacy 1.0 Single-Task Layout
@@ -3,14 +3,35 @@
3
3
  This is the current release checklist for `@cassiomc1/forgeloop`. It is a
4
4
  preparation and verification checklist; it does not authorize publication.
5
5
 
6
- ## ForgeLoop 1.11.0 candidate scope
6
+ ## ForgeLoop 1.12.0 candidate scope
7
7
 
8
- The 1.11.0 candidate refreshes the public documentation architecture around
9
- the managed Repository Index and CLI-only persistent search transport. The
10
- candidate must keep these boundaries explicit:
8
+ The 1.12.0 candidate carries the first-class Flutter guide and deterministic,
9
+ scope-aware project routing added by PR #165. The candidate must keep these
10
+ boundaries explicit:
11
11
 
12
- - [ ] README architecture visual and text fallback describe CLI persistent
13
- search separately from direct Integration API/MCP access.
12
+ - [ ] README catalog and architecture fallback identify
13
+ `ENG/flutter-development-eng.md` and explain that the specialist is
14
+ selected only from a structurally parsed
15
+ `dependencies.flutter.sdk: flutter` entry in affected scope.
16
+ - [ ] README catalog and architecture fallback identify
17
+ `ENG/rust-development-eng.md` and explain that the specialist is
18
+ selected only from a structurally parsed `[package]` or `[workspace]`
19
+ table in an affected `Cargo.toml`.
20
+ - [ ] README catalog and architecture fallback identify
21
+ `ENG/nodejs-backend-development-eng.md` and explain that Node.js
22
+ backend/runtime evidence is distinct from build, test, and configuration
23
+ tooling executed under Node.js.
24
+ - [ ] README catalog and architecture fallback identify the C, C++, Java, SQL,
25
+ Go, TypeScript, PHP, and Swift specialists and explain their bounded
26
+ structural evidence and same-root composition rules.
27
+ - [ ] The canonical engineering-flow source and regenerated HTML/SVG diagram
28
+ explain project detection as routing context, not verification or
29
+ completion evidence.
30
+ - [ ] Positive clean-room package routing selects `flutter`, `clean`, and
31
+ `test` for a Flutter root.
32
+ - [ ] Documentation-only mentions, lockfiles, hosted packages, malformed
33
+ dependency shapes, symlink traversal, and unrelated monorepo roots do
34
+ not activate the Flutter specialist.
14
35
  - [ ] [`docs/REPOSITORY_INDEX.md`](./REPOSITORY_INDEX.md) and
15
36
  [`docs/PERSISTENT_SEARCH_TRANSPORT.md`](./PERSISTENT_SEARCH_TRANSPORT.md)
16
37
  agree on tgrep management, no-fallback behavior, local IPC, ownership,
@@ -24,6 +45,22 @@ This branch prepares the candidate and its pull request. npm publication,
24
45
  tagging, GitHub Release, deployment, and merge remain separately authorized
25
46
  actions.
26
47
 
48
+ ## CI minimization validation
49
+
50
+ - [ ] `npm run verify:fast` passes for edit-time feedback.
51
+ - [ ] `npm run verify:prepush` passes before the release pull request; MCP
52
+ setup, when needed, was run explicitly with `npm run mcp:setup`.
53
+ - [ ] Ordinary PR validation uses `.github/workflows/pr-core.yml` with the
54
+ unchanged required contexts `audit`, `CodeQL`, `Verify generated Archify
55
+ diagram`, `validate (22)`, `tarball smoke (ubuntu-latest)`, and
56
+ `dependency-review`.
57
+ - [ ] `validate (22)` is always present and fails closed on an applicable
58
+ prerequisite failure, cancellation, or unexpected skip.
59
+ - [ ] Path classification scenarios cover README-only, ordinary source,
60
+ Repository Index, package-export, and forced release validation.
61
+ - [ ] Main-branch documentation, Node compatibility, package smoke, audit,
62
+ and Windows full-suite workflows remain available for broader validation.
63
+
27
64
  ## Contract and package identity
28
65
 
29
66
  - [ ] `package.json` and `package-lock.json` contain the same package version.
@@ -37,6 +74,9 @@ actions.
37
74
  - [ ] [`docs/PACKAGE_CONTENTS.md`](./PACKAGE_CONTENTS.md) matches the current
38
75
  `package.json` file list and documents intentional inclusions and
39
76
  exclusions.
77
+ - [ ] The candidate tarball includes every registered specialist guide and every
78
+ other `src/config/guides.json` path; no repository-only guide state is
79
+ packaged.
40
80
  - [ ] Every maintained `src/**/*.js` module is present in the candidate
41
81
  tarball; only the four explicitly retired compatibility helpers are
42
82
  excluded.
@@ -57,7 +97,8 @@ actions.
57
97
  - [ ] Stale contract/route identity rejects handoff creation or acceptance.
58
98
  - [ ] An invalid event ledger projects `INCONSISTENT`.
59
99
  - [ ] Continuity lint remains non-authoritative and non-evidence.
60
- - [ ] `npm run dependency:policy` passes without adding runtime dependencies.
100
+ - [ ] `npm run dependency:policy` passes with only the approved exact runtime
101
+ parser dependency and approved development dependencies.
61
102
  - [ ] `npm run lint` passes.
62
103
  - [ ] `npm test` passes.
63
104
  - [ ] `npm run benchmark:profiles:check` passes; absent provider/host history
@@ -89,8 +130,9 @@ actions.
89
130
  ## Integration and cross-platform evidence
90
131
 
91
132
  - [ ] `npm run pack:check` and `npm run pack:smoke` pass.
92
- - [ ] `npm pack --dry-run` includes Repository Index runtime/manifest/docs and
93
- excludes native release binaries and derived `.forgeloop` index data.
133
+ - [ ] `npm pack --dry-run` includes the Flutter guide, Repository Index
134
+ runtime/manifest/docs, and excludes native release binaries and derived
135
+ `.forgeloop` index data.
94
136
  - [ ] The npm publication workflow runs `npm run pack:smoke` before its
95
137
  provenance-backed publish step.
96
138
  - [ ] `npm run mcp:test` either runs the configured MCP tests or reports the
@@ -7,6 +7,7 @@ This guide provides symptom-first recovery procedures for common ForgeLoop proto
7
7
  ## Quick Symptom Index
8
8
 
9
9
  - [`preflight` is `BLOCKED`](#symptom-preflight-is-blocked)
10
+ - [Project-aware .NET routing is missing](#symptom-project-aware-net-routing-is-missing)
10
11
  - [`forgeloop next` returns `RESOLVE_BLOCKER`](#symptom-forgeloop-next-returns-resolve_blocker)
11
12
  - [`forgeloop next` returns `RECORD_DIAGNOSIS`](#symptom-forgeloop-next-returns-record_diagnosis)
12
13
  - [Progress is `STALLED` or `forgeloop next` returns `CHANGE_STRATEGY`](#symptom-progress-is-stalled)
@@ -37,6 +38,7 @@ This guide provides symptom-first recovery procedures for common ForgeLoop proto
37
38
  - [Repository search fails](#symptom-repository-search-fails)
38
39
  - [Persistent search host is unavailable](#symptom-persistent-search-host-is-unavailable)
39
40
  - [Persistent search host ownership is unverified or stale](#symptom-persistent-search-host-ownership-is-unverified-or-stale)
41
+ - [Local validation tier is unavailable or reports `NOT_VERIFIED`](#symptom-local-validation-tier-is-unavailable-or-reports-not_verified)
40
42
  - [Another harness cannot resume the task](#symptom-another-harness-cannot-resume)
41
43
  - [Task claim conflict or recovered task](#symptom-task-creation-blocked-by-a-write-claim-conflict-e_task_scope_conflict)
42
44
  - [Stable Error & Reason Code Reference](#stable-error-and-reason-codes)
@@ -54,6 +56,102 @@ forgeloop protocol-info --json
54
56
  ```
55
57
  <!-- END FORGELOOP EXAMPLE -->
56
58
 
59
+ ### Symptom: local validation tier is unavailable or reports `NOT_VERIFIED`
60
+
61
+ #### What it means
62
+
63
+ The selected local validation tier could not run a required external validator
64
+ or setup prerequisite. `NOT_VERIFIED` is an explicit limitation, not a test
65
+ pass and not permission to install tools implicitly.
66
+
67
+ #### Safe recovery
68
+
69
+ 1. Check the tier and its command list with `node scripts/run-validation.mjs
70
+ --tier <fast|local|prepush|release> --list`.
71
+ 2. Run `npm run mcp:setup` explicitly when MCP dependencies are in scope and
72
+ installation is authorized.
73
+ 3. Confirm Python 3.9 or newer is available for the frozen validators.
74
+ 4. Re-run the tier and record any still-unavailable check as `NOT_VERIFIED` in
75
+ the validation report.
76
+
77
+ The ordinary PR workflow remains path-aware and always publishes the required
78
+ status contexts; its `validate (22)` aggregator fails closed on an applicable
79
+ job failure, cancellation, or unexpected skip. Local success cannot substitute
80
+ for a required remote security or cross-platform check.
81
+
82
+ ### Symptom: the Node.js test suite is slow locally
83
+
84
+ #### Inspect
85
+
86
+ Use the fast, watch, and CI-specific entry points before running the full
87
+ coverage gate:
88
+
89
+ ```bash
90
+ npm run test:quick
91
+ npm run test:watch
92
+ npm run test:ci
93
+ npm run coverage
94
+ ```
95
+
96
+ `npm test` remains the complete no-coverage suite. `test:ci` runs the same
97
+ discovered files with a two-worker cap for small CI runners; it does not remove
98
+ tests or change assertions. Local coverage remains an explicit command because
99
+ instrumentation adds measurable overhead; the PR unit lane wraps that same
100
+ `test:ci` process across four deterministic shards, then aggregates coverage
101
+ without running the suite again. Docs-only changes run the quick suite only on
102
+ the first Node 24 shard; the other shards and the Node 20 lane do not install.
103
+
104
+ #### Native Windows guidance
105
+
106
+ Repeated Node process startup can be slowed by Windows Defender scanning the
107
+ repository and dependency tree. If local policy permits, request narrowly
108
+ scoped exclusions for the trusted `node.exe`, this repository root, and its
109
+ `node_modules` directory. Never disable Defender globally or exclude an
110
+ untrusted path. WSL2 can be used when native Windows remains slow, while
111
+ Windows CI continues to cover native path and process behavior.
112
+
113
+ ### Symptom: Project-aware .NET routing is missing
114
+
115
+ #### What it means
116
+
117
+ The route command did not find confirmed, affected SDK-style .NET project
118
+ evidence, or the task scope does not reach the confirmed project root. ASP.NET
119
+ Core and ABP are conditional overlays on the `dotnet` specialist; they are not
120
+ standalone guides.
121
+
122
+ #### Inspect
123
+
124
+ ```bash
125
+ forgeloop route --task <task-id> --work code --surface backend --json
126
+ forgeloop task-show --task <task-id> --json
127
+ ```
128
+
129
+ Then inspect the affected scope for a structurally valid `*.csproj`, `*.fsproj`,
130
+ or `*.vbproj` using the supported SDK allowlist. ASP.NET Core requires a web,
131
+ Razor, or Blazor SDK or a `FrameworkReference Include="Microsoft.AspNetCore.App"`.
132
+ ABP requires a structural `PackageReference Include="Volo.Abp..."` in the
133
+ confirmed .NET project.
134
+
135
+ #### Common causes
136
+
137
+ - The repository contains only prose, source snippets, Dockerfiles, lockfiles,
138
+ package names, or a malformed/oversized/non-SDK-style project file.
139
+ - A write claim points outside the project root, outside the applicable shared
140
+ `Directory.Build.*`/NuGet scope, or at a non-member of the named `.sln`/`.slnx`.
141
+ - A mixed Flutter/.NET monorepo was treated as one root; nested project roots
142
+ remain isolated.
143
+ - `projectEvidence.frameworks` contains `aspnetcore` or `abp` without
144
+ `dotnet`; route validation rejects that input.
145
+
146
+ #### Safe recovery
147
+
148
+ Do not add a manual `projectEvidence` claim to force specialist activation.
149
+ Correct the task scope or project structure, rerun the canonical route command,
150
+ and inspect its reason/exclusion codes. Project discovery is bounded and
151
+ non-symlinked; budget exhaustion fails closed. See
152
+ [`GUIDE_ROUTER.md`](../GUIDE_ROUTER.md) for the exact limits and reason-code
153
+ contract.
154
+
57
155
  ### Symptom: `preflight` is `BLOCKED`
58
156
 
59
157
  #### What it means
@@ -1332,7 +1430,7 @@ package/process recovery boundary. The relevant stable codes are
1332
1430
  | `E_RECONCILE_EVIDENCE_FAILED` | The executed objective-satisfaction evidence command did not pass. | Inspect the execution artifact; reconciliation is refused until evidence passes in the current repository. |
1333
1431
  | `E_RECONCILE_LEDGER_INVALID` | The append-only event ledger is not valid, so reconciliation cannot be recorded. | Inspect the ledger errors and repair before reconciling. |
1334
1432
  | `E_RECONCILE_NOT_STALE` | reconcile-closure was invoked for a work-state checkpoint that is already fresh. | No reconciliation is required; continue the normal lifecycle. |
1335
- | `E_RECONCILE_PHASE_INVALID` | reconcile-closure was invoked for a task that is not EXECUTING or VERIFYING. | reconcile-closure supports EXECUTING or VERIFYING tasks whose objective is already satisfied. |
1433
+ | `E_RECONCILE_PHASE_INVALID` | reconcile-closure was invoked for a task that is not EXECUTING, VERIFYING, or REVIEWING. | reconcile-closure supports EXECUTING, VERIFYING, or REVIEWING tasks whose objective is already satisfied. |
1336
1434
  | `E_RECONCILE_REQUIREMENT_UNKNOWN` | The supplied check id and requirement text do not exactly match a contract verification item of type VERIFICATION. | Supply the exact id and requirement text of an existing contract verification item. |
1337
1435
  | `E_RECONCILE_UNSUPPORTED_DRIFT` | Work-state drift includes kinds other than REPOSITORY_CHANGED (contract or required-artifact drift). | Resolve contract or artifact drift through their dedicated recovery surfaces; reconcile-closure only refreshes repository fingerprint drift. |
1338
1436
  | `E_REPOSITORY_CHANGED` | The repository fingerprint (branch or HEAD) moved after the work-state checkpoint was recorded. | If the task objective is already satisfied in the current repository, run forgeloop reconcile-closure; otherwise resume from a checkpoint that matches the current repository. |
@@ -1372,7 +1470,7 @@ package/process recovery boundary. The relevant stable codes are
1372
1470
  | `E_STATE_LEDGER_DIVERGENCE` | A ForgeLoop protocol validation or lifecycle condition was not satisfied. | Inspect the structured command result, correct the named artifact or prerequisite, then run forgeloop next --json. |
1373
1471
  | `E_STATE_MISSING` | A ForgeLoop protocol validation or lifecycle condition was not satisfied. | Inspect the structured command result, correct the named artifact or prerequisite, then run forgeloop next --json. |
1374
1472
  | `E_STATE_MISSING_AFTER_PREFLIGHT_READY` | A ForgeLoop protocol validation or lifecycle condition was not satisfied. | Inspect the structured command result, correct the named artifact or prerequisite, then run forgeloop next --json. |
1375
- | `E_STATE_REVALIDATION_REQUIRED` | The work-state checkpoint must be revalidated before the lifecycle can continue. | Run forgeloop reconcile-closure for externally satisfied EXECUTING tasks, or inspect the freshness reasons for other drift. |
1473
+ | `E_STATE_REVALIDATION_REQUIRED` | The work-state checkpoint must be revalidated before the lifecycle can continue. | Run forgeloop reconcile-closure for externally satisfied EXECUTING, VERIFYING, or REVIEWING tasks, or inspect the freshness reasons for other drift. |
1376
1474
  | `E_STATE_TASK_MISMATCH` | A ForgeLoop protocol validation or lifecycle condition was not satisfied. | Inspect the structured command result, correct the named artifact or prerequisite, then run forgeloop next --json. |
1377
1475
  | `E_STRATEGY_OSCILLATION` | Correction history oscillates between previously exhausted strategies without new information. | Gather a genuinely new observation or test a materially different falsifiable hypothesis. |
1378
1476
  | `E_STRUCTURAL_QUALITY_BASELINE_BINDING_MISMATCH` | Structural-quality evidence did not satisfy its provider, artifact, comparison, or lifecycle boundary. | Reconcile contract, route, policy, scope, provider, or rules drift before using the baseline. |
@@ -1,7 +1,7 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en" data-theme="dark" data-preset="signal-flow" data-present="true">
3
3
  <head>
4
- <meta name="forgeloop-diagram-source-sha256" content="0bfd5bbf8d6bbeaec23db543deb1e99844321c77b3c7feb21ee0cc877bbba9a9">
4
+ <meta name="forgeloop-diagram-source-sha256" content="3c35fbe4e144cd7fb60632996839bcf32b0b503e8a4add2270f29c3bf3e8a658">
5
5
  <meta name="forgeloop-diagram-renderer" content="archify@2.15.0 (e1ac748f19cf805e44bf74fb93c796662152e273)">
6
6
  <meta charset="UTF-8">
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -4874,7 +4874,7 @@
4874
4874
  <div class="pulse-dot"></div>
4875
4875
  <h1>ForgeLoop Evidence-First Engineering Flow</h1>
4876
4876
  </div>
4877
- <p class="subtitle">Structured intent → project-bound work → observed evidence → valid closure</p>
4877
+ <p class="subtitle">Structured intent → deterministic project scope → observed evidence → valid closure</p>
4878
4878
  </div>
4879
4879
 
4880
4880
  <script id="archify-guided-views-data" type="application/json">[{"id":"contract-to-work","label":"Contract to work","focus":["request","profile","contract","route","gates","preflight","work"],"note":"Structured obligations and explicit risks set the profile; exclusions do not create required actions."},{"id":"evidence-to-close","label":"Evidence to close","focus":["work","evidence","review","valid"],"note":"See the evidence and review boundary that makes completion trustworthy."},{"id":"recovery-loop","label":"Recovery loop","focus":["evidence","diagnose","correct","preflight","blocked"],"note":"Before execution, blocked refresh needs a valid ledger and revised route. Later failures use diagnosis and correction."}]</script>
@@ -4922,7 +4922,7 @@
4922
4922
  <div class="diagram-container" data-detail-level="read">
4923
4923
  <svg viewBox="0 0 850 900" role="img" aria-labelledby="archify-diagram-title archify-diagram-description" data-animation="trace" data-preset="signal-flow" data-quality-profile="showcase">
4924
4924
  <title id="archify-diagram-title">ForgeLoop Evidence-First Engineering Flow</title>
4925
- <desc id="archify-diagram-description">Structured intent → project-bound work → observed evidence → valid closure</desc>
4925
+ <desc id="archify-diagram-description">Structured intent → deterministic project scope → observed evidence → valid closure</desc>
4926
4926
  <!-- Definitions -->
4927
4927
  <defs>
4928
4928
  <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
@@ -5012,15 +5012,15 @@
5012
5012
  <text data-detail="context" x="88" y="131" class="t-muted" font-size="8" text-anchor="middle">intent</text>
5013
5013
  </g>
5014
5014
 
5015
- <g id="node-profile" data-node-id="profile" data-node-label="Profile" tabindex="0" role="button" aria-label="Focus Profile, discover, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="backend" data-node-sublabel="discover" data-node-context="Intent + Context › Discover + scope">
5016
- <title>Profile · discover · Intent + Context › Discover + scope</title>
5015
+ <g id="node-profile" data-node-id="profile" data-node-label="Profile" tabindex="0" role="button" aria-label="Focus Profile, scope, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="backend" data-node-sublabel="scope" data-node-context="Intent + Context › Discover + scope">
5016
+ <title>Profile · scope · Intent + Context › Discover + scope</title>
5017
5017
  <rect x="195" y="93" width="50" height="52" rx="6" class="c-mask"/>
5018
5018
  <rect x="195" y="93" width="50" height="52" rx="6" class="c-backend" data-animate="node" style="--step:1" stroke-width="1.5"/>
5019
5019
  <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(201 99) scale(0.6875)">
5020
5020
  <path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
5021
5021
  </g>
5022
5022
  <text data-detail-anchor x="220" y="114" class="t-primary" font-size="10" font-weight="600" text-anchor="middle">Profile</text>
5023
- <text data-detail="context" x="220" y="131" class="t-muted" font-size="8" text-anchor="middle">discover</text>
5023
+ <text data-detail="context" x="220" y="131" class="t-muted" font-size="8" text-anchor="middle">scope</text>
5024
5024
  </g>
5025
5025
 
5026
5026
  <g id="node-contract" data-node-id="contract" data-node-label="Contract" tabindex="0" role="button" aria-label="Focus Contract, scope, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="security" data-node-sublabel="scope" data-node-tag="saved" data-node-context="Intent + Context › Discover + scope">
@@ -5396,6 +5396,19 @@
5396
5396
  </ul>
5397
5397
  </div>
5398
5398
 
5399
+ <div class="card">
5400
+ <div class="card-header">
5401
+ <div class="card-dot amber"></div>
5402
+ <h3>Deterministic project routing</h3>
5403
+ </div>
5404
+ <ul>
5405
+ <li>&bull; Repository evidence feeds bounded project and surface detection</li>
5406
+ <li>&bull; A parsed dependencies.flutter.sdk: flutter entry proves Flutter project scope</li>
5407
+ <li>&bull; The router selects the Flutter specialist only for an affected scoped root</li>
5408
+ <li>&bull; Detection context is routing input, not verification or completion evidence</li>
5409
+ </ul>
5410
+ </div>
5411
+
5399
5412
  <div class="card">
5400
5413
  <div class="card-header">
5401
5414
  <div class="card-dot cyan"></div>
@@ -15,17 +15,17 @@
15
15
  "license": "MIT"
16
16
  },
17
17
  "input": {
18
- "sha256": "0bfd5bbf8d6bbeaec23db543deb1e99844321c77b3c7feb21ee0cc877bbba9a9",
19
- "bytes": 9779
18
+ "sha256": "3c35fbe4e144cd7fb60632996839bcf32b0b503e8a4add2270f29c3bf3e8a658",
19
+ "bytes": 10229
20
20
  },
21
21
  "artifacts": {
22
22
  "html": {
23
- "sha256": "251e09f3cc36d54c4b8567dd3e6dd8a890a2621cdd12667fb80cc61e7dbf4b7c",
24
- "bytes": 648281
23
+ "sha256": "26e82be933acaca0d7f07e917413d87135b901195aef22bd42ef974fe1548ad3",
24
+ "bytes": 648893
25
25
  },
26
26
  "svg": {
27
- "sha256": "ef3effe7e756494c7dffef9ee315e970bbbdb9fddc0ee0a1e4bfccfbb0c05534",
28
- "bytes": 211373
27
+ "sha256": "040fc511d09be1532ff7173baf46a98503e89734460a516582426aa426eea888",
28
+ "bytes": 211370
29
29
  }
30
30
  },
31
31
  "staticSvg": {
@@ -1,4 +1,4 @@
1
- <svg data-archify-version="2.15.0" data-forgeloop-source-sha256="0bfd5bbf8d6bbeaec23db543deb1e99844321c77b3c7feb21ee0cc877bbba9a9" data-theme="dark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 850 900" role="img" aria-labelledby="archify-diagram-title archify-diagram-description" data-animation="trace" data-preset="signal-flow" data-quality-profile="showcase">
1
+ <svg data-archify-version="2.15.0" data-forgeloop-source-sha256="3c35fbe4e144cd7fb60632996839bcf32b0b503e8a4add2270f29c3bf3e8a658" data-theme="dark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 850 900" role="img" aria-labelledby="archify-diagram-title archify-diagram-description" data-animation="trace" data-preset="signal-flow" data-quality-profile="showcase">
2
2
  <style>
3
3
  .c-bg-rect { fill: var(--bg); }
4
4
  /* Keep boundary labels clear of the first node in each group. */
@@ -4732,7 +4732,7 @@
4732
4732
  </style>
4733
4733
  <rect width="100%" height="100%" class="c-bg-rect" />
4734
4734
  <title id="archify-diagram-title">ForgeLoop Evidence-First Engineering Flow</title>
4735
- <desc id="archify-diagram-description">Structured intent → project-bound work → observed evidence → valid closure</desc>
4735
+ <desc id="archify-diagram-description">Structured intent → deterministic project scope → observed evidence → valid closure</desc>
4736
4736
  <!-- Definitions -->
4737
4737
  <defs>
4738
4738
  <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
@@ -4822,15 +4822,15 @@
4822
4822
  <text data-detail="context" x="88" y="131" class="t-muted" font-size="8" text-anchor="middle">intent</text>
4823
4823
  </g>
4824
4824
 
4825
- <g id="node-profile" data-node-id="profile" data-node-label="Profile" tabindex="0" role="button" aria-label="Focus Profile, discover, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="backend" data-node-sublabel="discover" data-node-context="Intent + Context › Discover + scope">
4826
- <title>Profile · discover · Intent + Context › Discover + scope</title>
4825
+ <g id="node-profile" data-node-id="profile" data-node-label="Profile" tabindex="0" role="button" aria-label="Focus Profile, scope, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="backend" data-node-sublabel="scope" data-node-context="Intent + Context › Discover + scope">
4826
+ <title>Profile · scope · Intent + Context › Discover + scope</title>
4827
4827
  <rect x="195" y="93" width="50" height="52" rx="6" class="c-mask"/>
4828
4828
  <rect x="195" y="93" width="50" height="52" rx="6" class="c-backend" data-animate="node" style="--step:1" stroke-width="1.5"/>
4829
4829
  <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(201 99) scale(0.6875)">
4830
4830
  <path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
4831
4831
  </g>
4832
4832
  <text data-detail-anchor="true" x="220" y="114" class="t-primary" font-size="10" font-weight="600" text-anchor="middle">Profile</text>
4833
- <text data-detail="context" x="220" y="131" class="t-muted" font-size="8" text-anchor="middle">discover</text>
4833
+ <text data-detail="context" x="220" y="131" class="t-muted" font-size="8" text-anchor="middle">scope</text>
4834
4834
  </g>
4835
4835
 
4836
4836
  <g id="node-contract" data-node-id="contract" data-node-label="Contract" tabindex="0" role="button" aria-label="Focus Contract, scope, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="security" data-node-sublabel="scope" data-node-tag="saved" data-node-context="Intent + Context › Discover + scope">
@@ -3,7 +3,7 @@
3
3
  "diagram_type": "workflow",
4
4
  "meta": {
5
5
  "title": "ForgeLoop Evidence-First Engineering Flow",
6
- "subtitle": "Structured intent \u2192 project-bound work \u2192 observed evidence \u2192 valid closure",
6
+ "subtitle": "Structured intent \u2192 deterministic project scope \u2192 observed evidence \u2192 valid closure",
7
7
  "animation": "trace",
8
8
  "visual_preset": "signal-flow",
9
9
  "quality_profile": "showcase",
@@ -180,7 +180,7 @@
180
180
  "col": 1,
181
181
  "type": "backend",
182
182
  "label": "Profile",
183
- "sublabel": "discover",
183
+ "sublabel": "scope",
184
184
  "width": 50
185
185
  },
186
186
  {
@@ -419,6 +419,16 @@
419
419
  "Blocked pre-execution refresh requires a valid ledger and revised route"
420
420
  ]
421
421
  },
422
+ {
423
+ "dot": "amber",
424
+ "title": "Deterministic project routing",
425
+ "items": [
426
+ "Repository evidence feeds bounded project and surface detection",
427
+ "A parsed dependencies.flutter.sdk: flutter entry proves Flutter project scope",
428
+ "The router selects the Flutter specialist only for an affected scoped root",
429
+ "Detection context is routing input, not verification or completion evidence"
430
+ ]
431
+ },
422
432
  {
423
433
  "dot": "cyan",
424
434
  "title": "Evidence contract",
@@ -3,8 +3,8 @@
3
3
  "diagramId": "forgeloop-engineering-flow",
4
4
  "status": "approved",
5
5
  "binding": {
6
- "sourceSha256": "0bfd5bbf8d6bbeaec23db543deb1e99844321c77b3c7feb21ee0cc877bbba9a9",
7
- "svgSha256": "ef3effe7e756494c7dffef9ee315e970bbbdb9fddc0ee0a1e4bfccfbb0c05534"
6
+ "sourceSha256": "3c35fbe4e144cd7fb60632996839bcf32b0b503e8a4add2270f29c3bf3e8a658",
7
+ "svgSha256": "040fc511d09be1532ff7173baf46a98503e89734460a516582426aa426eea888"
8
8
  },
9
9
  "checks": {
10
10
  "darkThemeLegible": true,
@@ -16,5 +16,5 @@
16
16
  "accessibleMetadataPresent": true
17
17
  },
18
18
  "reviewedBy": "Codex visual review",
19
- "reviewedAt": "2026-09-05"
19
+ "reviewedAt": "2026-09-09"
20
20
  }