@cassiomc1/forgeloop 1.11.0 → 1.12.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/GUIDE_ROUTER.md CHANGED
@@ -52,6 +52,7 @@ project commands.
52
52
  | `accessibility` | [Accessibility](./ENG/accessibility-eng.md) | WCAG, keyboard access, focus, semantics, and assistive technology |
53
53
  | `games` | [Web games](./ENG/games-code-design-web-eng.md) | Architecture and operation of 2D, 3D, and procedural web games |
54
54
  | `documentation` | [Documentation quality](./ENG/documentation-quality-eng.md) | Accuracy, architecture, freshness, accessibility, and verifiable technical documentation |
55
+ | `flutter` | [Flutter application engineering](./ENG/flutter-development-eng.md) | Architecture, implementation, testing, performance, accessibility, platform integration, and release of production Flutter applications |
55
56
 
56
57
  ## Domain rules
57
58
 
@@ -205,6 +206,22 @@ rg -n '^## |accuracy|completeness|Diátaxis|tutorial|how-to|reference|explanatio
205
206
 
206
207
  **Expected evidence:** documentation purpose and audience are clear, factual claims are cross-checked against canonical project sources, changed documentation surfaces are complete, relevant examples/links/builds are validated when available, and unavailable required checks are recorded as `NOT_VERIFIED`.
207
208
 
209
+ ### `flutter` — Flutter application engineering
210
+
211
+ **Activate when:** a confirmed project root has a structurally parsed `pubspec.yaml` with `dependencies.flutter.sdk: flutter`, and the task scope intersects that root. Once the root is confirmed, every claim under it matches, including lockfiles, localization/configuration files, source, tooling, and native platform configuration; confirmed nested project roots remain isolated. The guide then provides the Flutter-specific architecture, implementation, testing, performance, accessibility, platform integration, and release context.
212
+
213
+ **Do not activate merely because:** prose, Markdown, a lockfile, a transitive package name, an arbitrary directory name, a hosted package named `flutter`, or an unrelated monorepo project mentions Flutter. `flutter_test` and platform/source signals are supporting evidence only; they cannot replace the primary SDK dependency signal.
214
+
215
+ **Usually combine with:** `clean` and `test`; add `design`, `accessibility`, `security`, or `performance` when the affected surface or risk requires them.
216
+
217
+ The route command obtains this evidence from `src/core/project-detection.js`. It walks bounded, non-symlinked project manifests, parses dependency structure, and matches task write claims against confirmed project roots. An unscoped route can inspect all detected projects; an explicit claim that does not reach a Flutter project produces `NO_FLUTTER_SCOPE_MATCH` and does not activate the guide. Documentation and UI-copy exclusions remain routing decisions, not project-detection heuristics.
218
+
219
+ ```bash
220
+ rg -n '^## |architecture|testing|performance|accessibility|platform|release|Flutter' ENG/flutter-development-eng.md
221
+ ```
222
+
223
+ **Expected evidence:** a confirmed affected Flutter project, a scoped route, platform-appropriate tests, measured performance or accessibility checks when relevant, and honest `NOT_VERIFIED` reporting for unavailable Flutter tooling.
224
+
208
225
  ## Work-type matrix
209
226
 
210
227
  | Work | Primary guide | Common complements | Exclude when |
@@ -214,6 +231,7 @@ rg -n '^## |accuracy|completeness|Diátaxis|tutorial|how-to|reference|explanatio
214
231
  | Code or bug without UI | `clean` | `test`; risk may add `security` or `performance` | The surface is unchanged |
215
232
  | Backend, API, or data | `clean` | `test`, `security`; `performance` for a critical path | That layer does not exist |
216
233
  | Web, mobile, or desktop UI | `design` | `accessibility`, `clean`, `test`; risk defines the rest | Users cannot observe the change |
234
+ | Flutter application | `flutter` | `clean`, `test`; add `design`, `accessibility`, `security`, or `performance` as applicable | No primary Flutter SDK dependency in the affected project scope |
217
235
  | Complete website | `premium` | `design`, `accessibility`, `clean`, `test`, `security`, `performance` | The deliverable is not a complete site |
218
236
  | Web game | `games` | `clean`, `test`, `security`, `performance`, `accessibility`; `design` with UI | The product is not a game |
