@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/GUIDE_ROUTER.md CHANGED
@@ -52,6 +52,18 @@ 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 |
56
+ | `dotnet` | [.NET and ASP.NET Core development engineering](./ENG/dotnet-aspnetcore-development-eng.md) | Architecture, implementation, testing, performance, security, data access, hosting, observability, and release of production .NET applications |
57
+ | `nodejs` | [Node.js backend development engineering](./ENG/nodejs-backend-development-eng.md) | Architecture, implementation, testing, security, performance, observability, and release of production Node.js services and workers |
58
+ | `c` | [C development engineering](./ENG/c-development-eng.md) | Memory-safe-by-contract C libraries, services, native interfaces, security, testing, and reproducible toolchains |
59
+ | `cpp` | [C++ development engineering](./ENG/cpp-development-eng.md) | Ownership, RAII, concurrency, ABI, native interoperability, testing, and reproducible C++ systems |
60
+ | `java` | [Java development engineering](./ENG/java-development-eng.md) | JVM services, libraries, workers, build compatibility, concurrency, security, testing, and release |
61
+ | `sql` | [SQL development engineering](./ENG/sql-development-eng.md) | Schemas, queries, migrations, transactions, database security, performance, and compatibility |
62
+ | `go` | [Go development engineering](./ENG/go-development-eng.md) | Modules, services, workers, concurrency, cancellation, security, testing, and release |
63
+ | `typescript` | [TypeScript development engineering](./ENG/typescript-development-eng.md) | Type-system/compiler contracts, runtime boundaries, module compatibility, testing, and release |
64
+ | `php` | [PHP development engineering](./ENG/php-development-eng.md) | Composer applications, web services, workers, runtime constraints, security, testing, and deployment |
65
+ | `swift` | [Swift development engineering](./ENG/swift-development-eng.md) | SwiftPM/Xcode applications, concurrency, platform boundaries, interoperability, testing, and release |
66
+ | `rust` | [Rust development engineering](./ENG/rust-development-eng.md) | Architecture, implementation, testing, security, performance, reproducibility, and release of production Rust applications, services, libraries, and workers |
55
67
 
56
68
  ## Domain rules
57
69
 
@@ -205,6 +217,287 @@ rg -n '^## |accuracy|completeness|Diátaxis|tutorial|how-to|reference|explanatio
205
217
 
206
218
  **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
219
 
