@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/DOCS_INDEX.md +1 -1
- package/ENG/flutter-development-eng.md +2106 -0
- package/GUIDE_ROUTER.md +46 -4
- package/LOOP_SYSTEM_DESIGN.md +10 -6
- package/QUALITY_SCORECARD.md +1 -0
- package/README.md +15 -14
- package/docs/AGENT_PROTOCOL_SUMMARY.md +1 -1
- package/docs/CLI_REFERENCE.md +1 -1
- package/docs/MCP.md +1 -1
- package/docs/PACKAGE_CONTENTS.md +8 -1
- package/docs/RELEASE_CHECKLIST.md +22 -8
- package/docs/assets/diagrams/forgeloop-engineering-flow.html +19 -6
- package/docs/assets/diagrams/forgeloop-engineering-flow.receipt.json +6 -6
- package/docs/assets/diagrams/forgeloop-engineering-flow.svg +5 -5
- package/docs/diagrams/forgeloop-engineering-flow.workflow.json +12 -2
- package/docs/diagrams/reviews/forgeloop-engineering-flow.review.json +3 -3
- package/package.json +1 -1
- package/schemas/routing-input.schema.json +14 -1
- package/src/commands/route.js +5 -0
- package/src/config/guides.json +4 -0
- package/src/core/project-detection.js +519 -0
- package/src/core/router.js +80 -7
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.
|
|
252
|
-
|
|
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.
|
package/LOOP_SYSTEM_DESIGN.md
CHANGED
|
@@ -242,7 +242,7 @@ presented as a completed protocol state.
|
|
|
242
242
|
|
|
243
243
|
### `ENG/*.md`
|
|
244
244
|
|
|
245
|
-
|
|
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
|
|
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
|
|
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
|
|
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.
|
package/QUALITY_SCORECARD.md
CHANGED
|
@@ -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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
78
|
-
|
|
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;
|
|
463
|
-
|
|
464
|
-
|
|
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.
|
|
10
|
+
Package version: 1.12.0
|
|
11
11
|
|
|
12
12
|
## Canonical loop
|
|
13
13
|
|
package/docs/CLI_REFERENCE.md
CHANGED
|
@@ -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`)
|
|
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
|
|
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 |
|
package/docs/PACKAGE_CONTENTS.md
CHANGED
|
@@ -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
|
|
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.
|
|
6
|
+
## ForgeLoop 1.12.0 candidate scope
|
|
7
7
|
|
|
8
|
-
The 1.
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
13
|
-
|
|
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
|
|
93
|
-
excludes native release binaries and derived
|
|
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="
|
|
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
|
|
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
|
|
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,
|
|
5016
|
-
<title>Profile ·
|
|
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">
|
|
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>• Repository evidence feeds bounded project and surface detection</li>
|
|
5406
|
+
<li>• A parsed dependencies.flutter.sdk: flutter entry proves Flutter project scope</li>
|
|
5407
|
+
<li>• The router selects the Flutter specialist only for an affected scoped root</li>
|
|
5408
|
+
<li>• 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": "
|
|
19
|
-
"bytes":
|
|
18
|
+
"sha256": "3c35fbe4e144cd7fb60632996839bcf32b0b503e8a4add2270f29c3bf3e8a658",
|
|
19
|
+
"bytes": 10229
|
|
20
20
|
},
|
|
21
21
|
"artifacts": {
|
|
22
22
|
"html": {
|
|
23
|
-
"sha256": "
|
|
24
|
-
"bytes":
|
|
23
|
+
"sha256": "26e82be933acaca0d7f07e917413d87135b901195aef22bd42ef974fe1548ad3",
|
|
24
|
+
"bytes": 648893
|
|
25
25
|
},
|
|
26
26
|
"svg": {
|
|
27
|
-
"sha256": "
|
|
28
|
-
"bytes":
|
|
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="
|
|
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
|
|
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,
|
|
4826
|
-
<title>Profile ·
|
|
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">
|
|
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
|
|
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": "
|
|
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": "
|
|
7
|
-
"svgSha256": "
|
|
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-
|
|
19
|
+
"reviewedAt": "2026-09-09"
|
|
20
20
|
}
|
package/package.json
CHANGED
|
@@ -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
|
}
|
package/src/commands/route.js
CHANGED
|
@@ -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,
|