@cassiomc1/forgeloop 1.12.0 → 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 (62) 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/go-development-eng.md +103 -0
  10. package/ENG/java-development-eng.md +125 -0
  11. package/ENG/nodejs-backend-development-eng.md +605 -0
  12. package/ENG/php-development-eng.md +104 -0
  13. package/ENG/rust-development-eng.md +422 -0
  14. package/ENG/sql-development-eng.md +108 -0
  15. package/ENG/swift-development-eng.md +111 -0
  16. package/ENG/typescript-development-eng.md +108 -0
  17. package/GUIDE_ROUTER.md +418 -9
  18. package/QUALITY_SCORECARD.md +1 -0
  19. package/README.md +44 -33
  20. package/THIRD_PARTY_NOTICES.md +19 -7
  21. package/completions/_forgeloop +3 -3
  22. package/completions/forgeloop.bash +3 -3
  23. package/completions/forgeloop.fish +7 -0
  24. package/docs/AGENT_PROTOCOL_SUMMARY.md +55 -2
  25. package/docs/CLI_REFERENCE.md +28 -6
  26. package/docs/DOCUMENTATION_GUIDE.md +2 -1
  27. package/docs/GETTING_STARTED.md +59 -0
  28. package/docs/PACKAGE_CONTENTS.md +28 -14
  29. package/docs/RECIPES.md +23 -0
  30. package/docs/RELEASE_CHECKLIST.md +30 -2
  31. package/docs/TROUBLESHOOTING.md +100 -2
  32. package/docs/documentation-manifest.json +652 -0
  33. package/docs/protocol-requirements.json +77 -0
  34. package/package.json +19 -4
  35. package/schemas/routing-input.schema.json +1 -1
  36. package/scripts/CI_VALIDATORS.md +84 -11
  37. package/scripts/generate-agent-protocol-summary.mjs +36 -0
  38. package/src/commands/next.js +19 -7
  39. package/src/commands/task-create.js +84 -25
  40. package/src/commands/task-list.js +22 -2
  41. package/src/config/guides.json +44 -0
  42. package/src/core/build-script.js +151 -0
  43. package/src/core/c-cpp-project.js +143 -0
  44. package/src/core/cli-command-definitions.js +8 -1
  45. package/src/core/command-executors.js +5 -3
  46. package/src/core/command-input.js +140 -102
  47. package/src/core/contract-presets.js +82 -0
  48. package/src/core/error-codes.js +3 -3
  49. package/src/core/filesystem.js +1 -10
  50. package/src/core/go-project.js +206 -0
  51. package/src/core/java-project.js +403 -0
  52. package/src/core/multi-language-project.js +117 -0
  53. package/src/core/next-explanation.js +63 -0
  54. package/src/core/php-project.js +85 -0
  55. package/src/core/project-detection.js +1760 -52
  56. package/src/core/reconcile-closure.js +4 -1
  57. package/src/core/router.js +156 -3
  58. package/src/core/rust-project.js +400 -0
  59. package/src/core/sql-project.js +141 -0
  60. package/src/core/swift-project.js +200 -0
  61. package/src/core/typescript-project.js +349 -0
  62. package/src/core/xml-structure.js +123 -0
@@ -1,8 +1,9 @@
1
1
  # Third-Party Notices
2
2
 
3
3
  This file records provenance and reuse boundaries for the external URLs cited
4
- by the README and guides. A citation is a reference, not a declaration that a
5
- resource is a dependency, bundled material, or available for reuse.
4
+ by the README and guides. A citation is a reference, not by itself a
5
+ declaration that a resource is a dependency, bundled material, or available
6
+ for reuse.
6
7
 
7
8
  ## Collection license
8
9
 
@@ -100,11 +101,12 @@ dependencies, version, and distribution conditions before adoption.
100
101
  ### Runtime and validator boundary
101
102
 
102
103
  The distributed CLI and repository validators use Node.js and Python standard
103
- libraries plus the JSON Schema documents shipped in this repository. No
104
- third-party runtime package, agent, provider, plugin, remote trace service, or
105
- model is bundled or installed by `ForgeLoop`. A future host that adds one of
106
- those capabilities must review its own license, dependency tree, credentials,
107
- network behavior, and distribution terms separately.
104
+ libraries plus the JSON Schema documents shipped in this repository. The core
105
+ CLI has one approved runtime package, `smol-toml`, for structural Cargo
106
+ manifest parsing; it is not used as an agent, provider, plugin, remote trace
107
+ service, or model. Every future runtime capability must review its own license,
108
+ dependency tree, credentials, network behavior, and distribution terms
109
+ separately.
108
110
 
109
111
  ## Visual, gradient, and gallery references
110
112
 
@@ -213,6 +215,16 @@ or make its prescriptive examples universal.
213
215
 
214
216
  ## Runtime dependencies with upstream notices
215
217
 
218
+ ### smol-toml 1.8.0
219
+
220
+ - Project/source: [squirrelchat/smol-toml](https://github.com/squirrelchat/smol-toml).
221
+ - License declared by the upstream package: BSD-3-Clause.
222
+ - Use in this collection: bounded structural parsing of Rust `Cargo.toml`
223
+ manifests without executing Cargo or evaluating project code.
224
+ - Boundary: the exact version is pinned in `package.json` and
225
+ `package-lock.json`; the dependency has no role in routing authority beyond
226
+ the parser result and is not exposed as a public ForgeLoop integration.
227
+
216
228
  ### Microsoft tgrep
217
229
 
218
230
  - Project: [microsoft/tgrep](https://github.com/microsoft/tgrep).
@@ -42,7 +42,7 @@ case $words[2] in
42
42
  inspect) _arguments '--contract-file[current JSON contract used for freshness comparison]' '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--version[show the installed package version]' ;;
43
43
  metrics) _arguments '--help[show this help]' '--json[emit trajectory metrics as JSON]' '--path[target project directory (default: current directory)]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--version[show the installed package version]' ;;
