@giamme/forge 0.0.0-stage → 0.8.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 (127) hide show
  1. package/CHANGELOG.md +181 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1854 -2
  4. package/SKILL.md +122 -0
  5. package/VERSION +1 -0
  6. package/forge +74 -0
  7. package/package.json +26 -4
  8. package/references/dataset.md +329 -0
  9. package/references/decompose.md +667 -0
  10. package/references/fractal-dashboard.md +21 -0
  11. package/references/fractal.md +307 -0
  12. package/references/harnesses.md +353 -0
  13. package/references/jev.md +865 -0
  14. package/references/memory.md +228 -0
  15. package/references/planning.md +42 -0
  16. package/references/ripwire.md +47 -0
  17. package/references/runtime.md +64 -0
  18. package/references/solo.md +113 -0
  19. package/references/ui.md +112 -0
  20. package/registry.tsv +81 -0
  21. package/scripts/forge-artifact.sh +78 -0
  22. package/scripts/forge-contract.py +430 -0
  23. package/scripts/forge-dataset.py +6 -0
  24. package/scripts/forge-dispatch.sh +665 -0
  25. package/scripts/forge-fail-first.py +195 -0
  26. package/scripts/forge-fractal-dispatch.sh +4 -0
  27. package/scripts/forge-fractal-options.sh +54 -0
  28. package/scripts/forge-fractal.py +6 -0
  29. package/scripts/forge-guard.py +266 -0
  30. package/scripts/forge-install-fractal.sh +4 -0
  31. package/scripts/forge-install-ripwire.sh +52 -0
  32. package/scripts/forge-install.sh +135 -0
  33. package/scripts/forge-jev-options.sh +259 -0
  34. package/scripts/forge-jev.py +6 -0
  35. package/scripts/forge-lib-plans.sh +785 -0
  36. package/scripts/forge-lib-review.sh +494 -0
  37. package/scripts/forge-lib-task.sh +302 -0
  38. package/scripts/forge-lib-verify.sh +30 -0
  39. package/scripts/forge-memory.sh +575 -0
  40. package/scripts/forge-metrics.sh +39 -0
  41. package/scripts/forge-parallel-options.sh +76 -0
  42. package/scripts/forge-parallel.sh +1717 -0
  43. package/scripts/forge-plan-check.py +118 -0
  44. package/scripts/forge-prompt.py +45 -0
  45. package/scripts/forge-ripwire.py +136 -0
  46. package/scripts/forge-route.py +344 -0
  47. package/scripts/forge-runtime.py +533 -0
  48. package/scripts/forge-schedule.py +312 -0
  49. package/scripts/forge-shadow.py +305 -0
  50. package/scripts/forge-solo.sh +347 -0
  51. package/scripts/forge-ui-options.sh +42 -0
  52. package/scripts/forge-ui.py +435 -0
  53. package/scripts/forge-update.sh +71 -0
  54. package/scripts/forge-verify-coverage.py +956 -0
  55. package/scripts/forge-version.py +198 -0
  56. package/scripts/forge_dataset/__init__.py +439 -0
  57. package/scripts/forge_dataset/capture.py +330 -0
  58. package/scripts/forge_dataset/checks.py +109 -0
  59. package/scripts/forge_dataset/cli.py +233 -0
  60. package/scripts/forge_dataset/export.py +1009 -0
  61. package/scripts/forge_dataset/harvest.py +716 -0
  62. package/scripts/forge_dataset/importer.py +412 -0
  63. package/scripts/forge_dataset/outcomes.py +275 -0
  64. package/scripts/forge_dataset/routing.py +278 -0
  65. package/scripts/forge_fractal/__init__.py +83 -0
  66. package/scripts/forge_fractal/bridge.py +46 -0
  67. package/scripts/forge_fractal/cli.py +202 -0
  68. package/scripts/forge_fractal/dashboard.css +138 -0
  69. package/scripts/forge_fractal/dashboard.html +41 -0
  70. package/scripts/forge_fractal/dashboard.js +687 -0
  71. package/scripts/forge_fractal/decomposition.py +262 -0
  72. package/scripts/forge_fractal/execution.py +659 -0
  73. package/scripts/forge_fractal/inspection.py +261 -0
  74. package/scripts/forge_fractal/install.py +158 -0
  75. package/scripts/forge_fractal/invocation.py +94 -0
  76. package/scripts/forge_fractal/pipeline.py +124 -0
  77. package/scripts/forge_fractal/selection.py +179 -0
  78. package/scripts/forge_jev/__init__.py +376 -0
  79. package/scripts/forge_jev/backtest.py +322 -0
  80. package/scripts/forge_jev/cli.py +980 -0
  81. package/scripts/forge_jev/client.py +418 -0
  82. package/scripts/forge_jev/corpus.py +156 -0
  83. package/scripts/forge_jev/coupling.py +244 -0
  84. package/scripts/forge_jev/features.py +24 -0
  85. package/scripts/forge_jev/gates.py +100 -0
  86. package/scripts/forge_jev/memory.py +163 -0
  87. package/scripts/forge_jev/outcome.py +49 -0
  88. package/scripts/forge_jev/predict.py +204 -0
  89. package/scripts/forge_jev/questions.py +661 -0
  90. package/scripts/forge_jev/review.py +73 -0
  91. package/scripts/forge_jev/routing.py +271 -0
  92. package/scripts/forge_jev/subset.py +123 -0
  93. package/scripts/forge_jev/verify.py +453 -0
  94. package/scripts/forge_registry.py +140 -0
  95. package/ui/README.md +287 -0
  96. package/ui/THIRD_PARTY_NOTICES.md +69 -0
  97. package/ui/docs/api.md +888 -0
  98. package/ui/forge_ui/__init__.py +20 -0
  99. package/ui/forge_ui/__main__.py +135 -0
  100. package/ui/forge_ui/diffs.py +454 -0
  101. package/ui/forge_ui/executions.py +436 -0
  102. package/ui/forge_ui/export.py +204 -0
  103. package/ui/forge_ui/findings.py +132 -0
  104. package/ui/forge_ui/fractal.py +583 -0
  105. package/ui/forge_ui/models.py +216 -0
  106. package/ui/forge_ui/reader.py +1336 -0
  107. package/ui/forge_ui/server.py +303 -0
  108. package/ui/forge_ui/static/app.js +924 -0
  109. package/ui/forge_ui/static/cloud3d.js +646 -0
  110. package/ui/forge_ui/static/cloudmodel.js +375 -0
  111. package/ui/forge_ui/static/cloudui.js +394 -0
  112. package/ui/forge_ui/static/diffview.js +216 -0
  113. package/ui/forge_ui/static/favicon.svg +1 -0
  114. package/ui/forge_ui/static/files.js +776 -0
  115. package/ui/forge_ui/static/gantt.js +97 -0
  116. package/ui/forge_ui/static/graph.js +266 -0
  117. package/ui/forge_ui/static/index.html +55 -0
  118. package/ui/forge_ui/static/iso.js +765 -0
  119. package/ui/forge_ui/static/leaderboard.js +315 -0
  120. package/ui/forge_ui/static/map3d.js +45 -0
  121. package/ui/forge_ui/static/modelstats.js +249 -0
  122. package/ui/forge_ui/static/notify.js +179 -0
  123. package/ui/forge_ui/static/panel.js +526 -0
  124. package/ui/forge_ui/static/runmodel.js +651 -0
  125. package/ui/forge_ui/static/scene3d.js +996 -0
  126. package/ui/forge_ui/static/search.js +119 -0
  127. package/ui/forge_ui/static/style.css +618 -0
