@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.
- package/CHANGELOG.md +181 -0
- package/LICENSE +21 -0
- package/README.md +1854 -2
- package/SKILL.md +122 -0
- package/VERSION +1 -0
- package/forge +74 -0
- package/package.json +26 -4
- package/references/dataset.md +329 -0
- package/references/decompose.md +667 -0
- package/references/fractal-dashboard.md +21 -0
- package/references/fractal.md +307 -0
- package/references/harnesses.md +353 -0
- package/references/jev.md +865 -0
- package/references/memory.md +228 -0
- package/references/planning.md +42 -0
- package/references/ripwire.md +47 -0
- package/references/runtime.md +64 -0
- package/references/solo.md +113 -0
- package/references/ui.md +112 -0
- package/registry.tsv +81 -0
- package/scripts/forge-artifact.sh +78 -0
- package/scripts/forge-contract.py +430 -0
- package/scripts/forge-dataset.py +6 -0
- package/scripts/forge-dispatch.sh +665 -0
- package/scripts/forge-fail-first.py +195 -0
- package/scripts/forge-fractal-dispatch.sh +4 -0
- package/scripts/forge-fractal-options.sh +54 -0
- package/scripts/forge-fractal.py +6 -0
- package/scripts/forge-guard.py +266 -0
- package/scripts/forge-install-fractal.sh +4 -0
- package/scripts/forge-install-ripwire.sh +52 -0
- package/scripts/forge-install.sh +135 -0
- package/scripts/forge-jev-options.sh +259 -0
- package/scripts/forge-jev.py +6 -0
- package/scripts/forge-lib-plans.sh +785 -0
- package/scripts/forge-lib-review.sh +494 -0
- package/scripts/forge-lib-task.sh +302 -0
- package/scripts/forge-lib-verify.sh +30 -0
- package/scripts/forge-memory.sh +575 -0
- package/scripts/forge-metrics.sh +39 -0
- package/scripts/forge-parallel-options.sh +76 -0
- package/scripts/forge-parallel.sh +1717 -0
- package/scripts/forge-plan-check.py +118 -0
- package/scripts/forge-prompt.py +45 -0
- package/scripts/forge-ripwire.py +136 -0
- package/scripts/forge-route.py +344 -0
- package/scripts/forge-runtime.py +533 -0
- package/scripts/forge-schedule.py +312 -0
- package/scripts/forge-shadow.py +305 -0
- package/scripts/forge-solo.sh +347 -0
- package/scripts/forge-ui-options.sh +42 -0
- package/scripts/forge-ui.py +435 -0
- package/scripts/forge-update.sh +71 -0
- package/scripts/forge-verify-coverage.py +956 -0
- package/scripts/forge-version.py +198 -0
- package/scripts/forge_dataset/__init__.py +439 -0
- package/scripts/forge_dataset/capture.py +330 -0
- package/scripts/forge_dataset/checks.py +109 -0
- package/scripts/forge_dataset/cli.py +233 -0
- package/scripts/forge_dataset/export.py +1009 -0
- package/scripts/forge_dataset/harvest.py +716 -0
- package/scripts/forge_dataset/importer.py +412 -0
- package/scripts/forge_dataset/outcomes.py +275 -0
- package/scripts/forge_dataset/routing.py +278 -0
- package/scripts/forge_fractal/__init__.py +83 -0
- package/scripts/forge_fractal/bridge.py +46 -0
- package/scripts/forge_fractal/cli.py +202 -0
- package/scripts/forge_fractal/dashboard.css +138 -0
- package/scripts/forge_fractal/dashboard.html +41 -0
- package/scripts/forge_fractal/dashboard.js +687 -0
- package/scripts/forge_fractal/decomposition.py +262 -0
- package/scripts/forge_fractal/execution.py +659 -0
- package/scripts/forge_fractal/inspection.py +261 -0
- package/scripts/forge_fractal/install.py +158 -0
- package/scripts/forge_fractal/invocation.py +94 -0
- package/scripts/forge_fractal/pipeline.py +124 -0
- package/scripts/forge_fractal/selection.py +179 -0
- package/scripts/forge_jev/__init__.py +376 -0
- package/scripts/forge_jev/backtest.py +322 -0
- package/scripts/forge_jev/cli.py +980 -0
- package/scripts/forge_jev/client.py +418 -0
- package/scripts/forge_jev/corpus.py +156 -0
- package/scripts/forge_jev/coupling.py +244 -0
- package/scripts/forge_jev/features.py +24 -0
- package/scripts/forge_jev/gates.py +100 -0
- package/scripts/forge_jev/memory.py +163 -0
- package/scripts/forge_jev/outcome.py +49 -0
- package/scripts/forge_jev/predict.py +204 -0
- package/scripts/forge_jev/questions.py +661 -0
- package/scripts/forge_jev/review.py +73 -0
- package/scripts/forge_jev/routing.py +271 -0
- package/scripts/forge_jev/subset.py +123 -0
- package/scripts/forge_jev/verify.py +453 -0
- package/scripts/forge_registry.py +140 -0
- package/ui/README.md +287 -0
- package/ui/THIRD_PARTY_NOTICES.md +69 -0
- package/ui/docs/api.md +888 -0
- package/ui/forge_ui/__init__.py +20 -0
- package/ui/forge_ui/__main__.py +135 -0
- package/ui/forge_ui/diffs.py +454 -0
- package/ui/forge_ui/executions.py +436 -0
- package/ui/forge_ui/export.py +204 -0
- package/ui/forge_ui/findings.py +132 -0
- package/ui/forge_ui/fractal.py +583 -0
- package/ui/forge_ui/models.py +216 -0
- package/ui/forge_ui/reader.py +1336 -0
- package/ui/forge_ui/server.py +303 -0
- package/ui/forge_ui/static/app.js +924 -0
- package/ui/forge_ui/static/cloud3d.js +646 -0
- package/ui/forge_ui/static/cloudmodel.js +375 -0
- package/ui/forge_ui/static/cloudui.js +394 -0
- package/ui/forge_ui/static/diffview.js +216 -0
- package/ui/forge_ui/static/favicon.svg +1 -0
- package/ui/forge_ui/static/files.js +776 -0
- package/ui/forge_ui/static/gantt.js +97 -0
- package/ui/forge_ui/static/graph.js +266 -0
- package/ui/forge_ui/static/index.html +55 -0
- package/ui/forge_ui/static/iso.js +765 -0
- package/ui/forge_ui/static/leaderboard.js +315 -0
- package/ui/forge_ui/static/map3d.js +45 -0
- package/ui/forge_ui/static/modelstats.js +249 -0
- package/ui/forge_ui/static/notify.js +179 -0
- package/ui/forge_ui/static/panel.js +526 -0
- package/ui/forge_ui/static/runmodel.js +651 -0
- package/ui/forge_ui/static/scene3d.js +996 -0
- package/ui/forge_ui/static/search.js +119 -0
- 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.
|