44
44
  migrate-protocol) _arguments '--dry-run[show migration actions without writing or deleting artifacts]' '--help[show this help]' '--json[emit structured migration result as JSON]' '--path[target project directory (default: current directory)]' '--to[target supported protocol version]' '--version[show the installed package version]' ;;
45
- next) _arguments '--compact[emit a bounded next-action projection]' '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--version[show the installed package version]' ;;
45
+ next) _arguments '--compact[emit a bounded next-action projection]' '--explain[include bounded read-only blocker and recovery explanation]' '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--version[show the installed package version]' ;;
46
46
  policy) _arguments '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--version[show the installed package version]' ;;
47
47
  policy-diff) _arguments '--after[path to after policy JSON]' '--before[path to before policy JSON]' '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--version[show the installed package version]' ;;
48
48
  policy-discover) _arguments '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--version[show the installed package version]' '--write[persist discovered policy to .forgeloop/policy/discovery.json]' ;;
@@ -74,8 +74,8 @@ case $words[2] in
74
74
  run-check) _arguments '--[exact command argv to classify, execute, and attest]' '--details[additional structured check details]' '--help[show this help]' '--id[stable check identifier]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--requirement[completion requirement covered by the check]' '--scope-ref[current verification-scope.json to bind to execution evidence]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--timeout-ms[maximum command duration before termination]' '--version[show the installed package version]' ;;
75
75
  search) _arguments '--after-context[lines of context after matches]' '--before-context[lines of context before matches]' '--context[lines of context before and after matches]' '--files-with-matches[return matching file paths only]' '--fixed-strings[treat the pattern as a literal string]' '--glob[include files matching a glob]' '--help[show this help]' '--ignore-case[search case-insensitively]' '--json[emit normalized provider-neutral search JSON]' '--max-count[maximum matches per file]' '--path[target project directory (default: current directory)]' '--smart-case[use case-insensitive search only for lowercase patterns]' '--stats[include observed native search statistics]' '--type[include files of a tgrep type]' '--version[show the installed package version]' '--word-regexp[match whole words only]' ;;
76
76
  status) _arguments '--contract-file[current JSON contract used for freshness comparison]' '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--version[show the installed package version]' ;;
77
- task-create) _arguments '--claim[scoped file path or directory prefix claimed for mutation]' '--contract-file[path to initial contract file]' '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--version[show the installed package version]' ;;
78
- task-list) _arguments '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--version[show the installed package version]' ;;
77
+ task-create) _arguments '--claim[scoped file path or directory prefix claimed for mutation]' '--contract-file[path to initial contract file]' '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--preset[bounded contract preset: documentation, bug, feature, or release]' '--preview[preview the contract without creating lifecycle state]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--version[show the installed package version]' ;;
78
+ task-list) _arguments '--active[only return healthy tasks with active ownership and a non-terminal phase]' '--help[show this help]' '--json[emit structured output as JSON]' '--limit[maximum tasks to return]' '--offset[number of sorted tasks to skip]' '--path[target project directory (default: current directory)]' '--phase[only return tasks in this lifecycle phase]' '--version[show the installed package version]' ;;
79
79
  task-lock-status) _arguments '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--version[show the installed package version]' ;;
80
80
  task-migrate) _arguments '--dry-run[show planned migration actions without moving files]' '--help[show this help]' '--json[emit structured output as JSON]' '--path[target project directory (default: current directory)]' '--version[show the installed package version]' ;;
81
81
  task-recover) _arguments '--acknowledge-recovery[acknowledge release of claims for a STALE or ABANDONED task (required; not host attestation)]' '--help[show this help]' '--json[emit structured output as JSON]' '--operator-authorized[deprecated alias for --acknowledge-recovery; does not attest operator authority]' '--path[target project directory (default: current directory)]' '--task[task ID to operate on (when omitted, resolved from context or single active task)]' '--version[show the installed package version]' ;;
@@ -140,7 +140,7 @@ _forgeloop() {
140
140
  inspect) COMPREPLY=( $(compgen -W '--contract-file --help --json --path --task --version' -- "$cur") );;
141
141
  metrics) COMPREPLY=( $(compgen -W '--help --json --path --task --version' -- "$cur") );;
142
142
  migrate-protocol) COMPREPLY=( $(compgen -W '--dry-run --help --json --path --to --version' -- "$cur") );;
143
- next) COMPREPLY=( $(compgen -W '--compact --help --json --path --task --version' -- "$cur") );;
143
+ next) COMPREPLY=( $(compgen -W '--compact --explain --help --json --path --task --version' -- "$cur") );;
144
144
  policy) COMPREPLY=( $(compgen -W '--help --json --path --task --version' -- "$cur") );;
145
145
  policy-diff) COMPREPLY=( $(compgen -W '--after --before --help --json --path --task --version' -- "$cur") );;
146
146
  policy-discover) COMPREPLY=( $(compgen -W '--help --json --path --version --write' -- "$cur") );;