220
+ ### `flutter` — Flutter application engineering
221
+
222
+ **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.
223
+
224
+ **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.
225
+
226
+ **Usually combine with:** `clean` and `test`; add `design`, `accessibility`, `security`, or `performance` when the affected surface or risk requires them.
227
+
228
+ 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.
229
+
230
+ ```bash
231
+ rg -n '^## |architecture|testing|performance|accessibility|platform|release|Flutter' ENG/flutter-development-eng.md
232
+ ```
233
+
234
+ **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.
235
+
236
+ ### `dotnet` — .NET and ASP.NET Core development engineering
237
+
238
+ **Activate when:** a confirmed project root has a structurally parsed SDK-style `*.csproj`, `*.fsproj`, or `*.vbproj` using one of the supported SDKs below, and the task scope intersects that root:
239
+
240
+ - `Microsoft.NET.Sdk`, `Microsoft.NET.Sdk.Web`, `Microsoft.NET.Sdk.Worker`,
241
+ `Microsoft.NET.Sdk.Razor`, or `Microsoft.NET.Sdk.BlazorWebAssembly`;
242
+ - `Aspire.AppHost.Sdk` or `MSTest.Sdk`;
243
+ - the equivalent `<Sdk Name="..." />` declaration in the project XML.
244
+
245
+ Web, Razor, or Blazor SDKs, or `FrameworkReference Include="Microsoft.AspNetCore.App"`, confirm ASP.NET Core context. A `Volo.Abp.*` package reference adds the ABP overlay while retaining the single `dotnet` guide ID.
246
+
247
+ **Do not activate merely because:** prose, Markdown, source snippets, a Dockerfile, a lockfile, an arbitrary directory name, a package cache, or an unrelated monorepo project mentions .NET, ASP.NET Core, or ABP. A malformed, oversized, non-SDK-style, or unsupported project file fails closed. Shared `Directory.Build.*`, `Directory.Packages.props`, `global.json`, and NuGet files apply only to descendant .NET projects in their directory scope; `.sln`/`.slnx` claims use exact solution membership.
248
+
249
+ **Usually combine with:** `clean` and `test`; add `security` for trust-boundary or dependency changes, `performance` for measured cost or critical paths, `documentation` for technical documentation, and the UI guides for Razor/Blazor or other user-facing changes.
250
+
251
+ The route command obtains this evidence from `src/core/project-detection.js`. It walks bounded, non-symlinked project manifests, parses direct XML SDK/target/reference structure without evaluating the full MSBuild graph, and matches task claims against project roots, shared configuration scope, or exact solution membership. ASP.NET Core and ABP are routing reasons on the specialist guide, not additional guide IDs.
252
+
253
+ Project discovery is fail-closed and bounded by default: at most 256 project
254
+ manifests, 64 solution files, 1 MiB per manifest, 256 supporting source files
255
+ with 512 KiB per source file, 4,096 visited directories, and 20,000 visited
256
+ entries. Symlinks and common generated/vendor directories are skipped. When a
257
+ budget is exhausted, the detector does not claim reliable project evidence.
258
+ These limits bound discovery work; they do not cap task ownership discovery.
259
+
260
+ The .NET routing reasons are `PROJECT_DOTNET_SDK_PROJECT`,
261
+ `PROJECT_DOTNET_BASELINE`, `PROJECT_ASPNETCORE_CONFIRMED`, and
262
+ `PROJECT_ABP_CONFIRMED`. The corresponding exclusions are
263
+ `NO_DOTNET_PROJECT_EVIDENCE`, `NO_DOTNET_SCOPE_MATCH`,
264
+ `NO_DOTNET_PRIMARY_EVIDENCE`, and `NO_DOTNET_EXECUTABLE_WORK`. The route
265
+ validator also requires `aspnetcore` and `abp` project-evidence overlays to be
266
+ accompanied by `dotnet`; it rejects standalone overlays rather than creating a
267
+ second specialist guide.
268
+
269
+ ```bash
270
+ rg -n '^## |architecture|dependency injection|middleware|endpoints|configuration|authentication|authorization|EF Core|testing|WebApplicationFactory|workers|Blazor|ABP|publish|troubleshooting' ENG/dotnet-aspnetcore-development-eng.md
271
+ ```
272
+
273
+ **Expected evidence:** a confirmed affected .NET project, a scoped route, compatible SDK/runtime decisions, focused and integration checks for changed boundaries, and honest `NOT_VERIFIED` reporting for unavailable .NET tooling or runtime environments.
274
+
275
+ ### `nodejs` — Node.js backend development engineering
276
+
277
+ **Activate when:** a confirmed project root has a valid `package.json` with an
278
+ allowlisted runtime backend dependency (`express`, `fastify`, `@nestjs/core`,
279
+ `koa`, or `@hapi/hapi`), a direct `node`/`node.exe` runtime script, or bounded
280
+ source evidence importing or re-exporting a Node server/network built-in such
281
+ as `node:http`, `node:https`, `node:http2`, `node:net`, `node:tls`, or `node:dgram`
282
+ from a plausible runtime application surface, and the task scope intersects
283
+ that root.
284
+
285
+ **Do not activate merely because:** a `package.json`, `engines.node`, `type`,
286
+ `packageManager`, lockfile, `.nvmrc`, `.node-version`, `@types/node`,
287
+ TypeScript, `tsx`, Dockerfile, CI setup, frontend dependency, Next-only
288
+ dependency, prose mention, or development-only framework dependency exists.
289
+ Malformed or oversized manifests fail closed. The detector never executes
290
+ scripts or source code, follows symlinks, installs packages, or accesses the
291
+ network.
292
+
293
+ **Usually combine with:** `clean` and `test`; add `security` for input,
294
+ authentication, authorization, dependency, secret, external-service, or
295
+ publication risks; add `performance` for measured latency, throughput,
296
+ memory, event-loop, queue, or database work; add `documentation` when the API,
297
+ configuration, or operational contract changes.
298
+
299
+ The route command obtains this evidence from
300
+ `src/core/project-detection.js`. It walks bounded, non-symlinked manifests and
301
+ source files, isolates nested project roots across Flutter, .NET, Node.js, and
302
+ Rust,
303
+ recognizes workspace-root and shared lockfile scope, and preserves
304
+ `projectEvidence.schemaVersion: 1`. Node source evidence ignores comments,
305
+ template text, `import type`/`export type`, inline type-only specifiers,
306
+ declaration files, tooling/configuration filenames, and non-runtime directories
307
+ such as tests, fixtures, examples, docs, build output, scripts, tools, codegen,
308
+ and package caches. A mixed declaration counts only when a runtime value
309
+ specifier is safely recognized; unsupported complex declarations fail closed.
310
+ Runtime re-exports with a value specifier are included because the specialist
311
+ covers Node.js server/runtime library surfaces as well as services and workers.
312
+ Node.js execution used only for build, test, or configuration tooling is not
313
+ sufficient backend/runtime evidence. Mixed Flutter/.NET/Node repositories
314
+ retain each confirmed framework; claims and shared files stop at the same
315
+ nested ownership boundaries. A claim that does not reach a confirmed Node
316
+ project produces `NO_NODEJS_SCOPE_MATCH` or leaves the specialist excluded.
317
+
318
+ ```bash
319
+ rg -n '^## |activation|runtime|architecture|Express|Fastify|NestJS|security|testing|performance|deployment|Definition of Done' ENG/nodejs-backend-development-eng.md
320
+ ```
321
+
322
+ **Expected evidence:** a confirmed affected Node project, a scoped route,
323
+ validated inputs and configuration, bounded trust and resource controls,
324
+ focused plus integration/adversarial checks, observable failure and shutdown
325
+ behavior, and honest `NOT_VERIFIED` reporting for unavailable Node tooling.
326
+
327
+ ### `c` — C development engineering
328
+
329
+ Activate for explicit C language declarations in CMake or Meson, a native
330
+ Bazel rule with owned .c source, or a direct claim to owned .c source. Headers,
331
+ Makefiles, compiler images, flags, generated trees, and prose are not enough.
332
+ C and C++ may compose at one root. Detection is bounded and static; it never
333
+ runs native build tools, compilers, linkers, generators, or tests. Repository
334
+ flags, compiler mode, ABI, C library, and platform contracts decide the
335
+ effective C standard; C23 is only the current published reference.
336
+
337
+ Expected evidence is a confirmed affected root, scoped ownership, explicit
338
+ memory/resource contracts, failure-path tests, and separately recorded
339
+ toolchain checks. See ENG/c-development-eng.md for the specialist contract.
340
+
341
+ ### `cpp` — C++ development engineering
342
+
343
+ Activate for explicit C++ language declarations in CMake or Meson, a native
344
+ Bazel rule with owned .cc, .cpp, .cxx, or .c++ source, or a direct claim to
345
+ owned C++ source. Headers remain ambiguous without explicit build context.
346
+ Makefiles, compiler versions, flags, generated trees, and vendored code do not
347
+ establish C++ identity. The detector never executes native build logic.
348
+
349
+ C++23 is the published baseline reference; compiler support for C++26 is not
350
+ permission to change the repository standard or ABI. See
351
+ ENG/cpp-development-eng.md for ownership, RAII, ABI, concurrency, and testing
352
+ guidance.
353
+
354
+ ### `java` — Java development engineering
355
+
356
+ Activate for owned Java source with structural Maven, Gradle, or Bazel
357
+ evidence, an unambiguous Java compiler/platform declaration, or a direct .java
358
+ claim. A POM, Gradle wrapper/settings, generic aggregator, JDK image, or
359
+ setup-java CI step alone is not an application; explicit recognized Java
360
+ plugins/rules are structural evidence, including `java-gradle-plugin`. Gradle
361
+ topology uses only unconditional top-level literal includes; conditional,
362
+ interpolated, or executable expressions remain unresolved. Unsafe XML
363
+ DTD/entity constructs fail closed; Maven, Gradle, Bazel, plugins, annotation
364
+ processors, tests, and Java code are never executed.
365
+
366
+ Keep source level, release/target, build JDK, runtime JDK, preview features,
367
+ framework minimums, and vendor distribution separate. Repository configuration
368
+ wins over current JDK availability. See ENG/java-development-eng.md.
369
+
370
+ ### `sql` — SQL development engineering
371
+
372
+ Activate as an overlay for a directly claimed meaningful SQL artifact or a
373
+ bounded statement in an owned db, database, migration, migrations, schema, or
374
+ sql directory. SQL composes with its host language specialist and dialect is
375
+ not a public framework value. Comments, strings, prose, drivers, connection
376
+ strings, empty files, generated/vendor content, and database images are not
377
+ evidence.
378
+
379
+ The detector masks lexical noise and never connects to a database, executes
380
+ queries, applies migrations, reads credentials, or introspects schemas. Single-
381
+ quoted string values are masked, while double-quoted, backtick-quoted, and
382
+ bracket-quoted identifiers are preserved as internal neutral identifier tokens
383
+ for structural matching. It recognizes bounded statement families only when
384
+ structural tokens are present, and common CTE shapes, without claiming full
385
+ dialect parsing; PostgreSQL JSON operators such as `#>` and `#>>` remain SQL
386
+ tokens, not comments. ISO/IEC
387
+ 9075:2023 is a portability reference; the actual engine and version govern
388
+ dialect behavior. See
389
+ ENG/sql-development-eng.md.
390
+
391
+ ### `go` — Go development engineering
392
+
393
+ Activate for a valid bounded go.mod module or a go.work connected to known
394
+ repository-local modules. A go.work without a usable module, .go source alone,
395
+ go.sum, vendor metadata, Docker image, or setup-go CI step is insufficient.
396
+ The go minimum-version and toolchain directives remain distinct. Detection
397
+ resolves only known manifests and never runs Go, downloads modules, evaluates
398
+ build tags, or executes generators. `ignore` directives in `go.mod` are
399
+ retained as module metadata (including single and block forms); they do not
400
+ change project identity, and `go.work` does not accept them. See
401
+ ENG/go-development-eng.md.
402
+
403
+ ### `typescript` — TypeScript development engineering
404
+
405
+ Activate for a valid bounded JSONC tsconfig.json. A custom tsconfig.*.json is
406
+ primary only when directly claimed or referenced by a confirmed config.
407
+ jsconfig.json, .ts snippets, declaration files, compiler dependencies, and CI
408
+ compiler setup are not TypeScript project identity. `extends` may be a string
409
+ or array; local shared configs route claims to their consuming configs and do
410
+ not become independent roots merely because they are named as bases. Local
411
+ references are checked only against discovered configs; the compiler and
412
+ config files are never executed.
413
+
414
+ TypeScript is runtime-neutral, so a co-located Node package may select both
415
+ typescript and nodejs. See ENG/typescript-development-eng.md.
416
+
417
+ ### `php` — PHP development engineering
418
+
419
+ Activate for a valid bounded composer.json with package/require/autoload
420
+ identity or a direct claim to executable PHP source. Composer lockfiles,
421
+ vendor, PHP version strings, Docker/CI setup, static HTML, and README examples
422
+ are not enough. Composer scripts/plugins, PHP, autoload generation, and
423
+ network resolution are never run. PHP extension roots may compose with C.
424
+ strict_types remains a per-file call-site rule. See ENG/php-development-eng.md.
425
+
426
+ ### `swift` — Swift development engineering
427
+
428
+ Activate for a valid Package.swift tools-version/PackageDescription/Package
429
+ structure with Swift target evidence, explicit Swift in CMake/Meson, bounded
430
+ Xcode Swift markers, or a direct .swift claim. A direct Package.swift claim
431
+ also selects Swift guidance for a native-only package manifest. Package.resolved,
432
+ vendor/generated source, Docker/CI setup, and package execution are not
433
+ evidence. Invalid Package.swift files contribute no SwiftPM-derived C/C++
434
+ composition. SwiftPM may compose Swift with C or C++ at one root. Swift
435
+ `mobile-ui` work remains executable Swift work. Swift 6.3 is the stable
436
+ reference snapshot; beta documentation is not an automatic target.
437
+ See ENG/swift-development-eng.md.
438
+
439
+ ### `rust` — Rust development engineering
440
+
441
+ **Activate when:** a confirmed project root has a bounded, structurally parsed
442
+ `Cargo.toml` with a valid `[package]` and/or `[workspace]` table, and the task
443
+ scope intersects that root. A package workspace and a virtual workspace are
444
+ both valid when the virtual workspace has at least one resolvable package
445
+ member; an empty or unresolved virtual workspace fails closed. A virtual
446
+ workspace contributes its confirmed package members as public project roots. A
447
+ package workspace may contain both tables, but `package.workspace` is mutually
448
+ exclusive with `[workspace]` and associates a package with another workspace.
449
+
450
+ **Do not activate merely because:** a `.rs` file, `Cargo.lock`,
451
+ `rust-toolchain`/`rust-toolchain.toml`, `.cargo/config.toml`, rustfmt or Clippy
452
+ configuration, a Tokio/Axum/Actix/other dependency name, a Dockerfile, CI
453
+ toolchain setup, or repository prose exists. `target/` and `vendor/` are
454
+ ignored. Build scripts, proc-macro crates, generated code, and native tooling
455
+ remain runtime/build context rather than a replacement for Cargo identity.
456
+
457
+ Cargo inheritance such as `package.edition.workspace = true` and
458
+ `package.rust-version.workspace = true` is accepted as package metadata;
459
+ `[workspace.package]` may enrich supporting signals. Workspace membership uses
460
+ only known discovered manifests and bounded `members`/`exclude` patterns: `*`
461
+ and `?` stay within one path segment, `**` may cross segments, and absolute or
462
+ parent-directory escape paths are rejected. Local package `path` dependencies
463
+ and explicitly used inherited workspace dependencies can associate a known
464
+ package with a workspace, while `[workspace.dependencies]` declarations alone
465
+ do not create active dependency edges. A valid `package.workspace` association
466
+ may point to a known workspace outside the package's directory subtree, but not
467
+ outside the repository; no additional traversal is triggered.
468
+
469
+ **Usually combine with:** `clean` and `test`; add `security` for unsafe/FFI,
470
+ untrusted input, secrets, dependencies, external services, or publication;
471
+ add `performance` for measured CPU, memory, latency, allocation, executor,
472
+ queue, or I/O work; add `documentation` when public APIs, configuration, or
473
+ operational contracts change.
474
+
475
+ The route command obtains this evidence from
476
+ `src/core/project-detection.js` and the conservative TOML recognizer in
477
+ `src/core/rust-project.js`. It performs bounded, non-symlinked discovery and
478
+ manifest reads, never runs Cargo or source code, and treats `Cargo.toml` as
479
+ primary evidence while edition, MSRV, resolver, features, dependencies,
480
+ lockfiles, toolchains, and configuration are supporting signals. Explicit
481
+ workspace members/excludes, nested workspaces, and confirmed Flutter, .NET,
482
+ Node.js, and Rust roots constrain claims and shared-file ownership. `Cargo.lock`
483
+ and configuration files apply only to their owning package/workspace scope; a
484
+ parent cannot absorb a child's shared file merely because its path is a
485
+ descendant.
486
+
487
+ Rust has no Node-style LTS channel. Keep active toolchain, MSRV
488
+ (`package.rust-version`), edition, and compilation target separate, and use
489
+ version-matched official Rust and Cargo documentation. Current stable is a
490
+ dated observation, not a universal migration target.
491
+
492
+ ```bash
493
+ rg -n '^## |Cargo|toolchain|MSRV|edition|ownership|async|unsafe|FFI|security|testing|release|Definition of Done' ENG/rust-development-eng.md
494
+ ```
495
+
496
+ **Expected evidence:** a confirmed affected Cargo package or workspace, a
497
+ scoped route, compatible toolchain/MSRV/edition/target decisions, focused plus
498
+ workspace checks, explicit resource and trust controls, and honest
499
+ `NOT_VERIFIED` reporting for unavailable Rust targets or toolchains.
500
+
208
501
  ## Work-type matrix