219
237
  | HTML video or motion | `design` | `accessibility`, `performance`, `test`, `security` | There is no audiovisual composition |
@@ -226,7 +244,9 @@ HyperFrames is optional and may be used only when requested or already available
226
244
  The active agent may classify natural language, but it must pass declared
227
245
  signals to the deterministic evaluator in `src/core/router.js`. The evaluator
228
246
  does not parse natural language, call a model, or infer a stack from a word in
229
- the repository.
247
+ the repository. `runRoute` may also pass `projectEvidence` from
248
+ `src/core/project-detection.js`; that evidence is produced by structural
249
+ manifest parsing and scope intersection, not by prose or model confidence.
230
250
 
231
251
  The first routing contract is versioned as `schemaVersion: 1`. It accepts:
232
252
 
@@ -243,19 +263,28 @@ The first routing contract is versioned as `schemaVersion: 1`. It accepts:
243
263
  - `platforms`: `web`, `mobile`, `desktop`, `server`, `ci`, or
244
264
  `cross-platform`;
245
265
  - optional boolean `behaviorChange` and `executableChange` signals.
266
+ - optional `projectEvidence` with a schema version, a scope result, detected
267
+ framework IDs, affected project roots, primary signals, and supporting
268
+ signals. The current framework ID is `flutter`; its primary signal is an
269
+ affected `dependencies.flutter.sdk: flutter` entry in `pubspec.yaml`.
246
270
 
247
271
  Rule precedence is deterministic: the work type establishes the primary
248
272
  closure; affected surfaces add mandatory complements; risks add security,
249
273
  performance, or accessibility; executable/behavior changes add clean and
250
274
  test; required rules win over optional exclusions; and the evaluator preserves
251
- canonical insertion order. Unknown or duplicate signals fail with a routing
252
- error.
275
+ canonical insertion order. A matching Flutter project adds `flutter` plus the
276
+ `clean`/`test` baseline before ordinary work-type complements; documentation
277
+ and UI-copy work do not activate the specialist. Unknown or duplicate signals
278
+ fail with a routing error.
253
279
 
254
280
  Every selected guide has stable reason codes such as
255
281
  `WORK_COMPLETE_WEBSITE`, `SURFACE_UI`, `RISK_UNTRUSTED_INPUT`, and
256
282
  `CHANGE_EXECUTABLE_CONFIG`. Exclusions use stable codes such as
257
283
  `NO_TRUST_BOUNDARY`, `NO_MEASURABLE_PERFORMANCE_RISK`, and
258
- `NO_DOCUMENTATION_SURFACE`.
284
+ `NO_DOCUMENTATION_SURFACE`. Flutter uses
285
+ `PROJECT_FLUTTER_SDK_DEPENDENCY`, `PROJECT_FLUTTER_BASELINE`,
286
+ `NO_FLUTTER_PRIMARY_EVIDENCE`, `NO_FLUTTER_SCOPE_MATCH`, and
287
+ `NO_FLUTTER_EXECUTABLE_WORK`.
259
288
 
260
289
  Platform signals are contextual, not automatic guide activators:
261
290
 
@@ -280,6 +309,10 @@ Negative routing guarantees:
280
309
  - a backend refactor does not activate `design` or `accessibility`;
281
310
  - static UI copy does not activate `security` without a trust-boundary signal;
282
311
  - a package file alone does not prove that Node is an affected task surface;
312
+ - `flutter_test`, a Flutter word in documentation, or a lockfile package does
313
+ not replace the primary Flutter SDK dependency signal;
314
+ - an unrelated monorepo project does not activate Flutter when task claims do
315
+ not intersect its confirmed project root; nested project roots remain isolated;
283
316
  - an explicit executable-change signal adds `clean` and `test` even when the
284
317
  semantic work type is documentation.
285
318
 
@@ -323,6 +356,15 @@ Verify the game loop, authoritative server, reconciliation, input, assets, fallb
323
356
 
324
357
  Verify Markdown, links, paths, commands, and examples.
325
358
 
359
+ ### Flutter application feature
360
+
361
+ <!-- route:flutter-app-feature=flutter,clean,test -->
362
+
363
+ Verify the affected `pubspec.yaml` contains the Flutter SDK dependency, confirm
364
+ the task claim reaches that project, and cover widget/state behavior, platform
365
+ integration, accessibility, performance, and release checks according to the
366
+ changed surface. Supporting signals alone must leave `flutter` excluded.
367
+
326
368
  ## Route changes