@@ -172,8 +172,8 @@ _forgeloop() {
172
172
  run-check) COMPREPLY=( $(compgen -W '-- --details --help --id --json --path --requirement --scope-ref --task --timeout-ms --version' -- "$cur") );;
173
173
  search) COMPREPLY=( $(compgen -W '--after-context --before-context --context --files-with-matches --fixed-strings --glob --help --ignore-case --json --max-count --path --smart-case --stats --type --version --word-regexp' -- "$cur") );;
174
174
  status) COMPREPLY=( $(compgen -W '--contract-file --help --json --path --task --version' -- "$cur") );;
175
- task-create) COMPREPLY=( $(compgen -W '--claim --contract-file --help --json --path --task --version' -- "$cur") );;
176
- task-list) COMPREPLY=( $(compgen -W '--help --json --path --version' -- "$cur") );;
175
+ task-create) COMPREPLY=( $(compgen -W '--claim --contract-file --help --json --path --preset --preview --task --version' -- "$cur") );;
176
+ task-list) COMPREPLY=( $(compgen -W '--active --help --json --limit --offset --path --phase --version' -- "$cur") );;
177
177
  task-lock-status) COMPREPLY=( $(compgen -W '--help --json --path --task --version' -- "$cur") );;
178
178
  task-migrate) COMPREPLY=( $(compgen -W '--dry-run --help --json --path --version' -- "$cur") );;
179
179
  task-recover) COMPREPLY=( $(compgen -W '--acknowledge-recovery --help --json --operator-authorized --path --task --version' -- "$cur") );;
@@ -258,6 +258,7 @@ complete -c forgeloop -f -n '__fish_seen_subcommand_from migrate-protocol' -l 'p
258
258
  complete -c forgeloop -f -n '__fish_seen_subcommand_from migrate-protocol' -l 'to' -d 'target supported protocol version'
259
259
  complete -c forgeloop -f -n '__fish_seen_subcommand_from migrate-protocol' -l 'version' -d 'show the installed package version'
260
260
  complete -c forgeloop -f -n '__fish_seen_subcommand_from next' -l 'compact' -d 'emit a bounded next-action projection'
261
+ complete -c forgeloop -f -n '__fish_seen_subcommand_from next' -l 'explain' -d 'include bounded read-only blocker and recovery explanation'
261
262
  complete -c forgeloop -f -n '__fish_seen_subcommand_from next' -l 'help' -d 'show this help'
262
263
  complete -c forgeloop -f -n '__fish_seen_subcommand_from next' -l 'json' -d 'emit structured output as JSON'
263
264
  complete -c forgeloop -f -n '__fish_seen_subcommand_from next' -l 'path' -d 'target project directory (default: current directory)'
@@ -512,11 +513,17 @@ complete -c forgeloop -f -n '__fish_seen_subcommand_from task-create' -l 'contra
512
513
  complete -c forgeloop -f -n '__fish_seen_subcommand_from task-create' -l 'help' -d 'show this help'
513
514
  complete -c forgeloop -f -n '__fish_seen_subcommand_from task-create' -l 'json' -d 'emit structured output as JSON'
514
515
  complete -c forgeloop -f -n '__fish_seen_subcommand_from task-create' -l 'path' -d 'target project directory (default: current directory)'
516
+ complete -c forgeloop -f -n '__fish_seen_subcommand_from task-create' -l 'preset' -d 'bounded contract preset: documentation, bug, feature, or release'
517
+ complete -c forgeloop -f -n '__fish_seen_subcommand_from task-create' -l 'preview' -d 'preview the contract without creating lifecycle state'
515
518
  complete -c forgeloop -f -n '__fish_seen_subcommand_from task-create' -l 'task' -d 'task ID to operate on (when omitted, resolved from context or single active task)'
516
519
  complete -c forgeloop -f -n '__fish_seen_subcommand_from task-create' -l 'version' -d 'show the installed package version'
520
+ complete -c forgeloop -f -n '__fish_seen_subcommand_from task-list' -l 'active' -d 'only return healthy tasks with active ownership and a non-terminal phase'
517
521
  complete -c forgeloop -f -n '__fish_seen_subcommand_from task-list' -l 'help' -d 'show this help'
518
522
  complete -c forgeloop -f -n '__fish_seen_subcommand_from task-list' -l 'json' -d 'emit structured output as JSON'
523
+ complete -c forgeloop -f -n '__fish_seen_subcommand_from task-list' -l 'limit' -d 'maximum tasks to return'
524
+ complete -c forgeloop -f -n '__fish_seen_subcommand_from task-list' -l 'offset' -d 'number of sorted tasks to skip'
519
525
  complete -c forgeloop -f -n '__fish_seen_subcommand_from task-list' -l 'path' -d 'target project directory (default: current directory)'
526
+ complete -c forgeloop -f -n '__fish_seen_subcommand_from task-list' -l 'phase' -d 'only return tasks in this lifecycle phase'
520
527
  complete -c forgeloop -f -n '__fish_seen_subcommand_from task-list' -l 'version' -d 'show the installed package version'
521
528
  complete -c forgeloop -f -n '__fish_seen_subcommand_from task-lock-status' -l 'help' -d 'show this help'
522
529
  complete -c forgeloop -f -n '__fish_seen_subcommand_from task-lock-status' -l 'json' -d 'emit structured output as JSON'