209
502
 
210
503
  | Work | Primary guide | Common complements | Exclude when |
@@ -214,6 +507,17 @@ rg -n '^## |accuracy|completeness|Diátaxis|tutorial|how-to|reference|explanatio
214
507
  | Code or bug without UI | `clean` | `test`; risk may add `security` or `performance` | The surface is unchanged |
215
508
  | Backend, API, or data | `clean` | `test`, `security`; `performance` for a critical path | That layer does not exist |
216
509
  | Web, mobile, or desktop UI | `design` | `accessibility`, `clean`, `test`; risk defines the rest | Users cannot observe the change |
510
+ | Flutter application | `flutter` | `clean`, `test`; add `design`, `accessibility`, `security`, or `performance` as applicable | No primary Flutter SDK dependency in the affected project scope |
511
+ | .NET / ASP.NET Core application | `dotnet` | `clean`, `test`; add `security`, `performance`, `documentation`, or UI guides as applicable | No supported SDK-style .NET project in the affected project scope |
512
+ | Node.js backend, API, worker, or server runtime | `nodejs` | `clean`, `test`; add `security`, `performance`, or `documentation` as applicable | No primary Node.js backend/runtime evidence in the affected project scope |
513
+ | Rust application, service, library, or worker | `rust` | `clean`, `test`; add `security`, `performance`, or `documentation` as applicable | No valid Cargo package/workspace in the affected project scope |
514
+ | C or C++ native project | `c`, `cpp` | `clean`, `test`; add `security`, `performance`, or `documentation` as applicable | No explicit/owned native implementation evidence |
515
+ | Java service, library, or worker | `java` | `clean`, `test`; add `security`, `performance`, or `documentation` as applicable | No structural Java build/source evidence |
516
+ | Go module, service, or worker | `go` | `clean`, `test`; add `security`, `performance`, or `documentation` as applicable | No valid discovered Go module/workspace |
517
+ | TypeScript project | `typescript` | `clean`, `test`; add `security`, `performance`, or `documentation` as applicable | No valid or referenced tsconfig project |
518
+ | PHP application, package, or worker | `php` | `clean`, `test`; add `security`, `performance`, or `documentation` as applicable | No Composer or scoped executable PHP evidence |
519
+ | Swift application, package, or service | `swift` | `clean`, `test`; add `security`, `performance`, or `documentation` as applicable | No SwiftPM/Xcode/build/source evidence |
520
+ | SQL schema, query, or migration | `sql` | `clean`, `test`, `security`; add `performance` for measured query/migration risk | No meaningful owned SQL artifact |
217
521
  | Complete website | `premium` | `design`, `accessibility`, `clean`, `test`, `security`, `performance` | The deliverable is not a complete site |
