forgeos 0.1.0-alpha.67 → 0.1.0-alpha.68

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.
@@ -0,0 +1,137 @@
1
+ ---
2
+ name: forge-agent-fabric
3
+ description: Conduct or resume a Forge Agent Fabric coding task with persistent workflow steps, independent Codex review, and source-bound evidence when the user requests this workflow.
4
+ ---
5
+
6
+ # Forge Agent Fabric
7
+
8
+ Keep the user's conversation in Codex. Prepare protocol requests yourself; the user should
9
+ not need to write JSON or operate a second interface. Respect the user's task scope and
10
+ existing authorization. This skill does not authorize publication, deployments or external
11
+ messages. Use subagents for implementation/review when authorized by the user or project.
12
+
13
+ ## Locate and connect
14
+
15
+ Resolve the current project's Git root and read its AGENTS.md. Execute with that root
16
+ as cwd, even when the runtime is installed elsewhere. Windows and WSL copies are distinct
17
+ projects. This workflow does not require a Forge application or project dependency.
18
+
19
+ Use the absolute path to this skill's `scripts/fabric.mjs` helper:
20
+ `node <skill-directory>/scripts/fabric.mjs --project <target-git-root> <operation> --json`.
21
+ It reads installer-generated runtime.json or FORGE_FABRIC_CLI and falls back to an installed
22
+ Forge runtime on PATH. Never switch to the runtime's checkout to conduct work.
23
+
24
+ Run `doctor --json` and `ensure-owner --json` through that helper. Register projects with
25
+ `project-register --project-id <stable-id> --json`; inspect registrations with `project-list --json`.
26
+ Registration is needed for multiproject MCP routing, not for ordinary cwd-bound CLI work.
27
+ Optional project preparation, verification and limits live in `.forge/fabric.json`;
28
+ inspect doctor and respect the current project's profile rather than inventing config fields.
29
+
30
+ Forward `capabilities --json` through the helper to distinguish accompanied tasks,
31
+ managed SDK runs and the legacy Ollama pilot. When the user asks Fabric to execute a
32
+ workflow or run Codex workers, select managed execution below. Choose accompanied mode
33
+ when the task is to record work performed by the native session. Both modes need one
34
+ owner; `ensure-owner` reuses or starts it without dispatching workers.
35
+ Do not open the legacy PGlite database independently or kill an unrelated owner.
36
+
37
+ Native MCP tools are `fabric_attached_*`, `fabric_workflow_*` and `fabric_run_*`. If unavailable, the CLI
38
+ offers the same operations. State which transport you actually demonstrated.
39
+ Do not register MCP or change global configuration as a side effect of using this skill.
40
+
41
+ Read [managed request fields and examples](references/managed-workflows.md) before
42
+ preparing run-start. The references travel with this skill and require no Forge checkout.
43
+ For MCP, inspect tool schemas and select the registered target project explicitly through
44
+ projectId when supported. A fixed-root MCP server is usable only when its root matches
45
+ the target. Never assume a global MCP configuration follows the chat cwd.
46
+
47
+ ## Accompanied work
48
+
49
+ 1. Create an `attached-propose` with explicit acceptance criteria, relevant file scope and
50
+ checks. Mutations use a complete `--file` JSON request; reads use `--task-id`.
51
+ 2. Attach the actual session/agent identity, register an implementation assignment and
52
+ start its attempt. Use actual IDs from the host, not invented claims of verified identity.
53
+ 3. For a composed task, record `workflow-plan` and use `workflow-next` packets. Claim a
54
+ step before executing it, then report output digest and evidence. Before checking or
55
+ reviewing source, capture the current snapshot digest from `attached-status`. Successful
56
+ `workflow-result` and `workflow-reconcile` requests must include that actual observed
57
+ digest in the top-level `observedSnapshotDigest` field. Do not fetch a newer digest merely
58
+ to stamp an older result; if source changed, reconcile obsolete work as failed and
59
+ replan or execute a fresh attempt. The scheduler records
60
+ work; it does not invoke the host's subagent tools for you.
61
+ 4. Complete implementation and prepare a review with a distinct reviewer attempt.
62
+ Give that Codex subagent requirements, code and the returned exact snapshot/token.
63
+ Submit its report only for that version. Correct findings and obtain a new review
64
+ when files change. Do not mark findings resolved without corrective evidence.
65
+ 5. Run the checks relevant to the change and record their outcomes for the current
66
+ snapshot. Record criterion coverage with concrete artifacts or observed checks.
67
+ 6. Read `attached-status`. Address the structured unmet reasons before presenting the
68
+ task as ready. Agent-reported records retain that provenance; they are not authenticated
69
+ service executions, human acceptance or proof of production deployment.
70
+
71
+ Reuse a requestId only for the exact same request, including expectedVersion. On a version
72
+ conflict read current state and reconcile; use a new requestId for a new operation. Mutation
73
+ responses are compact acknowledgements; status/context reads return current full state.
74
+
75
+ ## Resume and adapt
76
+
77
+ Start with `attached-context` for the known taskId. Do not restart completed work from the
78
+ conversation summary alone. After a host crash use `workflow-recover` for known interrupted
79
+ attempts and reconcile their observed outcomes before dispatching them again. A missing
80
+ result is uncertainty, not success or permission to repeat an effect.
81
+
82
+ Use `workflow-replan` with the expected revision, reason and evidenceRefs. Preserve
83
+ required obligations. Source changes make recorded results stale; the service blocks
84
+ their reuse and replan invalidates affected steps and their dependents. The current
85
+ release binds results conservatively to the task's whole file scope; choose a relevant
86
+ scope and do not promise fine-grained invalidation by individual inputRefs.
87
+
88
+ Keep hooks observational. Missing hook events do not prevent explicit session/tentative
89
+ registration, but do prevent claiming that native hook integration has been demonstrated.
90
+ The accompanied mode recovers work when Codex returns. Managed SDK runs now have a
91
+ separate executor, but still require a live owner; neither mode installs automatic wakeup
92
+ or guarantees execution after the App closes.
93
+
94
+ ## Managed execution
95
+
96
+ Choose managed execution when the authorized task calls for owner-dispatched SDK or
97
+ command workers. Keep the native chat as the interface and prepare requests yourself.
98
+ Starting Codex workers can consume configured credits; local publication can change
99
+ files. Use the user's existing scope and authorization, including any cost constraints.
100
+ Do not treat the legacy proposal-only MCP contract as a limit on fabric_run_start.
101
+
102
+ 1. Read capabilities and the managed request example in the bundled reference. Prepare
103
+ run-start with requestId, goal, scope, workflow and one executor per node. Codex roles
104
+ are implementer/reviewer/investigator/decision; commands use explicit argv. Choose
105
+ relevant limits, deadlines and scope. inputDigest identifies the declared node contract;
106
+ the owner separately captures actual source inputs. Clones do not copy root node_modules;
107
+ automatic environment preparation installs locked dependencies or copies verified cache
108
+ into the clone, with scripts ignored by default. Optional environment accepts mode
109
+ auto/none, ignoreScripts, HTTPS registry without credentials/query/fragment, and timeoutMs
110
+ 100..1800000. Use none for dependency-free steps. Do not assume ignored scripts executed.
111
+ 2. Start via `fabric run-start --file run.json --json` or fabric_run_start with
112
+ `{request: BODY}`. Read `run-status --run-id ID`; use run-wait with
113
+ `{runId,cursor,waitMs}` for bounded events, up to 30000 ms. MCP status uses `{runId}`.
114
+ Start and mutations return compact acks; status provides full public state and artifacts.
115
+ 3. For publication, use an implementer activity, a required distinct Codex reviewer
116
+ downstream of every writer, and a required command verification downstream of every
117
+ writer. Reviewer approval, command success and workflow completion are required.
118
+ publish false keeps isolated artifacts; publication applies local scoped files and
119
+ does not authorize commit, push or deployment. Do not claim that a model's report is
120
+ executor evidence: state is executor_observed, reports remain agent_reported, and
121
+ outputContract.requiredEvidenceKinds accepts only `executor-observed`.
122
+ 4. Steer queues instruction and pauses new dispatch; it does not message the active worker.
123
+ Pause allows active workers to finish. All controls use runId/requestId/expectedVersion.
124
+ Resume optionally adds expectedRevision/nodes/executors/reason/evidenceRefs for replan.
125
+ Read status after version conflicts and issue a new requestId for a changed body.
126
+ 5. After cancellation or owner restart, inspect the saved thread, workspace and effects.
127
+ Unknown attempts require run-reconcile with attemptId, resolution failed and reason;
128
+ never manufacture success or retry uncertain effects silently. A new isolated attempt
129
+ may use the saved SDK thread. Publication confirmation uses publication confirm only
130
+ when the owner can observe matching expected files. Resolve uncertainty before resume.
131
+ Publication retry is allowed only after observing the complete original baseline; it
132
+ clears the intent and pauses. Resume explicitly; preserve partial divergent writes.
133
+
134
+ Distinguish implementation, command-fixture tests and actual SDK execution in the delivery
135
+ report. Do not extend a past pilot's acceptance to a new environment or task without
136
+ observed evidence. SDK workers are separate runs, not new chats in the sidebar. Keep the owner session
137
+ visible in task context; do not promise App-closed execution or create a scheduler implicitly.
@@ -0,0 +1,95 @@
1
+ # Managed Codex workflows
2
+
3
+ Commands below are Fabric operation arguments forwarded through `scripts/fabric.mjs`.
4
+ Use the current target Git root, not the directory containing the runtime. The owner
5
+ captures source from that root and creates isolated Git clones. No root node_modules
6
+ directory is shared with clones. A runtime installation is reusable across repositories.
7
+
8
+ ## Request shape
9
+
10
+ Prepare `run-start --file <absolute-request.json> --json`; the request file must be inside
11
+ the target Git root. Mutations use a complete JSON
12
+ body; reads use `run-status --run-id ID --json`. The following command-only example
13
+ needs an existing tracked `source.txt` and a working absolute Node executable. Generate
14
+ a fresh requestId for each independent run. Replace example paths with observed paths.
15
+
16
+ ```json
17
+ {
18
+ "requestId": "command-smoke-1",
19
+ "goal": "Observe a command in an isolated clone",
20
+ "scope": ["source.txt"],
21
+ "publish": false,
22
+ "environment": {"mode": "none"},
23
+ "workflow": {"workflowId": "command-smoke", "nodes": [{
24
+ "nodeId": "verify", "kind": "verification", "dependsOn": [],
25
+ "inputDigest": "sha256:2689367b205c16ce32ed4200942b8b8b1e262dfc70d9bc9fbc77c49699a4f1df",
26
+ "required": true,
27
+ "outputContract": {"requiredEvidenceKinds": ["executor-observed"]}
28
+ }]},
29
+ "executors": [{"nodeId": "verify", "type": "command",
30
+ "argv": ["/absolute/path/to/node", "-e", "process.stdout.write('ok')"],
31
+ "timeoutMs": 10000}]
32
+ }
33
+ ```
34
+
35
+ inputDigest describes the node contract, not the observed source. Calculate SHA-256
36
+ for each actual declared contract. The example digest is SHA-256 of `ok` for this smoke.
37
+ The owner separately captures source inputs. Evidence kind `executor-observed` means
38
+ execution was observed; a model report's content remains `agent_reported`.
39
+
40
+ For code use `implement -> review -> verify` with one executor per node:
41
+
42
+ - implement: `kind: activity`, executor `{nodeId,type:"codex",role:"implementer",prompt,writeScope:[...]}`.
43
+ - review: required activity, Codex `role:"reviewer"`, depending on every writer, prompt requesting independent review and explicit approval/findings.
44
+ - verify: required verification, `type:"command"`, explicit `argv`, depending on every writer; use actual project tests/build checks.
45
+
46
+ Scopes and writeScope are repository-relative. Ensure writeScope stays inside the run
47
+ scope. Set timeoutMs and limits appropriate to the task. Use capabilities/doctor to check
48
+ current constraints. Maximum supported concurrency is four; prefer a small useful fanout.
49
+ Do not prescribe a test command without reading the project's scripts or AGENTS.md.
50
+
51
+ Optional top-level run environment: mode `auto` (default) or `none`, ignoreScripts (default
52
+ true), HTTPS registry without credentials/query/fragment, timeoutMs 100..1800000.
53
+ Auto prepares locked dependencies or copies verified cache content into the clone.
54
+ Ignored scripts have not executed; enable necessary preparation only within authorization.
55
+ An optional `.forge/fabric.json` profile supplies maxConcurrency and environment defaults
56
+ for run-start; explicit request fields win. verificationCommands are suggested argv arrays
57
+ for the agent to select, never commands executed by doctor. Supported profile shape:
58
+ `{schemaVersion:1,maxConcurrency:2,environment:{mode:"auto",ignoreScripts:true},verificationCommands:[["node","--test"]]}`.
59
+
60
+ Publication is local file application, not npm publication. `publish:false` keeps clones
61
+ and artifacts. `publish:true` (the default) requires approval from a distinct required
62
+ Codex reviewer and successful required command verification downstream of all writers.
63
+ Do not claim a model report proves a successful command, production deployment or human
64
+ acceptance. Run with explicit publication intent matching the user's request.
65
+
66
+ ## Controls and recovery
67
+
68
+ | Operation | Body |
69
+ | --- | --- |
70
+ | run-wait | `{runId,cursor?,waitMs}`; waitMs 0..30000 |
71
+ | run-pause/run-resume/run-cancel | `{runId,requestId,expectedVersion}` |
72
+ | run-steer | CAS fields plus `instruction`; pauses new dispatch |
73
+ | run-reconcile | CAS fields plus `{attemptId,resolution:"failed",reason}` for uncertain attempts |
74
+
75
+ Mutation acknowledgements are compact. Read run-status for full public state, source
76
+ versions, attempts, artifacts and unmet requirements. Reuse requestId only for an exact
77
+ body replay. After a version conflict read status and create a new requestId for a changed
78
+ operation. Pause allows active workers to finish; steer does not inject messages into the
79
+ active worker. Cancel requests interruption without rolling back external effects.
80
+
81
+ Resume can replan with expectedRevision, nodes, executors, reason and evidenceRefs.
82
+ Preserve required obligations, evidence requirements and limits. Source changes invalidate
83
+ applicable results. Failed or uncertain attempts must not be represented as success.
84
+
85
+ After an owner restart or interruption inspect saved workspace, SDK thread ID and effects.
86
+ Unknown results require reconciliation before retry. New isolated attempts may reuse a
87
+ saved SDK thread. Publication confirmation `{publication:"confirm"}` requires the owner
88
+ to observe matching expected files. Retry `{publication:"retry"}` requires the complete
89
+ original baseline, pauses the run, and needs explicit resume. Preserve divergent partial
90
+ writes instead of overwriting them.
91
+
92
+ MCP run mutations receive `{request: BODY}` plus projectId when routing is enabled;
93
+ status receives `{runId}` plus projectId. Always inspect the available tool schema.
94
+ CLI and MCP must target the same registered root. A configured MCP server being present
95
+ does not prove its tool catalog is loaded or its owner is alive.
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync, realpathSync, existsSync } from 'node:fs';
3
+ import { dirname, resolve, isAbsolute } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { spawnSync } from 'node:child_process';
6
+
7
+ // Runtime identity is independent of the target project: no cwd from runtime config.
8
+ const skillRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
9
+ try {
10
+ const args = process.argv.slice(2);
11
+ let project = process.cwd();
12
+ const index = args.indexOf('--project');
13
+ if (index >= 0) {
14
+ if (!args[index + 1]) throw new Error('--project requires a target directory');
15
+ project = args[index + 1];
16
+ args.splice(index, 2);
17
+ }
18
+ const git = spawnSync('git', ['-C', project, 'rev-parse', '--show-toplevel'], { encoding: 'utf8', windowsHide: true });
19
+ if (git.status !== 0) throw new Error(`Target must be a Git repository: ${project}`);
20
+ const cwd = realpathSync(git.stdout.trim());
21
+ let runtime = {};
22
+ const config = resolve(skillRoot, 'runtime.json');
23
+ if (existsSync(config)) runtime = JSON.parse(readFileSync(config, 'utf8'));
24
+ let cliPath = process.env.FORGE_FABRIC_CLI || runtime.cliPath;
25
+ if (!cliPath) {
26
+ const lookup = spawnSync(process.platform === 'win32' ? 'where.exe' : 'which', ['forge'], { encoding: 'utf8', windowsHide: true });
27
+ const candidates = lookup.stdout?.trim().split(/\r?\n/).filter(Boolean) || [];
28
+ for (const candidate of candidates) {
29
+ const bin = realpathSync(candidate);
30
+ const guesses = [bin, resolve(dirname(bin), 'node_modules/forgeos/bin/forge.mjs')];
31
+ cliPath = guesses.find((path) => path.endsWith('.mjs') && existsSync(path));
32
+ if (cliPath) break;
33
+ }
34
+ }
35
+ if (!cliPath || !isAbsolute(cliPath) || !existsSync(cliPath)) {
36
+ throw new Error('Forge runtime not found. Install this skill with --runtime <absolute forge.mjs>, or set FORGE_FABRIC_CLI to that absolute file.');
37
+ }
38
+ const result = spawnSync(runtime.nodeExecutable || process.execPath, [realpathSync(cliPath), 'fabric', ...args], {
39
+ cwd, stdio: 'inherit', windowsHide: true,
40
+ });
41
+ if (result.error) throw result.error;
42
+ process.exitCode = result.status ?? 1;
43
+ } catch (error) {
44
+ process.stderr.write(`${error.message}\n`);
45
+ process.exitCode = 1;
46
+ }
package/AGENTS.md CHANGED
@@ -1,4 +1,4 @@
1
- // @forge-generated generator=0.1.0-alpha.67 input=cad72fb61cedf1a3702763e37d3d5706a149a8719284ec9090a960aa3a4e1e61 content=721818a6f9a664aa898092d4aa5cd68cbbd8ad6e150c7d3ad3ef785a2e3fcf53
1
+ // @forge-generated generator=0.1.0-alpha.68 input=eb85ce79777e8854119a312edd29262099578bdd5f8be82c03b5f0caae80f391 content=721818a6f9a664aa898092d4aa5cd68cbbd8ad6e150c7d3ad3ef785a2e3fcf53
2
2
  # AGENTS.md