327
369
 
328
370
  If investigation reveals a new surface, update the guide set before editing that area. Record only the concise reason; do not create a versioned task log.
@@ -242,7 +242,7 @@ presented as a completed protocol state.
242
242
 
243
243
  ### `ENG/*.md`
244
244
 
245
- Nine canonical guides cover:
245
+ Eleven canonical guides cover:
246
246
 
247
247
  - clean code;
248
248
  - testing;
@@ -252,7 +252,9 @@ Nine canonical guides cover:
252
252
  - accessibility;
253
253
  - premium website production;
254
254
  - web games;
255
- - contextual frontend taste.
255
+ - contextual frontend taste;
256
+ - technical documentation quality;
257
+ - Flutter application engineering.
256
258
 
257
259
  Each guide has exact English frontmatter and a stable guide ID.
258
260
 
@@ -265,6 +267,7 @@ Records external provenance, trademarks, licenses, and reuse boundaries. It is r
265
267
  | Work type | Guide set |
266
268
  | --- | --- |
267
269
  | Documentation | Related domain and documentation checks |
270
+ | Flutter application | `flutter` with `clean` and `test`; add surface-specific guides as needed |
268
271
  | General code or bug fix | `clean`, `test`; add `security` or `performance` when the surface requires it |
269
272
  | Backend, API, authentication, or data | `clean`, `test`, `security`; add `performance` for critical paths |
270
273
  | Web, mobile, or desktop interface | `clean`, `test`, `design`, `accessibility`; add `security` and `performance` according to product risk |
@@ -418,7 +421,7 @@ The documentation workflow verifies:
418
421
 
419
422
  - every file referenced by an adapter exists;
420
423
  - repository-relative links resolve;
421
- - exactly nine canonical English guides exist;
424
+ - exactly eleven canonical English guides exist;
422
425
  - guide IDs, filenames, frontmatter keys, and `language: en` match the catalog;
423
426
  - no legacy language tree or bilingual metadata remains;
424
427
  - all route contracts contain valid guide IDs;
@@ -428,14 +431,15 @@ The documentation workflow verifies:
428
431
  - secrets and credential-like assignments are absent;
429
432
  - `THIRD_PARTY_NOTICES.md` is present.
430
433
 
431
- The validator also exercises six routing scenarios:
434
+ The validator also exercises seven routing scenarios:
432
435
 
433
436
  1. premium landing page;
434
437
  2. authenticated API;
435
438
  3. bug fix without UI;
436
439
  4. mobile app with UI;
437
440
  5. multiplayer web game;
438
- 6. documentation-only change.
441
+ 6. documentation-only change;
442
+ 7. Flutter application feature with a primary SDK dependency signal.
439
443
 
440
444
  ## Distribution
441
445
 
@@ -527,7 +531,7 @@ is orthogonal to lifecycle phases and does not authorize the receiving harness.
527
531
  - The repository and its maintained content are English-only.
528
532
  - Common project instruction surfaces and generic bootstrap mechanisms have a
529
533
  documented entry into one canonical loop.
530
- - The router selects every relevant guide and excludes irrelevant guides in the six defined scenarios.
534
+ - The router selects every relevant guide and excludes irrelevant guides in the seven defined scenarios.
531
535
  - The profile contains verifiable facts, sources, and real commands without secrets.
532
536
  - The loop requires evidence before completion claims and exits safely when blocked.
533
537
  - Structural, Markdown, link, and secret checks pass locally and in CI.
@@ -94,6 +94,7 @@ are both present:
94
94
  | Dimension | Implementation evidence | Executable evidence |
95
95
  | --- | --- | --- |
96
96
  | Routing | `src/core/router.js`, route schemas, stable reason codes, and exclusions | `tests/router.test.js`, `tests/fixtures/routes/` |
97
+ | Flutter project detection and routing | `src/core/project-detection.js`, `src/core/router.js`, `src/config/guides.json`, and scoped manifest evidence | `tests/project-detection.test.js`, `tests/guide-registry.test.js`, `tests/router.test.js` |
97
98
  | Observability | `src/core/receipt.js`, `src/core/inspect.js`, `src/core/evidence.js`, and schema health | `tests/observability.test.js`, `tests/receipt-semantics.test.js`, `tests/schema-health.test.js` |