@@ -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.12.0
10
+ Package version: 1.13.0
11
11
 
12
12
  ## Canonical loop
13
13
 
@@ -19,6 +19,32 @@ Package version: 1.12.0
19
19
  6. Run forgeloop complete; accept completion only when the validator returns VALID.
20
20
  7. Run forgeloop next again and follow the returned lifecycle action to a terminal state or an explicit blocker.
21
21
 
22
+ ## Project evidence and guide routing
23
+
24
+ - The canonical guide registry is `src/config/guides.json`; the .NET
25
+ specialist has guide ID `dotnet` and resolves to
26
+ `ENG/dotnet-aspnetcore-development-eng.md`.
27
+ - Project evidence schema v1 recognizes
28
+ structurally parsed Flutter, SDK-style .NET, Node.js, Rust, C, C++, Java,
29
+ SQL, Go, TypeScript, PHP, and Swift project evidence. SQL remains a bounded
30
+ owned-file overlay, while same-root language identities compose. ASP.NET Core
31
+ and ABP are conditional overlays recorded as reasons on `dotnet`; they
32
+ are not standalone guide IDs, and route validation requires each overlay to
33
+ include `dotnet`.
34
+ - Project detection is bounded by 256
35
+ manifests, 64 solution files,
36
+ 1048576 bytes per manifest,
37
+ 256 supporting source files,
38
+ 524288 bytes per source file,
39
+ 4096 visited directories, and
40
+ 20000 visited entries. It skips
41
+ symlinks and configured generated/vendor directories; exhausted budgets fail
42
+ closed rather than producing unbounded discovery.
43
+ - Task ownership discovery is a separate exhaustive operation. Task-list
44
+ filters and pagination project the validated discovery result and do not
45
+ remove ledger or recovery evidence. See `GUIDE_ROUTER.md` and
46
+ `docs/CLI_REFERENCE.md` for the operator-facing contracts.
47
+
22
48
  ## Adaptive execution profiles
23
49
 
24
50
  `complianceMode` controls how strongly project policy is enforced. The
@@ -117,6 +143,33 @@ Phases: RECEIVED, DISCOVERING, CONTRACT_READY, ROUTED, DESIGNING, PLANNED, EXECU
117
143
  Protocol v1, schema v1, and Integration API v1 remain independent of these
118
144
  capability-family versions.
119
145
 
146
+ ## Guide registry
147
+
148
+ | Guide | Path | Installable |
149
+ | --- | --- | --- |
150
+ | premium | ENG/premium-sites-studio-eng.md | yes |
151
+ | clean | ENG/clean-code-eng.md | yes |
152
+ | test | ENG/test-code-eng.md | yes |
153
+ | security | ENG/sec-code-eng.md | yes |
154
+ | design | ENG/design-code-eng.md | yes |
155
+ | taste | ENG/taste-frontend-eng.md | yes |
156
+ | performance | ENG/perf-code-eng.md | yes |
157
+ | accessibility | ENG/accessibility-eng.md | yes |
158
+ | games | ENG/games-code-design-web-eng.md | yes |
159
+ | documentation | ENG/documentation-quality-eng.md | yes |
160
+ | flutter | ENG/flutter-development-eng.md | yes |
161
+ | dotnet | ENG/dotnet-aspnetcore-development-eng.md | yes |
162
+ | nodejs | ENG/nodejs-backend-development-eng.md | yes |
163
+ | rust | ENG/rust-development-eng.md | yes |
164
+ | c | ENG/c-development-eng.md | yes |
165
+ | cpp | ENG/cpp-development-eng.md | yes |
166
+ | java | ENG/java-development-eng.md | yes |
167
+ | sql | ENG/sql-development-eng.md | yes |
168
+ | go | ENG/go-development-eng.md | yes |
169
+ | typescript | ENG/typescript-development-eng.md | yes |
170
+ | php | ENG/php-development-eng.md | yes |
171
+ | swift | ENG/swift-development-eng.md | yes |
172
+
120
173
  ## Public artifact registry
121
174
 
122
175
  | Key | Scope | Path | Schema | Trust role |
@@ -223,7 +276,7 @@ capability-family versions.
223
276
  | complete | MUTATING | Evaluates verification receipt coverage, gates, and ledger integrity to authorize task completion. |
224
277
  | next | READ_ONLY | Returns deterministic next-action guidance and command recommendations based on active state. |
225
278
  | preflight | MUTATING | Evaluates pre-implementation contract, routing, and gates; synchronizes work state when READY. |
226
- | reconcile-closure | MUTATING | Refreshes the work-state checkpoint of an EXECUTING task whose objective is already satisfied in the current repository, after contract-bound executed evidence, so canonical completion can proceed. |
279
+ | reconcile-closure | MUTATING | Refreshes the work-state checkpoint of an EXECUTING, VERIFYING, or REVIEWING task whose objective is already satisfied in the current repository, after contract-bound executed evidence, so canonical completion can proceed. |
227
280
  | record-decision-criterion | MUTATING | Records an append-only decision settlement criterion bound to the active contract fingerprint. |
228
281
  | record-diagnosis | MUTATING | Records an append-only diagnosis event or structured diagnostic case in the lifecycle event ledger. |
229
282
  | record-hypothesis-disposition | MUTATING | Records an evidence-bound hypothesis disposition update in the lifecycle event ledger. |