3
3
 
4
4
  <!-- forge-generated:start -->
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # forgeos
2
2
 
3
+ ## 0.1.0-alpha.68
4
+
5
+ ### Patch Changes
6
+
7
+ - [`3d41af7`](https://github.com/Stahldavid/forge/commit/3d41af7b4580cd86618a7c76a3ac33b41e495e43) Thanks [@Stahldavid](https://github.com/Stahldavid)! - Make Agent Fabric reusable across Git repositories from the original Codex chat. Distribute a portable personal skill and installer, discover and reuse per-project owners, route MCP calls by registered project identity, and apply optional project environment and concurrency defaults. Harden Windows lock reads and owner startup failures, and exercise isolated execution outside the Forge checkout.
8
+
3
9
  ## 0.1.0-alpha.67
4
10
 
5
11
  ### Patch Changes
@@ -11,7 +11,15 @@ Codex executes the steps with its native tools; the scheduler does not start mod
11
11
  continue execution when the host is closed. The
12
12
  [detailed implementation and operation plan](./architecture/agent-fabric/CODEX_DYNAMIC_WORKFLOWS.md)
13
13
  documents both contracts, evidence provenance and the remaining acceptance work.
14
- The project skill is `.agents/skills/forge-agent-fabric/SKILL.md`.
14
+ The portable skill is `.agents/skills/forge-agent-fabric/SKILL.md`. Install it once
15
+ with `forge fabric install-skill --json` (or `node bin/forge.mjs fabric install-skill --json`
16
+ in the framework checkout). It then operates in other Git repositories through a shared
17
+ runtime, with one owner per repository and no Forge application dependency.
18
+ Use `fabric doctor`, `fabric ensure-owner`, and optionally `fabric project-register`
19
+ for explicit MCP routing by projectId. Hooks are optional. A project may declare
20
+ environment/concurrency defaults and suggested checks in `.forge/fabric.json`.
21
+ The [portable project plan](./architecture/agent-fabric/PORTABLE_PROJECTS_PLAN.md)
22
+ describes isolation, installation, recovery and validation.
15
23
 
16
24
  ```bash
17
25
  node bin/forge.mjs fabric capabilities --json
@@ -0,0 +1,136 @@
1
+ # Agent Fabric across repositories
2
+
3
+ ## Outcome and boundaries
4
+
5
+ The existing Codex App conversation remains the interface. One personal skill teaches
6
+ Codex to prepare, execute, observe and resume Fabric workflows in the current project.
7
+ The Forge runtime is shared; each Git repository has its own owner, state and isolated
8
+ worker clones. Projects do not need a Forge application manifest or a Forge dependency.
9
+ Windows and WSL copies are separate projects; this integration never migrates or syncs them.
10
+ Owner startup does not start a model. Managed Codex workers use the host's configured
11
+ Codex authentication and can consume its allowance. Local publication applies validated
12
+ files; commit, push, npm release and deployments remain separately scoped actions.
13
+
14
+ ## 1. Portable skill and distribution
15
+
16
+ Maintain the skill at `.agents/skills/forge-agent-fabric`, include it and its installer
17
+ in the npm package, and make its protocol reference self-contained. Install once with
18
+ `forge fabric install-skill --json` from any directory; add `--dry-run` to preview.
19
+ The underlying `node scripts/install-agent-fabric-skill.mjs` also supports custom
20
+ destination/runtime and explicit replacement; default destination is
21
+ `~/.agents/skills/forge-agent-fabric`. Installed `runtime.json` stores the absolute
22
+ Node executable and Forge CLI path. The helper resolves the target Git root and invokes
23
+ the runtime with that root as cwd, without shell interpolation. An environment override
24
+ and installed CLI fallback support different hosts. Runtime updates require reinstalling
25
+ the skill to update the selected path/version; no implicit remote downloads occur.
26
+
27
+ The installer stages changes, preserves unknown existing skills unless explicitly replaced,
28
+ backs up replacements outside skill discovery, and reports unchanged installations.
29
+ Installing a skill neither registers all local repositories nor installs hooks.
30
+
31
+ ## 2. Project identity and registration
32
+
33
+ `fabric project-register [--project-id <id>] --json` resolves the current directory to
34
+ the canonical Git toplevel and verifies HEAD. Default ids combine a readable directory
35
+ name with a root digest, so equal names in different directories do not collide.
36
+ `fabric project-list --json` reads the personal registry at
37
+ `~/.forge/agent-fabric/projects.json`. Registration uses a bounded exclusive lock and
38
+ atomic file replacement. Conflicting ids/roots and malformed or symlinked registry
39
+ files are rejected. A registered path is resolved again before dispatch; moved/replaced
40
+ roots cannot silently redirect an existing project id. Non-Git/empty repositories need
41
+ initialization and an initial commit before managed cloning can run.
42
+
43
+ The registry is host-local. No project credentials, owner bearer tokens or source contents
44
+ are stored there. Registration is explicit and does not discover every directory on disk.
45
+
46
+ ## 3. Owner lifecycle and diagnostics
47
+
48
+ `fabric doctor --json` resolves the Git root, reads optional settings, checks SDK availability,
49
+ attempts a bounded `codex login status`, and authenticates any existing owner. It neither
50
+ starts workers nor creates an owner. An unverified login is reported rather than inferred.
51
+ `fabric ensure-owner --json` reuses an authenticated owner or starts `fabric serve` hidden
52
+ and detached with cwd set to this root. Logs and endpoint metadata stay under
53
+ `.forge/local/agent-fabric/`. Startup uses a per-project exclusive lock and bounded wait.
54
+ Only its own newly spawned process may be stopped if startup times out; unknown live
55
+ processes are not killed. An unreachable live endpoint requires diagnosis instead of
56
+ starting another database owner. Startup locks surviving a crash are recovered only
57
+ after their recorded process demonstrably exits, with serialized recovery and a byte
58
+ readback. Live, malformed or unverified locks require inspection; they are never erased
59
+ solely because a timer elapsed.
60
+ If a process dies during recovery itself, its `.recovery` guard can require manual
61
+ inspection after confirming that guard's process exited; diagnostics name both files.
62
+
63
+ Authenticated health checks expose root and pid, never the endpoint token. Existing owners
64
+ from the previous release are recognized through a read-only managed status probe.
65
+ The owner remains an ordinary local process: restarting the machine requires starting it
66
+ again; no OS service or periodic wakeup is installed.
67
+
68
+ ## 4. Optional project profile
69
+
70
+ `.forge/fabric.json` is a small declarative file, not a Forge app configuration:
71
+
72
+ ```json
73
+ {
74
+ "schemaVersion": 1,
75
+ "maxConcurrency": 2,
76
+ "environment": { "mode": "auto", "ignoreScripts": true, "timeoutMs": 120000 },
77
+ "verificationCommands": [["node", "--test"]]
78
+ }
79
+ ```
80
+
81
+ The shared managed request transport merges environment/concurrency defaults into
82
+ `run-start`; explicit request values win. The profile does not change existing runs or
83
+ silently append verification nodes. The skill reads suggested argv arrays and selects
84
+ checks appropriate to the actual task. This avoids disguising executable project scripts
85
+ as configuration reads. Unknown fields, excessive files, symlinks and invalid values
86
+ are rejected. Node dependency preparation continues to use lockfiles and isolated copies;
87
+ other stacks need explicit workflow commands and available host tooling. No universal
88
+ Python/Go/Java provisioning is implied. Credentials and .env files are not copied merely
89
+ because a profile exists.
90
+
91
+ ## 5. One MCP, multiple projects
92
+
93
+ Keep the shared runtime's `mcp serve` entrypoint. Add `fabric_project_register`,
94
+ `fabric_project_list`, `fabric_project_doctor`, and `fabric_owner_start`. Fabric tools
95
+ accept an optional top-level `projectId`. The router resolves registered ids, removes
96
+ the routing field before backend validation, then forwards to that root's owner.
97
+ Explicitly routed responses include `projectContext: { id, root }` for readback.
98
+ Calls without projectId retain the existing default workspace for compatibility.
99
+ Hooks and non-Fabric agent-memory tools remain bound to the configured default workspace.
100
+ Run calls cannot supply an arbitrary root. The skill must use explicit projectId outside
101
+ the default workspace, or use CLI with the current Git root as cwd.
102
+
103
+ MCP configuration remains one shared runtime entry. Restart/reconnect the Codex tool
104
+ session to discover a changed tool catalog; use the skill's CLI helper immediately while
105
+ the current conversation still has its old catalog. Do not claim tools are loaded until
106
+ they appear. Do not change unrelated MCP entries or weaken authentication to add routing.
107
+
108
+ ## 6. Native chat flow
109
+
110
+ 1. User requests Agent Fabric work in a project; Codex reads its AGENTS.md and task scope.
111
+ 2. Skill helper resolves the root and runs capabilities/doctor.
112
+ 3. Register only this project when MCP routing is needed, then ensure its owner.
113
+ 4. Build a managed DAG with explicit scopes, implementers, independent reviewer and checks.
114
+ 5. Dispatch through the CLI or loaded MCP tools, using bounded waits and durable cursors.
115
+ 6. Replan from observed results while preserving required review/verification obligations.
116
+ 7. Reconcile uncertain attempts after interruption; do not repeat effects blindly.
117
+ 8. Read final project/run identity and evidence, then report actual results in the same chat.
118
+
119
+ SDK worker threads are separate executions; they are not newly created Codex App sidebar
120
+ conversations. This workflow does not require the user to operate a separate dashboard.
121
+
122
+ ## 7. Validation and delivery
123
+
124
+ Validate registry contention, duplicate names/ids, nested cwd resolution, unknown/moved
125
+ roots, profile defaults and explicit overrides, owner authentication/start/reuse, MCP
126
+ routing into a second real Git repository, and hook isolation. Exercise the skill installer
127
+ against a temporary personal directory and its helper against the real runtime. Run an
128
+ observed command workflow in an external fixture without dispatching paid Codex models.
129
+ Run generation/check, targeted Fabric tests, typecheck/lint and the framework verifier.
130
+ Install the personal skill only after these checks; register Forge explicitly for current
131
+ MCP routing. Preserve existing auth, other skills, MCP configuration and unrelated files.
132
+
133
+ An external command pilot proves routing, cloning, execution and state readback. It does
134
+ not itself prove a new paid SDK implementation/review round, production deployment or
135
+ human acceptance. Package inclusion is checked separately from npm publication; this
136
+ implementation task does not require publishing a new release.
@@ -0,0 +1,153 @@
1
+ # Forge Agent Fabric — Architecture Governance
2
+
3
+ This directory is the governance record for the Forge Agent Fabric architecture baseline.
4
+ It is deliberately separate from `docs/agent-fabric.md`, which describes the executable
5
+ P0a implementation surface.
6
+
7
+ ## Governance package
8
+
9
+ | Record | Purpose |
10
+ | --- | --- |
11
+ | [`S1.0B1_DECISION_FREEZE.md`](./S1.0B1_DECISION_FREEZE.md) | Freezes the architecture decisions, vocabulary, invariants, boundaries, and deferred scope that later slices must preserve or explicitly supersede. |
12
+ | [`S1.0B2_EVIDENCE_FREEZE.md`](./S1.0B2_EVIDENCE_FREEZE.md) | Freezes the evidence proving the accepted P0a baseline and maps evidence to the frozen decisions/invariants. |
13
+ | [`P0A_ACCEPTANCE_RECORD.md`](./P0A_ACCEPTANCE_RECORD.md) | Records exactly what was accepted when P0a was merged, what was not accepted, and the applicability/supersession rules. |
14
+ | [`S1.1_SCOPE_AND_GATE.md`](./S1.1_SCOPE_AND_GATE.md), [`S1.1_CONFORMANCE_PLAN.md`](./S1.1_CONFORMANCE_PLAN.md) | Adopted planning inputs for the normative kernel; historical planning assessments remain intact. |
15
+ | [`S1.1_NORMATIVE_KERNEL.md`](./S1.1_NORMATIVE_KERNEL.md), [`S1.1_CONFORMANCE_MATRIX.md`](./S1.1_CONFORMANCE_MATRIX.md) | Adopted operation rules, invariant traceability, conformance obligations and clarification register. |
16
+ | [`S1.1_ADOPTION_RECORD.md`](./S1.1_ADOPTION_RECORD.md) | Records the exact reviewed head, evidence and merge that adopted S1.1; explains retained candidate wording in historical artifacts. |
17
+ | [`S1.2_SCOPE_AND_GATE.md`](./S1.2_SCOPE_AND_GATE.md), [`S1.2_DESIGN_PLAN.md`](./S1.2_DESIGN_PLAN.md) | Adopted scope and delivery plan for the reference implementation design. |
18
+ | [`S1.2_REFERENCE_IMPLEMENTATION_DESIGN.md`](./S1.2_REFERENCE_IMPLEMENTATION_DESIGN.md), [`S1.2_IMPLEMENTATION_TRACEABILITY.md`](./S1.2_IMPLEMENTATION_TRACEABILITY.md), [`S1.2_DESIGN_DECISIONS.md`](./S1.2_DESIGN_DECISIONS.md) | Adopted reference implementation design; 24 operation mappings, 35 invariant mappings, 16 event-family mappings and preserved S12-F01/F02 history. |
19
+ | [`S1.2_ADOPTION_RECORD.md`](./S1.2_ADOPTION_RECORD.md) | Records the exact reviewed head, checks, repair-aware evidence and merge that completed S12-D12 and adopted S1.2. |
20
+ | [`S1.3_SCOPE_AND_GATE.md`](./S1.3_SCOPE_AND_GATE.md), [`S1.3_CONFORMANCE_PLAN.md`](./S1.3_CONFORMANCE_PLAN.md) | Adopted S1.3 Proof & Conformance planning package; S13-P08 complete. It authorized only the limited S1.3-A evidence/reproduction stage, not new tooling or P0b. |
21
+ | [`S1.3_EVIDENCE_CATALOG.md`](./S1.3_EVIDENCE_CATALOG.md), [`S1.3_CONFORMANCE_MATRIX.md`](./S1.3_CONFORMANCE_MATRIX.md), [`S1.3_REPRODUCTION_PROTOCOL.md`](./S1.3_REPRODUCTION_PROTOCOL.md), [`S1.3_GAP_AND_TOOLING_REGISTER.md`](./S1.3_GAP_AND_TOOLING_REGISTER.md) | Adopted S1.3-A Evidence Registry & Reproduction Baseline: stable evidence/gap IDs, 24 OP / 35 I / 16 event cross-index, reproduction rules and tooling-need decisions; historical candidate wording is preserved inside the reviewed artifacts. |
22
+ | [`S1.3_A_ADOPTION_RECORD.md`](./S1.3_A_ADOPTION_RECORD.md) | Records the exact reviewed head, exact-SHA gates, preserved FAIL/INCONCLUSIVE observations and merge that completed S13-A12 and adopted S1.3-A. |
23
+ | [`S1.3_FINAL_CLOSURE_RECORD.md`](./S1.3_FINAL_CLOSURE_RECORD.md) | Adopted final S1.3 closure supplement. It binds post-S1.3-A evidence/repairs while preserving historical GAP-002/GAP-008 limitations and establishes the boundary to P0b. |
24
+ | [`P0B_SCOPE_AND_GATE.md`](./P0B_SCOPE_AND_GATE.md) | Adopted planning scope for the first bounded nondeterministic P0b vertical. Historical proposal wording in that record remains as authored. |
25
+ | [`P0B_A_MODEL_ADAPTER.md`](./P0B_A_MODEL_ADAPTER.md), [`P0B_A_ADOPTION_RECORD.md`](./P0B_A_ADOPTION_RECORD.md) | P0b-A implementation description and exact reviewed-head adoption evidence, including the authorized keyless local Ollama smoke. |
26
+ | [`CODING_AGENT_DELIVERY_PLAN.md`](./CODING_AGENT_DELIVERY_PLAN.md) | Proposed ordered local-first delivery plan for MCP clients and a keyless coding worker; it does not adopt a new runtime capability. |
27
+ | [`P0B_B_LOCAL_CODING_SCOPE.md`](./P0B_B_LOCAL_CODING_SCOPE.md) | Candidate scope and gates for a trusted-repository, single-owner MCP and local Ollama coding pilot; no runtime adoption claim. |
28
+
29
+ ## Baseline coordinates
30
+
31
+ - Repository: `Stahldavid/forge`
32
+ - Accepted implementation head: `bfd2639579e650d4ad38ec1a81dbd55a5d68865e`
33
+ - Merge commit on `main`: `8972496f09727456b8b9f3ceafc386beab5f39d0`
34
+ - PR: `#9 — feat: add Forge Agent Fabric P0a protocol kernel`
35
+ - PR merged: `2026-09-08T09:26:36Z`
36
+ - Pre-P0a base: `6f54ee728761bf91ff65465d798286d6f47fbe67`
37
+
38
+ The merge commit has the reviewed P0a head as its second parent. This means the accepted
39
+ implementation tree is traceable directly from `main` without relying on an external
40
+ branch remaining available.
41
+
42
+ ## Status model
43
+
44
+ | Record / stage | Adoption event | State |
45
+ | --- | --- | --- |
46
+ | P0a executable acceptance | [PR #9](https://github.com/Stahldavid/forge/pull/9), `8972496f09727456b8b9f3ceafc386beab5f39d0` | Accepted |
47
+ | S1.0B1/B2 and P0a acceptance record | [PR #11](https://github.com/Stahldavid/forge/pull/11), `7a99ec5ceb2bdd51c83790fd84b23e534be52806` | Adopted |
48
+ | S1.1 scope and conformance plan | [PR #12](https://github.com/Stahldavid/forge/pull/12), `3a0ce40ffe31555709d213bf06d674c62f28ad32` | Adopted planning input |
49
+ | S1.1 kernel and conformance matrix | [PR #13](https://github.com/Stahldavid/forge/pull/13), `4b796f49c480d782ec7e069f8eb5f7eae841876a` | Adopted; G-14 complete |
50
+ | S1.2 scope and gate | [PR #14](https://github.com/Stahldavid/forge/pull/14), `d1e6a1bb605527f242b7a6fb6fa05d6ff3561f92` | Adopted planning input; S12-P06 complete |
51
+ | S12-F01 compatible resource-rejection repair | [PR #15](https://github.com/Stahldavid/forge/pull/15), `d9275f4773c1082a993ffaf7b6a58d15eb139246` | Adopted separately; reviewed head `16157c8bd59feecef6aa31692ba90a0d94f84307` |
52
+ | S12-F02 compatible identifier-dictionary repair | [PR #17](https://github.com/Stahldavid/forge/pull/17), `2ca5ba7d261cf4001aa755581caa4b29de109b35` | FIXED_AND_ADOPTED separately; reviewed head `a832e29a3e8c757249eb8a59b7774d6521b4853e` |
53
+ | S1.2 complete reference design | [PR #16](https://github.com/Stahldavid/forge/pull/16), `d2f426b1577d457bc6609c4d8e88ef7a055a1a23` | `ADOPTED`; S12-D12 complete; reviewed head `a2ac1769ac74fe9f7a87558a27332aa7c2a95114` |
54
+ | S1.3 scope and conformance plan | [PR #18](https://github.com/Stahldavid/forge/pull/18), `801c2192e64652ade19a642b2f09f8660963c74f` | `ADOPTED`; S13-P08 complete; reviewed head `c694e9091bc1211b27d7e5e934ff4b9905e6ae89` |
55
+ | Delta semantic timeline test timeout/cleanup | [PR #20](https://github.com/Stahldavid/forge/pull/20), `92c470ae2319aed9bde734d4506767677abe5a3c` | Adopted separately; reviewed head `0c8fe25d65ff5619395f3cf1f24635ba99a8e34c`; test-only, no Agent Fabric semantic change |
56
+ | S1.3-A evidence/reproduction baseline | [PR #19](https://github.com/Stahldavid/forge/pull/19), `de9449648d821086db3d6f214c1a39cd4c659c7e` | `ADOPTED`; S13-A12 complete; reviewed head `b48a8fb4d77a1d8f5df7d9d523623a2037966da0` |
57
+ | S1.3 final closure | [PR #43](https://github.com/Stahldavid/forge/pull/43), `f29b717f496b7edcd74e3f230c962e568fd0e5d2` | `ADOPTED`; reviewed head `36a6c75dfcc2c59e33fb04a8dfb9ce95da10f2ed`; adopted tree `49677d9979c2652c96f1cc4e0f2f82a17cb10f8e` |
58
+ | P0b bounded model-adapter scope | [PR #46](https://github.com/Stahldavid/forge/pull/46), `490c2b54a2a354cb38b0f527c6a3f9372f703ff5` | Adopted planning input for P0b-A only |
59
+ | P0b-A bounded model adapter | [PR #52](https://github.com/Stahldavid/forge/pull/52), `de3e1d5c97448823792bac1fcb71ab16e877ebab` | Adopted experimental runtime slice; reviewed head `ec37aeaa1c293d63e98de0b523fc2815761bc3dd` |
60
+
61
+ The adopted S1.3 planning coordinate remains
62
+ `main@801c2192e64652ade19a642b2f09f8660963c74f`. The separately adopted PR #20 moved the
63
+ repository/reproduction baseline to `main@92c470ae2319aed9bde734d4506767677abe5a3c`; that
64
+ movement was assessed under S13-A01. S1.3-A was subsequently adopted by PR #19 at
65
+ `main@de9449648d821086db3d6f214c1a39cd4c659c7e`.
66
+
67
+ S1.3 is formally closed by PR #43 at
68
+ `main@f29b717f496b7edcd74e3f230c962e568fd0e5d2`. The closure preserves GAP-002 and GAP-008 as
69
+ historical/nonblocking limitations, closes GAP-001 and GAP-009 through separately adopted
70
+ evidence, and keeps GAP-003…007 within their previously adopted applicability boundaries.
71
+ Candidate/planning labels in exact historical source artifacts remain preserved as authored;
72
+ adoption merges and later supplements establish subsequent state.
73
+
74
+ The P0b Scope & Gate was adopted through PR #46 over the closed S1.3 baseline. It authorized
75
+ implementation work only for P0b-A. PR #52 separately adopted the bounded model-invocation
76
+ adapter after exact-head CI/security checks, a keyless live Ollama smoke, independent review
77
+ and an explicitly authorized merge. The adoption record retains those coordinates and limits.
78
+
79
+ After adoption, changes must not silently rewrite history. A material change to a frozen
80
+ architecture decision requires a new superseding decision record that identifies:
81
+
82
+ 1. the decision/invariant being superseded;
83
+ 2. the reason for the change;
84
+ 3. compatibility and migration impact;
85
+ 4. new evidence and conformance obligations;
86
+ 5. the exact commit at which the new decision becomes applicable.
87
+
88
+ Corrections that do not alter semantics (typos, links, formatting, evidence-location
89
+ updates) may amend these files directly, but must not change the meaning of frozen
90
+ invariants.
91
+
92
+ ## Precedence
93
+
94
+ For the accepted P0a baseline, use this order when sources appear to disagree:
95
+
96
+ 1. accepted executable behavior at `main@8972496f09727456b8b9f3ceafc386beab5f39d0`;
97
+ 2. machine-readable schema and hardened replay/validation behavior in that baseline;
98
+ 3. `P0A_ACCEPTANCE_RECORD.md`;
99
+ 4. `S1.0B1_DECISION_FREEZE.md`;
100
+ 5. `S1.0B2_EVIDENCE_FREEZE.md`;
101
+ 6. `docs/agent-fabric.md`;
102
+ 7. older design notes, handoffs, experiments, or conversation history.
103
+
104
+ This precedence rule prevents an older architecture note from overriding behavior that
105
+ was explicitly implemented, adversarially reviewed, and accepted.
106
+
107
+ S1.1 supplies the adopted operation-level specification of that same accepted behavior.
108
+ Its adoption does not reverse this precedence or authorize a discrepancy with the frozen
109
+ invariants. S1.2 supplies the adopted source/ownership/sequence mapping of that behavior;
110
+ it cannot override S1.1 or turn an implementation accident into a normative rule. A
111
+ conflict among source, freeze, kernel and adopted design requires explicit classification
112
+ under the existing change rule.
113
+
114
+ S1.3 evidence describes what was observed and how it can be reproduced. Evidence metadata,
115
+ a runner, a formal model or a signature cannot manufacture runtime authority or silently
116
+ change an `OP-*`/`I-*` obligation. The adopted S1.3-A baseline may classify gaps and
117
+ recommend a future decision, but it cannot itself implement a repair/tool or erase a
118
+ historical failed or inconclusive observation.
119
+
120
+ P0b planning inherits that precedence. A model/provider adapter may extend execution, but
121
+ cannot override the accepted deterministic authority/replay semantics merely because a live
122
+ provider behaves differently or exposes additional capabilities.
123
+
124
+ ## Scope boundary
125
+
126
+ The freeze does **not** declare the entire future Agent Fabric implemented or
127
+ production-ready. It distinguishes three categories:
128
+
129
+ - **ACCEPTED_P0A** — implemented, tested, independently reviewed, and merged;
130
+ - **FROZEN_DIRECTION** — architecture direction that later slices must respect but that
131
+ is not fully implemented by P0a;
132
+ - **DEFERRED** — intentionally outside the accepted baseline and requiring a future slice
133
+ and separate acceptance evidence.
134
+
135
+ S1.2 — Reference Implementation Design is adopted. S1.3 planning and S1.3-A are adopted, and
136
+ S1.3 is now formally closed through the final closure record.
137
+
138
+ The closed S1.3 evidence package organizes evidence with stable IDs, separates historical
139
+ acceptance from current reproduction/source mapping, preserves `PASS`/`FAIL`/`SKIPPED`/
140
+ `NOT_APPLICABLE`/`BLOCKED`/`INCONCLUSIVE`, cross-indexes all 24 OP rules, 35 invariants and
141
+ 16 persisted event families, defines exact-SHA reproduction discipline and retains historical
142
+ limitations without converting them into false green claims.
143
+
144
+ A generic conformance runner, formal model checking, proof/evidence signing, cross-language
145
+ or JCS conformance, machine-readable evidence automation, production retention, production
146
+ persistence/recovery, consequential effects and the broader future Agent Fabric remain
147
+ outside the accepted P0a/S1.3 baseline.
148
+
149
+ The adopted P0b-A slice is limited to one real provider-backed bounded external inference
150
+ behind the existing P0a permit/result boundary. It excludes tools/plugins/delegation,
151
+ consequential target mutation, production persistence/outbox, recovery epochs, adaptive
152
+ routing, persistent governed memory and plugin/evolution promotion. P0b-B and those broader
153
+ capabilities have no adoption claim in this record.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forgeos",
3
- "version": "0.1.0-alpha.67",
3
+ "version": "0.1.0-alpha.68",
4
4
  "description": "Agent-native application framework and compiler for building Forge apps without a mandatory dashboard.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -11,9 +11,12 @@
11
11
  "!adapters/**/*.jar",
12
12
  "bin/",
13
13
  "scripts/field-test-forgeos.mjs",
14
+ "scripts/install-agent-fabric-skill.mjs",
15
+ ".agents/skills/forge-agent-fabric/",
14
16
  "docs/cair-protocol.md",
15
17
  "docs/forge-protocol.md",
16
18
  "docs/agent-fabric.md",
19
+ "docs/architecture/agent-fabric/PORTABLE_PROJECTS_PLAN.md",
17
20
  "examples/go-billing/",
18
21
  "examples/java-billing/",
19
22
  "!examples/**/target/**",
@@ -68,6 +71,7 @@
68
71
  "release:publish-alpha": "node scripts/publish-trusted-alpha.mjs",
69
72
  "release:publish-local-alpha": "node scripts/publish-local-alpha.mjs",
70
73
  "field:test": "node scripts/field-test-forgeos.mjs",
74
+ "fabric:install-skill": "node scripts/install-agent-fabric-skill.mjs",
71
75
  "forge": "node ./bin/forge.mjs",
72
76
  "forge:node": "node ./bin/forge.mjs",
73
77
  "forge:bun": "node ./bin/forge-bun.mjs src/forge/cli/main.ts",