98
99
  | Resume/checkpoint | `src/core/work-state.js`, `EXECUTION_STATE.md`, shared loaded-state classifier, contract/artifact classifiers, and atomic writes | `tests/work-state.test.js`, `tests/checkpoint-freshness.test.js`, status, validate-state, and validate-protocol tests |
99
100
  | Delegation | `src/core/delegation.js`, delegation-set validator, and `DELEGATION_PROTOCOL.md` | `tests/delegation.test.js`, `tests/delegation-set.test.js` |
package/README.md CHANGED
@@ -45,16 +45,11 @@ relevant guides.
45
45
 
46
46
  ## Real execution proof
47
47
 
48
- ForgeLoop includes a public real-execution PoC with the workload,
49
- protocol artifacts, trusted command provenance, execution receipt,
50
- event history, cryptographic evidence manifest, and technical audit.
48
+ Public [execution PoC](./poc/README.md) covers workload, protocol
49
+ artifacts, trusted provenance, receipts, evidence, and audit. It reached
50
+ validator-backed `COMPLETE / VALID` and preserves a later
51
+ `E_RECEIPT_PATH_MISMATCH` after publication changed the repository.
51
52
 
52
- The original task reached validator-backed `COMPLETE / VALID`.
53
- The evidence package also preserves a later
54
- `E_RECEIPT_PATH_MISMATCH`, detected after evidence publication itself
55
- changed the repository.
56
-
57
- - [PoC overview](./poc/README.md)
58
53
  - [Canonical technical audit](./poc/reports/poc-20260826-real-execution-technical-audit-v2.md)
59
54
  - [Evidence package](./poc/evidence/poc-20260826-real-execution/)
60
55
 
@@ -72,10 +67,14 @@ changed the repository.
72
67
  | Accessibility | [`ENG/accessibility-eng.md`](./ENG/accessibility-eng.md) |
73
68
  | Web games | [`ENG/games-code-design-web-eng.md`](./ENG/games-code-design-web-eng.md) |
74
69
  | Documentation quality | [`ENG/documentation-quality-eng.md`](./ENG/documentation-quality-eng.md) |
70
+ | Flutter | [guide](./ENG/flutter-development-eng.md) |
75
71
  | Structural quality feedback | [`docs/STRUCTURAL_QUALITY.md`](./docs/STRUCTURAL_QUALITY.md) |
76
72
 
77
- Each guide declares its name, language, version, and review date in
78
- frontmatter. Repository validators keep the catalog and metadata synchronized.
73
+ Guide metadata is validator-checked.
74
+
75
+ Parsed `pubspec.yaml` with `dependencies.flutter.sdk: flutter` selects
76
+ Flutter; mentions, lockfiles, hosted packages, and unrelated monorepos do not.
77
+ See [guide](./ENG/flutter-development-eng.md).
79
78
 
80
79
  ## Quickstart
81
80
 