@@ -0,0 +1,21 @@
1
+ # Forge run inspector: approved design brief
2
+
3
+ The dashboard and portable HTML report inspect one Fractal run at a time. The interface is dark-only, code-first and read-only. Fractal execution, Forge acceptance, verification and QA remain separate statuses; execution completion does not imply acceptance.
4
+
5
+ ## Workspace
6
+
7
+ - A compact header identifies the run. The left pane holds searchable task and node rows with goal excerpts, status, model and parent/child nesting. Search retains ancestors of matching nodes.
8
+ - The right pane opens on the run overview, with progress and problems first. Task views are Summary, QA and History. Node views are Overview, Decomposition, Logs and Changes. Configuration and copyable terminal commands are secondary run views.
9
+ - Decomposition decisions show decision, reason, phase, planner, attempts, bounds and admitted children as fields. Logs are selected by step and file. Candidate changes are shown as line-oriented diffs, and raw text can be downloaded.
10
+ - Run, task, node and view live in the URL. The runs index is reachable even when the server was launched with a run ID. Browser Back and Forward restore selection.
11
+ - At narrow widths, the navigator and details become separate screens with an explicit back action. Keyboard focus is visible and status uses text as well as color. Reduced motion is respected.
12
+
13
+ ## Refresh and data
14
+
15
+ Progress is requested about every two seconds. The page keeps its header, navigator, detail pane, selected item, tab, search, expanded rows, focus and scroll positions mounted while fields and rows reconcile by stable identifiers. It does not refocus a control during a refresh. A resource has at most one request in flight; late replies from a previous navigation are ignored.
16
+
17
+ The last successful view stays visible if a request fails. The status says stale/reconnecting and offers Retry. “Pause live updates” stops browser polling and is distinct from pausing run execution. Log follow starts off, turns off when the reader scrolls away, and can be restored with “Jump to latest.”
18
+
19
+ The live `data` endpoint supports `scope=progress`, `scope=runs`, and `scope=artifact` with a selected task and optional node. Artifacts are `task`, `node`, `qa`, `history`, `logs` and `changes`; history also takes `table=events|steps|messages` and a zero-based `offset`. An unscoped `data` request retains the original full projection for compatibility. Heavy files and ledger pages are fetched only for the selected view. The CLI capture schema and commands remain available.
20
+
21
+ The Python renderer inlines the separate CSS and JavaScript assets into each report. Portable reports retain the complete captured history and logs, escape artifact text and open from `file:` without network access. The loopback host check, ephemeral token, read-only HTTP surface and managed-file boundary remain in force. No execution engine, run-state schema or browser execution control is part of this design.
@@ -0,0 +1,307 @@
1
+ # Opt-in Fractal execution
2
+
3
+ Forge can run its implementation stage through Fractal while continuing to own
4
+ model routing, independent QA of the cumulative diff, verification and integration.
5
+ Fractal execution completion and Forge acceptance are separate outcomes. Costs are
6
+ observational, and this integration makes no speed or cost-saving claim.
7
+
8
+ For a first run, follow the [README walkthrough](../README.md#fractal-execution).
9
+ This reference covers the exact selection, routing, lifecycle and inspection contracts.
10
+
11
+ ## Contents
12
+
13
+ - [Selecting a run](#selecting-a-run)
14
+ - [Installation and provenance](#installation-and-provenance)
15
+ - [Bridge, routing and ownership](#bridge-routing-and-ownership)
16
+ - [Automatic decomposition decisions](#automatic-decomposition-decisions)
17
+ - [Limits and lifecycle](#limits-and-lifecycle)
18
+ - [Inspection and controls](#inspection-and-controls)
19
+ - [Managed data and identifiers](#managed-data-and-identifiers)
20
+ - [Troubleshooting](#troubleshooting)
21
+ - [Verification](#verification)
22
+
23
+ ## Selecting a run
24
+
25
+ ```sh
26
+ bash scripts/forge-solo.sh /path/outside/repo/run --repo /path/to/repo \
27
+ --dwarf sol --qa opus --fractal
28
+ bash scripts/forge-parallel.sh run /path/to/plan --fractal
29
+ ```
30
+
31
+ Both runners accept mutually exclusive `--fractal` and `--no-fractal`. Either skips
32
+ the question. Without flags, interactive runs ask `Use Fractal for this run? [y/N]`;
33
+ unattended and dry runs default off. `/forge` asks conversationally and supplies the
34
+ answer explicitly. Installing software does not select a backend. A run directory
35
+ retains its choice for resume and explicit retry; a new directory starts a new choice.
36
+ A selected but unavailable runtime is an actionable preflight failure. Interactive
37
+ users can choose installation or explicitly choose ordinary execution.
38
+
39
+ Dry runs resolve pools and show limits and proposed managed paths. They neither
40
+ install dependencies nor invoke providers, including when inspecting an existing run.
41
+ Limits and routing pools are frozen with the run; changed settings require a new
42
+ run directory. A missing runtime on resume can be reinstalled, preserving the backend.
43
+
44
+ `--fractal-auto-decompose` enables Fractal and the automatic decision policy described
45
+ below. It conflicts with `--no-fractal`. Existing runs retain their recorded policy;
46
+ enabling automatic decomposition on a legacy run requires a new run directory.
47
+
48
+ ## Installation and provenance
49
+
50
+ ```sh
51
+ ./forge fractal install --dry-run
52
+ ./forge fractal install --yes --with-prerequisites
53
+ ./forge fractal doctor --spec sol --spec opus --json
54
+ ```
55
+
56
+ `scripts/forge-install-fractal.sh` is equivalent to `forge fractal install`. Installation
57
+ uses an isolated uv environment under `$XDG_STATE_HOME/forge/fractal/runtime`, defaulting
58
+ to `~/.local/state/forge/fractal/runtime`. The pinned package is **Fractal 1.2.0**, revision
59
+ [`18793200c0d7e8cdb2db369ea3abe5647a1e15e4`](https://github.com/plasma-ai/fractal/tree/18793200c0d7e8cdb2db369ea3abe5647a1e15e4).
60
+ Its source archive is SHA-256 checked. The runtime includes the required `wiki` executable.
61
+ Installed dependency versions and provenance are recorded in `provenance.json`.
62
+
63
+ A compatible installed Python (3.12–3.14) is preferred; otherwise prerequisite
64
+ installation provisions managed Python 3.13. Missing uv is bootstrapped from the
65
+ official **0.8.22** release using platform-specific pinned checksums. Missing tmux is
66
+ installed using existing Homebrew on macOS or apt on Debian/Ubuntu. Other systems
67
+ receive concrete instructions. Unattended prerequisite installation requires both
68
+ `--yes` and `--with-prerequisites`; privilege errors retain diagnostics and the command
69
+ to run. No shell startup file, unrelated Python environment or existing Fractal
70
+ installation is modified. Repeated successful installation is a no-op. Partial
71
+ installations and diagnostics remain under `installs/`.
72
+
73
+ The ordinary Forge installer offers this as an optional step; declining or an
74
+ installation failure does not block ordinary Forge setup. The executable `./forge`
75
+ is always available locally and never replaces another installed `forge` command.
76
+
77
+ ## Bridge, routing and ownership
78
+
79
+ The deployment's `agents.py` exports `ForgeAgent` using the pinned upstream extension
80
+ contract; there is no Fractal fork. Fractal's `Agent.invocation`, `Agent.spawn`, stream
81
+ parser and lifecycle ledger wrap existing `forge-dispatch.sh` calls. Codex, Claude,
82
+ OpenClaude, OpenCode and Antigravity keep their existing effort validation, permission
83
+ flags, prompt preparation, attempt records and raw logs. Selecting Fractal never
84
+ implies `--yolo-dwarf`.
85
+
86
+ Every work step is a fresh provider invocation. Parents receive preserved work and
87
+ child results on their next invocation, without requiring provider conversation resume.
88
+ The root implementation node covers coordination, implementation and requested checks.
89
+ Parents can return the following final-line protocol to request children and yield:
90
+
91
+ ```text
92
+ FORGE_FRACTAL: {"children":[{"id":"parser","goal":"Implement and verify the parser","difficulty":"low","paths":["src/parser.py"],"deps":[]}]}
93
+ ```
94
+
95
+ After requested work and verification, the node returns:
96
+
97
+ ```text
98
+ FORGE_FRACTAL: {"done":true}
99
+ ```
100
+
101
+ Child identifiers are unique for the task lifetime. Dependencies refer to siblings
102
+ that already exist or are declared in the same batch. Missing or cyclic dependencies,
103
+ ownership outside the parent, metadata ownership, and exhausted bounds are rejected
104
+ before dispatch. Overlapping ownership is serialized. A parent holds no model slot
105
+ while waiting for children; imports are serialized and checked against declared paths.
106
+
107
+ `--dwarf-low`, `--dwarf-medium` and `--dwarf-high` accept comma-separated pools. The
108
+ decomposed planner persists these pools; solo accepts them directly. Routing falls
109
+ back to the explicitly configured general dwarf pool, then the parent's resolved
110
+ dwarf. All eligible specs are preflighted and canonical resolutions frozen before
111
+ execution. Each node records its difficulty, requested spec and resolved model.
112
+
113
+ ## Automatic decomposition decisions
114
+
115
+ ```sh
116
+ bash scripts/forge-solo.sh /path/outside/repo/new-run --repo /path/to/repo \
117
+ --dwarf luna:high --qa sol:high --fractal-auto-decompose --fractal-planner sol:xhigh
118
+ bash scripts/forge-parallel.sh run /path/to/new-plan \
119
+ --fractal-auto-decompose --fractal-planner sol:xhigh --fractal-depth 3 --fractal-nodes 24
120
+ ```
121
+
122
+ Approve the top-level task/model table as usual. Within that approved ownership and
123
+ the frozen limits, decisions and child execution are automatic: no per-node questions.
124
+ Every eligible node gets a dedicated planning-only call before implementation. The
125
+ planner sees the complete approved contract, scoped goal, existing child results,
126
+ available routing, depth and remaining capacity. It splits useful separable work or
127
+ records why the work is atomic; the policy does not force artificial subtasks.
128
+
129
+ `--fractal-planner <spec>` chooses the decision model independently of dwarf pools and
130
+ requires automatic mode. When omitted, parallel runs reuse their saved top-level
131
+ planner; otherwise each task's initial root dwarf spec plans its whole tree, including
132
+ low-strength children. `/forge` forwards any selected top-level planner for solo runs
133
+ as well. Planner-role defaults apply (unspecified effort defaults to `xhigh`). Canonical
134
+ planner resolutions are preflighted and frozen; resume/retry cannot change them.
135
+
136
+ The planner returns exactly one final-line marker:
137
+
138
+ ```text
139
+ FORGE_FRACTAL: {"decision":"atomic","reason":"One tightly coupled change remains"}
140
+ FORGE_FRACTAL: {"decision":"split","reason":"Independent modules","children":[{"id":"parser","goal":"Implement and test parser","difficulty":"low","paths":["src/parser.py"],"deps":[]},{"id":"formatter","goal":"Implement and test formatter","difficulty":"low","paths":["src/formatter.py"],"deps":[]}]}
141
+ ```
142
+
143
+ Choose one marker. A split needs at least two children; normal ownership and dependency
144
+ validation applies. At the depth limit, or with fewer than two available child/node
145
+ slots, Forge records `bounded` and proceeds without a planning call. Admission reserves
146
+ lifetime capacity and persists exact child routing before spawning, so recovery does
147
+ not duplicate children. Children receive the same decision stage recursively; parents
148
+ integrate their results and verify the combined work. Implementation responses cannot
149
+ spawn children directly in automatic mode.
150
+
151
+ Planning runs in disposable snapshots with planner permissions and no yolo bypass.
152
+ Changes to snapshot product content, HEAD or staged content invalidate the decision;
153
+ snapshot changes are never imported. Provider permission flags alone are not a universal
154
+ filesystem sandbox. Two invalid planning responses exhaust the decision stage; provider
155
+ failure or mutation halts it immediately. There is no silent fallback to implementation.
156
+
157
+ Planning shares the run's model slots, invocation timeout and task deadline. Its attempts
158
+ are recorded separately from implementation iterations. Resume reuses accepted decisions
159
+ and completes pending admissions. Explicit retry archives replaced or failed decisions;
160
+ changed goals are replanned while completed children, work and lifetime accounting survive.
161
+ Inspect decisions, reasons, planner resolutions and history with `tree`, `status`, `logs`,
162
+ or the existing HTML report. Extra planning calls consume quota; no speed/cost saving is promised.
163
+
164
+ ## Limits and lifecycle
165
+
166
+ | Runner option | Default | Scope |
167
+ | --- | --- | --- |
168
+ | `--fractal-depth` | 2 | Levels below the implementation node |
169
+ | `--fractal-children` | 3 | Unsettled direct children per node |
170
+ | `--fractal-nodes` | 12 | Lifetime nodes including implementation, per task |
171
+ | `--fractal-iterations` | 6 | Per node, per explicit execution attempt |
172
+ | `--fractal-concurrency` | 3 | Shared across all task trees and Forge QA |
173
+ | `--fractal-deadline` | 2700 seconds | Task execution attempt, excluding pauses |
174
+
175
+ Limits must be positive integers, except depth may be zero to disallow children.
176
+ Decomposed `--max-parallel` remains a separate limit on top-level task pipelines.
177
+ Increasing it does not increase the shared Fractal invocation limit.
178
+
179
+ `--fractal-max-cost` returns an unsupported-capability error: the bridge cannot
180
+ enforce a dollar cap. Unknown tokens, tools and cost data remain unknown.
181
+ The existing `--timeout` also bounds each implementation invocation when supplied;
182
+ the smaller of that timeout and the remaining task deadline reaches the dispatcher.
183
+
184
+ Execution repositories and durable records live under
185
+ `$XDG_STATE_HOME/forge/fractal/runs`. Each task has a Fractal control repository with
186
+ a slash-free `forge-root` branch, separate from product snapshot repositories.
187
+ Initialization trees and the ledger location are recorded in `initialization.json`;
188
+ Fractal metadata therefore cannot enter the product diff. Solo imports preserve
189
+ staging and remain uncommitted. Decomposed candidates return to the existing task
190
+ review/integration pipeline and retain the task's pinned baseline. The user's branch
191
+ still requires the existing explicit integration approval.
192
+
193
+ One coordinator owns each task tree, and runners retain a pipeline lock. Pause
194
+ terminates an in-flight model invocation and preserves its files; resume uses fresh
195
+ instructions. Stop reaps managed processes and preserves artifacts. Resume retains
196
+ baselines and accepted checkpoints. A stopped or interrupted pipeline can be resumed
197
+ through the CLI; explicit retry uses `forge-solo.sh ... --retry` or the existing
198
+ `forge-parallel.sh retry` command. Retry preserves work and records the previous attempt;
199
+ it cannot expand the frozen routing pool. Inspection and stopping never delete runs.
200
+
201
+ Timeout, iteration exhaustion, interruption, stop, source drift and Fractal completion
202
+ remain distinguishable in task/node records. A source drift blocks automatic import.
203
+
204
+ ## Inspection and controls
205
+
206
+ ```sh
207
+ ./forge fractal runs --repo /path/to/repo --json
208
+ ./forge fractal tree RUN --json
209
+ ./forge fractal activity RUN --offset 100 --limit 100
210
+ ./forge fractal logs RUN --task TASK --node NODE --follow
211
+ ./forge fractal costs RUN
212
+ ./forge fractal messages RUN
213
+ ./forge fractal config RUN
214
+ ./forge fractal pause RUN --task TASK --node NODE
215
+ ./forge fractal resume RUN
216
+ ./forge fractal stop RUN
217
+ ./forge fractal open # runs index
218
+ ./forge fractal open RUN # live detail
219
+ ./forge fractal report RUN --html /path/to/report.html
220
+ ```
221
+
222
+ `status`, `tree`, `activity`, `logs`, `costs`, `messages` and `config` expose the same
223
+ captured, self-describing run projection with task/node selectors, `--json` and
224
+ `--html PATH`. A node control requires a task selector. Controls require an explicit
225
+ run ID and record both the requested action and observed state. Run discovery is
226
+ bounded to 1000 entries and returns at most 200 runs with corruption diagnostics.
227
+ Use run-level `resume` to recover the complete Forge pipeline through QA and integration.
228
+ A task/subtree selector resumes that execution scope and does not relaunch unrelated tasks.
229
+
230
+ The [run inspector design brief](fractal-dashboard.md) describes the dark, two-pane
231
+ workspace and its navigation. It is served by Python's standard library on `127.0.0.1`
232
+ with an ephemeral access token. It is read-only, polls about every two seconds, preserves
233
+ focus and pane scroll during updates, pages selected task history and loads selected
234
+ artifacts on demand. “All runs” works from a run-specific launch. Pausing live updates
235
+ only stops browser polling; execution controls are copyable CLI commands. Closing the
236
+ browser server does not stop execution.
237
+
238
+ Ledger inspection uses SQLite `mode=ro` and `query_only`; it never constructs an
239
+ upstream Node for browsing, reconciles lifecycle state or marks radio messages read.
240
+ Only curated managed artifacts are exposed, and symlink/path escapes are rejected.
241
+ Portable reports embed captured data, complete logs and assets, escape artifact
242
+ content, display capture time and missing data, and work without Fractal or a server.
243
+ Credential directories are not part of the export allowlist.
244
+
245
+ Inspection verbs currently emit the same JSON run projection, with the selected task/node
246
+ scope; `--json` makes that intent explicit. Logs are loaded by `logs`, `report` or an HTML
247
+ export. Live text reads are capped at 256 KiB per artifact and include a truncation flag;
248
+ portable exports include complete logs and history. History offsets are zero-based and
249
+ CLI page limits must be between 1 and 1000. `report RUN` defaults to `RUN.html` when
250
+ `--html PATH` is omitted.
251
+
252
+ ## Managed data and identifiers
253
+
254
+ All commands below can be invoked as `<forge-checkout>/forge fractal ...` when the
255
+ checkout is not the current directory. Installing the skill does not put a new `forge`
256
+ executable on your PATH.
257
+
258
+ | Location | Purpose |
259
+ | --- | --- |
260
+ | `<solo-run-or-plan>/fractal-selection.json` | selected backend and, when enabled, managed run ID |
261
+ | `<plan>/fractal-routing.json` | dwarf pools captured during decomposed planning |
262
+ | `<state>/forge/fractal/runtime/` | isolated Fractal and wiki runtime |
263
+ | `<state>/forge/fractal/provenance.json` | pinned revision, checksum and installed versions |
264
+ | `<state>/forge/fractal/installs/` | installation previews, logs and retained failures |
265
+ | `<state>/forge/fractal/runs/<run-id>/run.json` | effective repository, routing, limits and pipeline binding |
266
+ | `<state>/forge/fractal/runs/<run-id>/tasks/` | task checkpoints, control repositories, product candidates and step records |
267
+
268
+ `<state>` is `$XDG_STATE_HOME`, defaulting to `~/.local/state`. `runs --repo DIR` discovers
269
+ managed `run-…` identifiers. `tree RUN --json` reveals managed task IDs and node IDs;
270
+ task request records map back to their Forge runner output directories. These IDs differ
271
+ from a directory basename or the human task ID in `tasks.tsv`.
272
+
273
+ ```bash
274
+ ./forge fractal runs --repo /absolute/path/to/product --json
275
+ ./forge fractal tree RUN_ID --json
276
+ ./forge fractal status RUN_ID --task TASK_ID --node NODE_ID --json
277
+ ./forge fractal logs RUN_ID --task TASK_ID --node NODE_ID --follow
278
+ ./forge fractal report RUN_ID --task TASK_ID --html /absolute/path/to/task-report.html
279
+ ```
280
+
281
+ Use the same scope to resume a pause or stop request. An active control on an ancestor
282
+ still applies to its descendants; resuming a child does not clear a run-level pause.
283
+ Run-level `resume` is the recovery entry point when the full Forge pipeline also needs
284
+ to continue. No inspection or control command deletes these records automatically.
285
+
286
+ ## Troubleshooting
287
+
288
+ | Symptom | Next step |
289
+ | --- | --- |
290
+ | Installed runtime, but a new run uses ordinary execution | explicitly pass `--fractal`; installation is never activation |
291
+ | Selected runtime is unavailable | inspect `doctor`, install the managed runtime, then resume or retry the same run |
292
+ | New pool, backend or limit rejected on resume | use the recorded settings; changed settings require a new run directory |
293
+ | `source_drift` or `scope_drift` | inspect preserved candidate changes and the source/owned paths; automatic import is blocked |
294
+ | `timeout` | inspect setup, per-step logs and elapsed task time; a resumed attempt retains elapsed time, while explicit retry starts a new attempt |
295
+ | Iterations exhausted | inspect the last response and preserved work; explicit retry starts a new bounded attempt |
296
+ | Execution completed, acceptance pending/failed | inspect Forge QA, verdict and verification records; completion alone does not establish acceptance |
297
+ | Dashboard stopped or access token no longer works | run `open` again for a new local server/token; execution continues independently |
298
+ | Missing or truncated live log data | inspect diagnostics; generate `report` for a complete capture of available artifacts |
299
+ | Dollar-cap request rejected | v1 cannot enforce cost caps; limits cover nodes, iterations, time and concurrency |
300
+
301
+ ## Verification
302
+
303
+ The default unittest suite is provider-free. Set `FORGE_TEST_FRACTAL_RUNTIME` to an
304
+ isolated environment containing the pinned runtime to enable real Fractal/tmux
305
+ integration tests with fake CLIs. See [test instructions](../tests/README.md) and
306
+ [implementation verification evidence](../tests/fractal-verification.md).
307
+ Paid provider smoke tests and performance comparisons require separate explicit runs.