@@ -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`) from declared work attributes and bounded structural project evidence such as an affected Flutter SDK dependency.
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, supported .NET project, confirmed Node.js backend runtime, valid Rust Cargo package/workspace, recognized C/C++, Java, Go, TypeScript, PHP, or Swift project, or owned SQL artifact. ASP.NET Core and ABP are conditional reasons on the `dotnet` specialist, not standalone guides; SQL is a host-project overlay.
842
842
  - **When to use**: During discovery before preflight.
843
843
  - **Mutation**: Writes `.forgeloop/task-state/<taskKey>/routing-result.json`.
844
844
  - **Options**:
@@ -982,6 +982,7 @@ Computes the deterministic next action required by the protocol.
982
982
  - `--path <directory>`: target project directory (default: current directory)
983
983
  - `--task <id>`: task ID to operate on (when omitted, resolved from context or single active task)
984
984
  - `--compact`: emit a bounded next-action projection
985
+ - `--explain`: include bounded read-only blocker and recovery explanation
985
986
  - `--json`: emit structured output as JSON
986
987
 
987
988
  <!-- END FORGELOOP GENERATED: cli:next:options -->
@@ -1970,12 +1971,12 @@ Clears canonical work-state checkpoint for the current task.
1970
1971
 
1971
1972
  ### `reconcile-closure`
1972
1973
 
1973
- Reconciles the checkpoint of an EXECUTING task whose objective is already satisfied in the current repository.
1974
+ Reconciles the checkpoint of an EXECUTING, VERIFYING, or REVIEWING task whose objective is already satisfied in the current repository.
1974
1975
 
1975
- - **Purpose**: Refresh the work-state repository fingerprint of a stale EXECUTING task after repository movement, using executed contract-bound evidence that the objective is present, so the canonical completion pipeline can close it.
1976
- - **When to use**: When a task is stuck in EXECUTING with `E_REPOSITORY_CHANGED` / `E_STATE_REVALIDATION_REQUIRED` and its objective was already satisfied by other changes in the current repository.
1977
- - **Mutation**: Appends a `CHECKPOINT_RECONCILED` ledger event (previous/current repository fingerprints plus evidence) and refreshes the work-state repository fingerprint. Phase stays EXECUTING; claims release only through canonical `COMPLETE`.
1978
- - **Safety Note**: Refuses non-EXECUTING tasks, fresh checkpoints, contract or artifact drift, invalid ledgers, unknown requirements, and failing evidence.
1976
+ - **Purpose**: Refresh the work-state repository fingerprint of a stale EXECUTING, VERIFYING, or REVIEWING task after repository movement, using executed contract-bound evidence that the objective is present, so the canonical completion pipeline can close it.
1977
+ - **When to use**: When a task is stuck in EXECUTING, VERIFYING, or REVIEWING with `E_REPOSITORY_CHANGED` / `E_STATE_REVALIDATION_REQUIRED` and its objective was already satisfied by other changes in the current repository. A REVIEWING task also needs authorized completion recovery.
1978
+ - **Mutation**: Appends a `CHECKPOINT_RECONCILED` ledger event (previous/current repository fingerprints plus evidence) and refreshes the work-state repository fingerprint. The phase stays unchanged until the canonical pipeline advances it; claims release only through canonical `COMPLETE`.
1979
+ - **Safety Note**: Refuses other phases, fresh checkpoints, contract or artifact drift, invalid ledgers, unknown requirements, and failing evidence.
1979
1980
  - **Options**:
1980
1981
 
1981
1982
  <!-- BEGIN FORGELOOP GENERATED: cli:reconcile-closure:options -->
@@ -2016,6 +2017,8 @@ Initializes a new isolated task namespace with write claims and contract.
2016
2017
  - `--task <id>`: task ID to operate on (when omitted, resolved from context or single active task)
2017
2018
  - `--claim <path>`: scoped file path or directory prefix claimed for mutation (repeatable)
2018
2019
  - `--contract-file <path>`: path to initial contract file
2020
+ - `--preset <name>`: bounded contract preset: documentation, bug, feature, or release
2021
+ - `--preview`: preview the contract without creating lifecycle state
2019
2022
  - `--json`: emit structured output as JSON
2020
2023
 
2021
2024
  <!-- END FORGELOOP GENERATED: cli:task-create:options -->
@@ -2034,6 +2037,12 @@ Initializes a new isolated task namespace with write claims and contract.
2034
2037
 
2035
2038
  `--contract-file` points to a contract JSON that is validated and copied into the task namespace.
2036
2039
 
2040
+ Use `--preset documentation|bug|feature|release --preview` for a bounded,
2041
+ read-only contract proposal. Preview validates claims and creates no task
2042
+ namespace or project-claims lock; repeat without `--preview` after reviewing
2043
+ the proposal. Presets record unresolved decisions when concrete deliverables
2044
+ are not supplied and do not publish or deploy release artifacts.
2045
+
2037
2046
  ### `task-list`
2038
2047
 
2039
2048
  Lists all tasks discovered in `.forgeloop/task-state/`.
@@ -2045,14 +2054,27 @@ Lists all tasks discovered in `.forgeloop/task-state/`.
2045
2054
  <!-- BEGIN FORGELOOP GENERATED: cli:task-list:options -->
2046
2055
 
2047
2056
  - `--path <directory>`: target project directory (default: current directory)
2057
+ - `--phase <phase>`: only return tasks in this lifecycle phase
2058
+ - `--active`: only return healthy tasks with active ownership and a non-terminal phase
2059
+ - `--limit <number>`: maximum tasks to return
2060
+ - `--offset <number>`: number of sorted tasks to skip
2048
2061
  - `--json`: emit structured output as JSON
2049
2062
 
2050
2063
  <!-- END FORGELOOP GENERATED: cli:task-list:options -->
2051
2064
 
2065
+ Results are sorted by task ID. `--phase` and `--active` filter the
2066
+ presentation only; ownership and corruption checks still run for every
2067
+ discovered task before filtering. `--limit` and `--offset` provide bounded
2068
+ pagination and return `total` and `hasMore` in JSON. Listing never removes
2069
+ ledger or recovery evidence. Discovery itself is exhaustive for valid task
2070
+ namespaces because ownership and conflict correctness must not depend on a
2071
+ page limit.
2072
+
2052
2073
  - **Example**:
2053
2074
 
2054
2075
  ```bash