218
522
  | Web game | `games` | `clean`, `test`, `security`, `performance`, `accessibility`; `design` with UI | The product is not a game |
219
523
  | HTML video or motion | `design` | `accessibility`, `performance`, `test`, `security` | There is no audiovisual composition |
@@ -226,7 +530,9 @@ HyperFrames is optional and may be used only when requested or already available
226
530
  The active agent may classify natural language, but it must pass declared
227
531
  signals to the deterministic evaluator in `src/core/router.js`. The evaluator
228
532
  does not parse natural language, call a model, or infer a stack from a word in
229
- the repository.
533
+ the repository. `runRoute` may also pass `projectEvidence` from
534
+ `src/core/project-detection.js`; that evidence is produced by structural
535
+ manifest parsing and scope intersection, not by prose or model confidence.
230
536
 
231
537
  The first routing contract is versioned as `schemaVersion: 1`. It accepts:
232
538
 
@@ -243,19 +549,63 @@ The first routing contract is versioned as `schemaVersion: 1`. It accepts:
243
549
  - `platforms`: `web`, `mobile`, `desktop`, `server`, `ci`, or
244
550
  `cross-platform`;
245
551
  - optional boolean `behaviorChange` and `executableChange` signals.
552
+ - optional `projectEvidence` with a schema version, a scope result, detected
553
+ framework IDs, affected project roots, primary signals, and supporting
554
+ signals. The current framework IDs are `flutter`, `dotnet`, `aspnetcore`,
555
+ `abp`, `nodejs`, `rust`, `c`, `cpp`, `java`, `sql`, `go`, `typescript`,
556
+ `php`, and `swift`. Flutter's primary signal is an affected
557
+ `dependencies.flutter.sdk: flutter` entry in `pubspec.yaml`. .NET's primary
558
+ signal is a supported SDK-style project manifest; ASP.NET Core and ABP are
559
+ structural overlays. Node.js primary signals are an allowlisted runtime
560
+ dependency, direct Node runtime script, or narrow server-builtin source
561
+ import in a valid `package.json` project. The C/C++, Java, Go, TypeScript,
562
+ PHP, and Swift specialists use bounded structural build/config or owned
563
+ source evidence; SQL is a bounded owned-file overlay. Rust's primary
564
+ signals are a valid structural `[package]` and/or `[workspace]` table in
565
+ `Cargo.toml`; Rust source, lockfiles, toolchain files, and dependencies
566
+ are supporting context.
246
567
 