@@ -459,9 +458,11 @@ and [visual review](./docs/diagrams/reviews/forgeloop-code-attestation-flow.revi
459
458
  show exact content binding, optional signing, and separate revision-range
460
459
  coverage.
461
460
 
462
- Text-only fallback: discovery creates the contract and route; required gates
463
- and `PREFLIGHT_READY` authorize execution; verification creates structured
464
- evidence; failures enter diagnosis and correction; review precedes
461
+ Text-only fallback: discovery creates the contract and route; parsed
462
+ `dependencies.flutter.sdk: flutter` selects Flutter for that root; routing is
463
+ not verification/completion evidence. Gates and
464
+ `PREFLIGHT_READY` authorize execution; verification creates
465
+ structured evidence; failures enter diagnosis and correction; review precedes
465
466
  validator-backed completion. Drift reopens verification, and migration keeps
466
467
  modified or unmanaged files for review. The terminal result is one of
467
468
  `VALID`, `INCOMPLETE`, `STALE`, `INCONSISTENT`, or `INVALID`.
@@ -7,7 +7,7 @@
7
7
  ForgeLoop is a portable protocol and support CLI for verifiable engineering workflows. It records and validates task state, contracts, routing, checks, evidence, continuity, and optional code attestations. It does not become an agent scheduler, delegation service, source-control authority, or secret manager.
8
8
 
9
9
  Protocol version: 1
10
- Package version: 1.11.0
10
+ Package version: 1.12.0
11
11
 
12
12
  ## Canonical loop
13
13
 
@@ -838,7 +838,7 @@ Updates the managed instruction kit to match the current ForgeLoop package versi
838
838
 
839
839
  Calculates and persists deterministic engineering guide routing.
840
840
 
841
- - **Purpose**: Selects relevant technical guides (e.g. `clean`, `test`, `security`, `design`) based on declared work attributes.
841
+ - **Purpose**: Selects relevant technical guides (e.g. `clean`, `test`, `security`, `design`) from declared work attributes and bounded structural project evidence such as an affected Flutter SDK dependency.
842
842
  - **When to use**: During discovery before preflight.
843
843
  - **Mutation**: Writes `.forgeloop/task-state/<taskKey>/routing-result.json`.
844
844
  - **Options**:
package/docs/MCP.md CHANGED
@@ -150,7 +150,7 @@ forgeloop-mcp-http --project /repo --mode safe # 127.0.0.1:3333
150
150
 
151
151
  | Component | Current contract |
152
152
  | --- | --- |
153
- | ForgeLoop core package | `>=1.5.0 <2` dependency range; current release candidate `1.11.0` |
153
+ | ForgeLoop core package | `>=1.5.0 <2` dependency range; current release `1.12.0` |
154
154
  | ForgeLoop protocol | `1` |
155
155
  | Integration API | `1` |
156
156
  | MCP package | `0.1.x` initial package |
@@ -27,6 +27,11 @@ The published tarball includes the following consumer-facing groups:
27
27
  This includes the provider-neutral Repository Index runtime and its pinned
28
28
  `src/repository-index/tgrep-manifest.json`; native engine binaries are
29
29
  provisioned outside the npm tarball.
30
+ - **Specialist guidance:** every registered consumer guide under `ENG/`,
31
+ including `ENG/flutter-development-eng.md`, ships with the guide registry
32
+ and is resolved from a package-local path. The Flutter specialist is
33
+ selected only for an affected root with the structural SDK dependency
34
+ signal; the package does not install or invoke Flutter tooling.
30
35
  - **Initialization material:** the root protocol and integration documents,
31
36
  legal notices, the target profile template, and every path listed by
32
37
  `src/core/templates.js`. These files are read by `init` and `update`, so
@@ -87,7 +92,9 @@ npm run pack:smoke
87
92
 
88
93
  `pack:smoke` installs the candidate tarball into a temporary consumer and
89
94
  exercises the CLI, public Integration API, initialization, schemas, and
90
- packaged documentation references. The tag-triggered publication workflow
95
+ packaged documentation references. The package-boundary tests also assert
96
+ that every registered guide path, including the Flutter specialist, is
97
+ present in the candidate. The tag-triggered publication workflow
91
98
  runs the same smoke gate before `npm publish --provenance --access public`.
92
99
  Publication therefore remains owned by the trusted GitHub Actions OIDC
93
100
  workflow; local package inspection proves the candidate boundary but does not
@@ -3,14 +3,24 @@
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
+ - [ ] The canonical engineering-flow source and regenerated HTML/SVG diagram
17
+ explain project detection as routing context, not verification or
18
+ completion evidence.
19
+ - [ ] Positive clean-room package routing selects `flutter`, `clean`, and
20
+ `test` for a Flutter root.
21
+ - [ ] Documentation-only mentions, lockfiles, hosted packages, malformed
22
+ dependency shapes, symlink traversal, and unrelated monorepo roots do
23
+ not activate the Flutter specialist.
14
24
  - [ ] [`docs/REPOSITORY_INDEX.md`](./REPOSITORY_INDEX.md) and
15
25
  [`docs/PERSISTENT_SEARCH_TRANSPORT.md`](./PERSISTENT_SEARCH_TRANSPORT.md)
16
26
  agree on tgrep management, no-fallback behavior, local IPC, ownership,
@@ -37,6 +47,9 @@ actions.
37
47
  - [ ] [`docs/PACKAGE_CONTENTS.md`](./PACKAGE_CONTENTS.md) matches the current
38
48
  `package.json` file list and documents intentional inclusions and
39
49
  exclusions.
50
+ - [ ] The candidate tarball includes the registered Flutter guide and every
51
+ other `src/config/guides.json` path; no repository-only guide state is
52
+ packaged.
40
53
  - [ ] Every maintained `src/**/*.js` module is present in the candidate
41
54
  tarball; only the four explicitly retired compatibility helpers are
42
55
  excluded.
@@ -89,8 +102,9 @@ actions.
89
102
  ## Integration and cross-platform evidence
90
103
 
91
104
  - [ ] `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.
105
+ - [ ] `npm pack --dry-run` includes the Flutter guide, Repository Index
106
+ runtime/manifest/docs, and excludes native release binaries and derived
107
+ `.forgeloop` index data.
94
108
  - [ ] The npm publication workflow runs `npm run pack:smoke` before its
95
109
  provenance-backed publish step.
96
110
  - [ ] `npm run mcp:test` either runs the configured MCP tests or reports the
@@ -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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cassiomc1/forgeloop",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "description": "Portable, verifiable engineering protocol for AI coding environments and developer workflows",
5
5
  "repository": {
6
6
  "type": "git",
@@ -11,7 +11,20 @@
11
11
  "risks": { "type": "array", "items": { "type": "string" } },
12
12
  "platforms": { "type": "array", "items": { "type": "string" } },
13
13
  "behaviorChange": { "type": "boolean" },
14
- "executableChange": { "type": "boolean" }
14
+ "executableChange": { "type": "boolean" },
15
+ "projectEvidence": {
16
+ "type": "object",
17
+ "required": ["schemaVersion", "scope", "frameworks", "projectRoots", "primarySignals", "supportingSignals"],
18
+ "properties": {
19
+ "schemaVersion": { "const": 1 },
20
+ "scope": { "enum": ["MATCH", "UNSCOPED", "NO_MATCH", "NONE"] },
21
+ "frameworks": { "type": "array", "items": { "enum": ["flutter"] } },
22
+ "projectRoots": { "type": "array", "items": { "type": "string", "minLength": 1 } },
23
+ "primarySignals": { "type": "array", "items": { "type": "string", "minLength": 1 } },
24
+ "supportingSignals": { "type": "array", "items": { "type": "string", "minLength": 1 } }
25
+ },
26
+ "additionalProperties": false
27
+ }
15
28
  },
16
29
  "additionalProperties": false
17
30
  }
@@ -2,6 +2,7 @@ import { evaluateRoute } from "../core/router.js";
2
2
  import { persistRoute } from "../core/route-artifact.js";
3
3
  import { readContract } from "../core/contract.js";
4
4
  import { readConfig } from "../core/config.js";
5
+ import { detectProjectEvidence } from "../core/project-detection.js";
5
6
  import { withTaskMutation } from "../core/task-command.js";
6
7
 
7
8
  export async function runRoute({ target, packageRoot, workType, surfaces, risks, platforms, behaviorChange, executableChange, executionProfile = null, taskId, task }) {
@@ -19,6 +20,9 @@ export async function runRoute({ target, packageRoot, workType, surfaces, risks,
19
20
  } catch (error) {
20
21
  if (error.code !== "ARTIFACT_MISSING") throw error;
21
22
  }
23
+ const projectEvidence = target
24
+ ? await detectProjectEvidence(target, { claims: ctx?.descriptor?.writeClaims ?? [] })
25
+ : null;
22
26
  const route = evaluateRoute({
23
27
  workType,
24
28
  surfaces,
@@ -26,6 +30,7 @@ export async function runRoute({ target, packageRoot, workType, surfaces, risks,
26
30
  platforms,
27
31
  behaviorChange,
28
32
  executableChange,
33
+ ...(projectEvidence ? { projectEvidence } : {}),
29
34
  }, {
30
35
  contract,
31
36
  taskDescriptor: ctx?.descriptor ?? null,
@@ -38,5 +38,9 @@
38
38
  "documentation": {
39
39
  "path": "ENG/documentation-quality-eng.md",
40
40
  "install": true
41
+ },
42
+ "flutter": {
43
+ "path": "ENG/flutter-development-eng.md",
44
+ "install": true
41
45
  }
42
46
  }