2055
2076
  forgeloop task-list --json
2077
+ forgeloop task-list --active --limit 20 --offset 0 --json
2056
2078
  ```
2057
2079
 
2058
2080
  ### `task-show`
@@ -79,7 +79,8 @@ generated Markdown regions (<!-- BEGIN FORGELOOP GENERATED: ... -->)
79
79
  ↓
80
80
  semantic conformance checks (scripts/validate_documentation_conformance.mjs)
81
81
  ↓
82
- cross-platform CI (.github/workflows/docs-quality.yml)
82
+ documentation validation (.github/workflows/docs.yml) and the PR aggregator
83
+ (.github/workflows/pr-core.yml)
83
84
  ```
84
85
 
85
86
  ### Provenance Mapping Table
@@ -49,11 +49,61 @@ forgeloop next --task task-contact-form-001 --compact --json
49
49
  forgeloop task-show --task task-contact-form-001 --compact --json
50
50
  ```
51
51
 
52
+ When the task shape is known but a full contract has not been written yet,
53
+ use a bounded preset preview. Preview is read-only and records unresolved
54
+ decisions instead of guessing project facts:
55
+
56
+ ```bash
57
+ forgeloop task-create --task task-contact-form-001 \
58
+ --claim src/components --claim tests \
59
+ --preset feature --preview --json
60
+ ```
61
+
62
+ After reviewing the proposed contract, repeat the command without
63
+ `--preview` to create the namespace and persist the same validated contract.
64
+ The supported presets are `documentation`, `bug`, `feature`, and `release`.
65
+ The release preset retains an independently verified publication requirement;
66
+ it does not publish or deploy anything.
67
+
68
+ For a bounded explanation of a blocked or recovery-sensitive next action, opt
69
+ in with `--explain`. The explanation is read-only and derived from canonical
70
+ reason codes and artifact references:
71
+
72
+ ```bash
73
+ forgeloop next --task task-contact-form-001 --explain --json
74
+ ```
75
+
52
76
  These commands do not bypass contracts, gates, verification, provenance,
53
77
  lifecycle phases, or validator-backed completion. Usage telemetry is optional,
54
78
  never estimated, and never verification evidence; `efficiency --task` compares
55
79
  only against a metadata-compatible local baseline.
56
80
 
81
+ ### Project-aware guide routing
82
+
83
+ ForgeLoop selects specialist context from bounded structural evidence in the
84
+ affected project scope. A parsed `pubspec.yaml` with
85
+ `dependencies.flutter.sdk: flutter` selects `flutter`. A parsed SDK-style
86
+ `*.csproj`, `*.fsproj`, or `*.vbproj` using the supported .NET SDK allowlist
87
+ selects the single `dotnet` guide. Web/Razor/Blazor or
88
+ `Microsoft.AspNetCore.App` evidence adds an ASP.NET Core routing reason, and a
89
+ `Volo.Abp.*` package reference adds an ABP routing reason; neither overlay is a
90
+ standalone guide ID, and each requires `dotnet` in project evidence.
91
+
92
+ Bounded structural inspectors also recognize Go modules/workspaces, valid
93
+ TypeScript configs, Composer/PHP projects, Java Maven/Gradle/Bazel roots,
94
+ SwiftPM/Xcode/native Swift roots, and explicit C/C++ build/source evidence.
95
+ Meaningful SQL migrations and schemas are scoped overlays. Build, compiler,
96
+ package-manager, database, lockfile, generated, and vendor artifacts are not
97
+ executed or promoted beyond their documented evidence contract.
98
+
99
+ Mentions in prose, source snippets, Dockerfiles, lockfiles, package names,
100
+ malformed manifests, and unrelated monorepo roots are insufficient. Mixed
101
+ Flutter/.NET roots stay isolated. Shared MSBuild/NuGet files apply only to
102
+ descendant confirmed .NET projects, and `.sln`/`.slnx` claims use exact
103
+ membership. Discovery skips symlinks and is bounded; see
104
+ [`GUIDE_ROUTER.md`](../GUIDE_ROUTER.md) for the exact allowlist, reason codes,
105
+ and numeric limits.
106
+
57
107
  ---
58
108
 
59
109
  ## 2. Prerequisites
@@ -395,8 +445,17 @@ forgeloop complete --task auth-feature --json
395
445
 
396
446
  # Inspect active tasks
397
447
  forgeloop task-list --json
448
+
449
+ # Filter and page the deterministic projection
450
+ forgeloop task-list --phase EXECUTING --limit 20 --offset 0 --json
451
+ forgeloop task-list --active --limit 20 --offset 20 --json
398
452
  ```