247
568
  Rule precedence is deterministic: the work type establishes the primary
248
569
  closure; affected surfaces add mandatory complements; risks add security,
249
570
  performance, or accessibility; executable/behavior changes add clean and
250
571
  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.
572
+ canonical insertion order. A matching Flutter project adds `flutter` plus the
573
+ `clean`/`test` baseline before ordinary work-type complements; documentation
574
+ and UI-copy work do not activate the specialist. A matching .NET project adds
575
+ `dotnet` plus the `clean`/`test` baseline and records ASP.NET Core/ABP reasons
576
+ on that guide. A matching Node.js project adds `nodejs` plus the `clean`/`test`
577
+ baseline and records `PROJECT_NODEJS_CONFIRMED`; dependency, direct-script,
578
+ and server-runtime reasons are optional enrichments when the corresponding
579
+ primary signals are present. A matching Rust project adds `rust` plus the
580
+ `clean`/`test` baseline and records `PROJECT_RUST_CONFIRMED`; package and
581
+ workspace roles are optional reason enrichments. The public `frameworks` field remains the
582
+ authority for the confirmed framework; the router does not reverse-engineer
583
+ Node selection from private signal substrings. Unknown or duplicate signals
584
+ fail with a routing error.
253
585
 
254
586
  Every selected guide has stable reason codes such as
255
587
  `WORK_COMPLETE_WEBSITE`, `SURFACE_UI`, `RISK_UNTRUSTED_INPUT`, and
256
588
  `CHANGE_EXECUTABLE_CONFIG`. Exclusions use stable codes such as
257
589
  `NO_TRUST_BOUNDARY`, `NO_MEASURABLE_PERFORMANCE_RISK`, and
258
- `NO_DOCUMENTATION_SURFACE`.
590
+ `NO_DOCUMENTATION_SURFACE`. Flutter uses
591
+ `PROJECT_FLUTTER_SDK_DEPENDENCY`, `PROJECT_FLUTTER_BASELINE`,
592
+ `NO_FLUTTER_PRIMARY_EVIDENCE`, `NO_FLUTTER_SCOPE_MATCH`, and
593
+ `NO_FLUTTER_EXECUTABLE_WORK`.
594
+ Node.js uses `PROJECT_NODEJS_CONFIRMED`,
595
+ `PROJECT_NODEJS_BACKEND_FRAMEWORK`,
596
+ `PROJECT_NODEJS_RUNTIME_SCRIPT`, `PROJECT_NODEJS_SERVER_RUNTIME`,
597
+ `PROJECT_NODEJS_BASELINE`, `NO_NODEJS_PRIMARY_EVIDENCE`,
598
+ `NO_NODEJS_SCOPE_MATCH`, and `NO_NODEJS_EXECUTABLE_WORK`. Rust uses
599
+ `PROJECT_RUST_CONFIRMED`, `PROJECT_RUST_CARGO_PACKAGE`,
600
+ `PROJECT_RUST_CARGO_WORKSPACE`, `PROJECT_RUST_BASELINE`,
601
+ `NO_RUST_PRIMARY_EVIDENCE`, `NO_RUST_SCOPE_MATCH`, and
602
+ `NO_RUST_EXECUTABLE_WORK`.
603
+
604
+ The .NET specialist uses `PROJECT_DOTNET_SDK_PROJECT` and
605
+ `PROJECT_DOTNET_BASELINE`; confirmed ASP.NET Core and ABP overlays add
606
+ `PROJECT_ASPNETCORE_CONFIRMED` and `PROJECT_ABP_CONFIRMED`. Exclusions are
607
+ `NO_DOTNET_PROJECT_EVIDENCE`, `NO_DOTNET_SCOPE_MATCH`,
608
+ `NO_DOTNET_PRIMARY_EVIDENCE`, and `NO_DOTNET_EXECUTABLE_WORK`.
259
609
 