399
453
 
454
+ Task discovery is exhaustive for ownership and conflict correctness. The
455
+ `--phase` and `--active` options filter the presentation after validation;
456
+ `--limit` and `--offset` page the sorted result and JSON includes `total` and
457
+ `hasMore`. Listing is read-only and never removes ledger or recovery evidence.
458
+
400
459
  ---
401
460
 
402
461
  ## 6. What ForgeLoop Creates
@@ -11,8 +11,9 @@ part of the consumer tarball.
11
11
 
12
12
  The package exposes the `forgeloop` executable from `src/cli.js` and the
13
13
  `@cassiomc1/forgeloop/integration` subpath from `src/integration.js`, with its
14
- declaration file. The package has no runtime dependencies and requires Node.js
15
- 20 or newer.
14
+ declaration file. The package has the approved exact `smol-toml` runtime
15
+ dependency for bounded Cargo manifest parsing and requires Node.js 20 or
16
+ newer.
16
17
 
17
18
  ## Included files
18
19
 
@@ -28,10 +29,16 @@ The published tarball includes the following consumer-facing groups:
28
29
  `src/repository-index/tgrep-manifest.json`; native engine binaries are
29
30
  provisioned outside the npm tarball.
30
31
  - **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.
32
+ including `ENG/flutter-development-eng.md`,
33
+ `ENG/dotnet-aspnetcore-development-eng.md`,
34
+ `ENG/nodejs-backend-development-eng.md`,
35
+ `ENG/rust-development-eng.md`, and the C, C++, Java, SQL, Go, TypeScript,
36
+ PHP, and Swift specialists, ships with the guide registry and is resolved
37
+ from package-local paths. Specialists are selected only from their bounded
38
+ structural primary evidence; SQL remains a scoped host-project overlay.
39
+ ASP.NET Core and ABP are conditional routing overlays on the `dotnet` guide,
40
+ not additional package guides. The package does not install or invoke
41
+ framework, compiler, build, package-manager, or database tooling.
35
42
  - **Initialization material:** the root protocol and integration documents,
36
43
  legal notices, the target profile template, and every path listed by
37
44
  `src/core/templates.js`. These files are read by `init` and `update`, so
@@ -44,7 +51,8 @@ The published tarball includes the following consumer-facing groups:
44
51
  generated local repositories and measurements are not.
45
52
  - **User documentation:** the getting-started, integration, CLI, artifact,
46
53
  Repository Index, Persistent Search Transport, troubleshooting, release,
47
- package-boundary, and related reference pages.
54
+ package-boundary, and related reference pages, together with the
55
+ machine-readable documentation and protocol indexes and `CONTRIBUTING.md`.
48
56
  The advisory-context and Ripwire adapter guides ship with the corresponding
49
57
  public integration surface.
50
58
  The typed diagram sources, generated HTML/SVG/receipt artifacts, and
@@ -72,13 +80,17 @@ The tarball intentionally omits repository-only material:
72
80
  - the repository README hero PNG, which is a GitHub-only asset. The packaged
73
81
  README remains intentionally text-first around that relative repository
74
82
  image reference.
83
+ - the execution PoC, its audit, and its evidence package. Packaged README and
84
+ index links to this repository-only material use GitHub URLs so they remain
85
+ truthful for npm consumers.
75
86
 
76
- The package test checks both required paths and these exclusion classes. It
87
+ The package test checks all registered guide paths and these exclusion classes. It
77
88
  also enumerates `src/**/*.js` and fails if a maintained runtime module is
78
89
  missing from the candidate tarball or if a retired helper is reintroduced.
79
90
  The repository index remains a catalog: links from `DOCS_INDEX.md` to tests,
80
- proof-of-concept evidence, historical plans, and source trees may intentionally
81
- resolve only in the full repository and are not package dependencies.
91
+ historical plans, and source trees may intentionally resolve only in the full
92
+ repository and are not package dependencies. The canonical documentation and
93
+ protocol indexes are included in the tarball.
82
94
 
83
95
  ## Verification and publication
84
96
 
@@ -91,10 +103,12 @@ npm run pack:smoke
91
103
  ```
92
104
 
93
105
  `pack:smoke` installs the candidate tarball into a temporary consumer and
94
- exercises the CLI, public Integration API, initialization, schemas, and
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
106
+ exercises the CLI, public Integration API, initialization, schemas, and the
107
+ Structural Quality documentation's packaged diagram references. The
108
+ package-boundary tests also assert
109
+ that every registered guide path, including all language specialists, is
110
+ present in the candidate. The tag-triggered publication
111
+ workflow
98
112
  runs the same smoke gate before `npm publish --provenance --access public`.
99
113
  Publication therefore remains owned by the trusted GitHub Actions OIDC
100
114
  workflow; local package inspection proves the candidate boundary but does not
package/docs/RECIPES.md CHANGED
@@ -35,6 +35,18 @@ Concise, copy-paste friendly recipes for common ForgeLoop tasks.
35
35
 
36
36
  ### Recipe 1 — Start a New Task
37
37
 
38
+ When the task shape is known but the final contract has not been written, first
39
+ request a read-only preset proposal:
40
+
41
+ ```bash
42
+ forgeloop task-create --task task-001 --claim src --claim tests \
43
+ --preset feature --preview --json
44
+ ```
45
+
46
+ Review the bounded proposal, then repeat without `--preview` before continuing
47
+ with the task workflow below. Preview creates no task namespace and acquires no
48
+ project claim lock.
49
+
38
50
  <!-- FORGELOOP EXAMPLE: recipes:create-task | exit=0 | json.taskId=task-001 -->
39
51
  ```bash