260
610
  Platform signals are contextual, not automatic guide activators:
261
611
 
@@ -280,6 +630,65 @@ Negative routing guarantees:
280
630
  - a backend refactor does not activate `design` or `accessibility`;
281
631
  - static UI copy does not activate `security` without a trust-boundary signal;
282
632
  - a package file alone does not prove that Node is an affected task surface;
633
+ - a valid `package.json` without an allowlisted runtime dependency, direct Node
634
+ runtime script, or narrow server-builtin import from a plausible runtime
635
+ surface does not activate `nodejs`;
636
+ - React/Vite, Next-only, engines-only, `@types/node`-only, devDependency-only,
637
+ lockfile-only, Docker-only, and CI-only evidence does not activate `nodejs`;
638
+ - Node.js detection does not execute package scripts, import source, install
639
+ dependencies, follow symlinks, read unbounded files, or make network calls;
640
+ - comments, template text, `import type`/`export type`, inline type-only
641
+ specifiers, declaration files, tooling/configuration files, and
642
+ test/fixture/example/documentation/build/script/tool/codegen/cache directories
643
+ do not create Node.js runtime evidence;
644
+ - a `MATCH` or `UNSCOPED` public `projectEvidence` object whose frameworks
645
+ include `nodejs` selects the Node.js guide for executable work even when its
646
+ primary signal list is empty; signal details only enrich the reason list;
647
+ - a workspace root may scope confirmed Node descendants, but a frontend or
648
+ unrelated nested package remains isolated, and nested project boundaries are
649
+ applied consistently to Flutter, .NET, Node source scans, claims, and shared
650
+ files;
651
+ - documentation, UI-copy, and mobile-only work do not activate the Node.js
652
+ specialist even when the repository contains a confirmed Node package;
653
+ - `flutter_test`, a Flutter word in documentation, or a lockfile package does
654
+ not replace the primary Flutter SDK dependency signal;
655
+ - a .NET word in documentation, a `Dockerfile`, `project.assets.json`, a
656
+ package-lock file, or an arbitrary package name does not activate `dotnet`;
657
+ - a standalone `aspnetcore` or `abp` project-evidence overlay is invalid;
658
+ - a worker or library SDK selects the .NET specialist without claiming it is
659
+ an ASP.NET Core application; web/Razor/Blazor SDK or framework-reference
660
+ evidence is required for the ASP.NET Core reason;
661
+ - a malformed, oversized, unsupported, or non-SDK-style project manifest does
662
+ not provide primary .NET evidence;
663
+ - ABP guidance is not added for a plain ASP.NET Core project without a
664
+ structural `Volo.Abp.*` package reference;
665
+ - a shared MSBuild/NuGet file does not activate unrelated projects outside its
666
+ directory scope, and a solution claim does not activate non-members;
667
+ - a `.rs` file, `Cargo.lock`, Rust toolchain/configuration file, or Rust
668
+ dependency name does not replace a valid Cargo package/workspace manifest;
669
+ - a C/C++ header, Makefile, compiler image, or generic native build file does
670
+ not replace explicit language or owned implementation evidence;
671
+ - a Java POM/Gradle wrapper, Go source or go.sum, jsconfig, Composer lockfile,
672
+ Package.resolved, or generic build metadata alone does not establish the
673
+ corresponding specialist;
674
+ - SQL is selected only from a meaningful claimed or owned migration/schema
675
+ artifact and overlays the host project; comments, strings, and credentials
676
+ are never evidence;
677
+ - build/package/compiler tools are never executed during project detection,
678
+ and all eight language specialists preserve bounded reads, traversal, and
679
+ same-root composition;
680
+ - a virtual workspace root is not exposed as a public package root, excluded
681
+ workspace members remain out of an explicit workspace claim, and nested
682
+ Cargo workspaces remain ownership boundaries;
683
+ - Rust shared files (`Cargo.lock`, toolchain, `.cargo/config*`, rustfmt, and
684
+ Clippy configuration) apply only to their owning package/workspace scope;
685
+ - a `MATCH` or `UNSCOPED` public `projectEvidence` object whose frameworks
686
+ include `rust` selects the Rust guide for executable work even when its
687
+ primary signal list is empty; public framework identity is authoritative;
688
+ - documentation and UI-copy work do not activate the Rust specialist even
689
+ when the repository contains a confirmed Cargo project;
690
+ - an unrelated monorepo project does not activate Flutter when task claims do
691
+ not intersect its confirmed project root; nested project roots remain isolated;
283
692
  - an explicit executable-change signal adds `clean` and `test` even when the
284
693
  semantic work type is documentation.
285
694
 
@@ -323,6 +732,48 @@ Verify the game loop, authoritative server, reconciliation, input, assets, fallb
323
732
 
324
733
  Verify Markdown, links, paths, commands, and examples.
325
734
 
735
+ ### Flutter application feature
736
+
737
+ <!-- route:flutter-app-feature=flutter,clean,test -->
738
+
739
+ Verify the affected `pubspec.yaml` contains the Flutter SDK dependency, confirm
740
+ the task claim reaches that project, and cover widget/state behavior, platform
741
+ integration, accessibility, performance, and release checks according to the
742
+ changed surface. Supporting signals alone must leave `flutter` excluded.
743
+
744
+ ### .NET / ASP.NET Core application feature
745
+
746
+ <!-- route:dotnet-app-feature=dotnet,clean,test -->
747
+
748
+ Verify the affected project uses a supported SDK-style .NET manifest, confirm
749
+ the claim scope or exact solution membership, and cover DI lifetimes, pipeline
750
+ ordering, endpoint contracts, validation, authorization, cancellation, data
751
+ access, observability, and integration behavior according to the changed
752
+ surface. A worker/library project remains on the same specialist guide but
753
+ does not receive an ASP.NET Core claim without structural web evidence.
754
+
755
+ ### Node.js backend feature
756
+
757
+ <!-- route:nodejs-backend-feature=nodejs,clean,test -->
758
+
759
+ Verify the affected package has primary Node.js evidence, confirm the claim
760
+ reaches the correct package root or workspace descendant, and cover runtime and
761
+ module-system compatibility, input/configuration validation, authentication and
762
+ authorization, middleware order, timeouts/cancellation, persistence and
763
+ external-service boundaries, observability, shutdown, and adversarial tests.
764
+ Supporting package metadata and lockfiles alone must leave `nodejs` excluded.
765
+
766
+ ### Rust application feature
767
+
768
+ <!-- route:rust-app-feature=rust,clean,test -->
769
+
770
+ Verify the affected `Cargo.toml` contains a valid `[package]` or `[workspace]`
771
+ table, confirm the claim reaches the correct package/workspace scope, and
772
+ cover toolchain/MSRV/edition/target compatibility, ownership and cancellation,
773
+ resource limits, unsafe/FFI/dependency boundaries, focused tests, and the
774
+ workspace checks required by the repository. Cargo metadata and Rust tooling
775
+ files alone must leave `rust` excluded.
776
+
326
777
  ## Route changes
327
778
 
328
779
  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,8 @@ 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` |
98
+ | Rust project detection and routing | `src/core/project-detection.js`, `src/core/rust-project.js`, `src/core/router.js`, `src/config/guides.json`, and scoped Cargo evidence | `tests/rust-project-detection.test.js`, `tests/guide-registry.test.js`, `tests/router.test.js` |
97
99
  | 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
100
  | 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
101
  | Delegation | `src/core/delegation.js`, delegation-set validator, and `DELEGATION_PROTOCOL.md` | `tests/delegation.test.js`, `tests/delegation-set.test.js` |