40
52
  forgeloop task-create --task task-001 --claim src --claim tests --json
@@ -243,6 +255,12 @@ forgeloop task-create --task billing-feature --claim src/billing --claim tests/b
243
255
  # 3. List active tasks
244
256
  forgeloop task-list --json
245
257
 
258
+ # 3a. Filter and page the read-only ownership-aware projection
259
+ forgeloop task-list --active --limit 20 --offset 0 --json
260
+
261
+ # 3b. Ask for a bounded blocker/recovery explanation when needed
262
+ forgeloop next --task auth-feature --explain --json
263
+
246
264
  # 4. Work on task-1
247
265
  forgeloop route --task auth-feature --work clean-code --surface backend
248
266
  forgeloop preflight --task auth-feature --json
@@ -256,6 +274,11 @@ forgeloop complete --task auth-feature --json
256
274
  forgeloop task-unlock --task auth-feature --force --json
257
275
  ```
258
276
 
277
+ `task-list` discovers all valid task namespaces before applying filters and
278
+ pagination. Its JSON response reports `total` and `hasMore`; filtering does not
279
+ skip ownership or corruption checks, and listing never deletes ledger or
280
+ recovery evidence.
281
+
259
282
  ---
260
283
 
261
284
  ### Recipe 12 — Migrate Legacy 1.0 Single-Task Layout
@@ -13,6 +13,17 @@ boundaries explicit:
13
13
  `ENG/flutter-development-eng.md` and explain that the specialist is
14
14
  selected only from a structurally parsed
15
15
  `dependencies.flutter.sdk: flutter` entry in affected scope.
16
+ - [ ] README catalog and architecture fallback identify
17
+ `ENG/rust-development-eng.md` and explain that the specialist is
18
+ selected only from a structurally parsed `[package]` or `[workspace]`
19
+ table in an affected `Cargo.toml`.
20
+ - [ ] README catalog and architecture fallback identify
21
+ `ENG/nodejs-backend-development-eng.md` and explain that Node.js
22
+ backend/runtime evidence is distinct from build, test, and configuration
23
+ tooling executed under Node.js.
24
+ - [ ] README catalog and architecture fallback identify the C, C++, Java, SQL,
25
+ Go, TypeScript, PHP, and Swift specialists and explain their bounded
26
+ structural evidence and same-root composition rules.
16
27
  - [ ] The canonical engineering-flow source and regenerated HTML/SVG diagram
17
28
  explain project detection as routing context, not verification or
18
29
  completion evidence.
@@ -34,6 +45,22 @@ This branch prepares the candidate and its pull request. npm publication,
34
45
  tagging, GitHub Release, deployment, and merge remain separately authorized
35
46
  actions.
36
47
 
48
+ ## CI minimization validation
49
+
50
+ - [ ] `npm run verify:fast` passes for edit-time feedback.
51
+ - [ ] `npm run verify:prepush` passes before the release pull request; MCP
52
+ setup, when needed, was run explicitly with `npm run mcp:setup`.
53
+ - [ ] Ordinary PR validation uses `.github/workflows/pr-core.yml` with the
54
+ unchanged required contexts `audit`, `CodeQL`, `Verify generated Archify
55
+ diagram`, `validate (22)`, `tarball smoke (ubuntu-latest)`, and
56
+ `dependency-review`.
57
+ - [ ] `validate (22)` is always present and fails closed on an applicable
58
+ prerequisite failure, cancellation, or unexpected skip.
59
+ - [ ] Path classification scenarios cover README-only, ordinary source,
60
+ Repository Index, package-export, and forced release validation.
61
+ - [ ] Main-branch documentation, Node compatibility, package smoke, audit,
62
+ and Windows full-suite workflows remain available for broader validation.
63
+
37
64
  ## Contract and package identity
38
65
 
39
66
  - [ ] `package.json` and `package-lock.json` contain the same package version.
@@ -47,7 +74,7 @@ actions.
47
74
  - [ ] [`docs/PACKAGE_CONTENTS.md`](./PACKAGE_CONTENTS.md) matches the current
48
75
  `package.json` file list and documents intentional inclusions and
49
76
  exclusions.
50
- - [ ] The candidate tarball includes the registered Flutter guide and every
77
+ - [ ] The candidate tarball includes every registered specialist guide and every
51
78
  other `src/config/guides.json` path; no repository-only guide state is
52
79
  packaged.
53
80
  - [ ] Every maintained `src/**/*.js` module is present in the candidate
@@ -70,7 +97,8 @@ actions.
70
97
  - [ ] Stale contract/route identity rejects handoff creation or acceptance.
71
98
  - [ ] An invalid event ledger projects `INCONSISTENT`.
72
99
  - [ ] Continuity lint remains non-authoritative and non-evidence.
73
- - [ ] `npm run dependency:policy` passes without adding runtime dependencies.
100
+ - [ ] `npm run dependency:policy` passes with only the approved exact runtime
101
+ parser dependency and approved development dependencies.
74
102
  - [ ] `npm run lint` passes.
75
103
  - [ ] `npm test` passes.
76
104
  - [ ] `npm run benchmark:profiles:check` passes; absent provider/host history