@really-knows-ai/foundry 3.5.8 → 3.5.9

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.
@@ -26,7 +26,7 @@ directory structure, generates stage agents, and installs the Foundry guide
26
26
  agent automatically.
27
27
 
28
28
  After restart, type **hello foundry**. The assistant will tell you whether a
29
- further restart is needed and when to switch to the Foundry agent.
29
+ further restart is needed and when to switch to the **Foundry** agent.
30
30
 
31
31
  Optionally, if you want the package available to your project's local node_modules (for editor tooling or scripts), run:
32
32
 
@@ -44,7 +44,7 @@ assistant will read the Foundry bootstrap context and respond with guidance:
44
44
  - If Foundry is already set up: it will tell you to switch to the Foundry agent
45
45
  directly.
46
46
 
47
- switch to the **Foundry** agent before authoring flows. The Foundry agent
47
+ Switch to the **Foundry** agent before authoring flows. The Foundry agent
48
48
  understands Foundry's authoring workflow and handles dependent setup such as
49
49
  artefact types, laws, validators, appraisers, cycles, and config branches.
50
50
 
@@ -59,6 +59,12 @@ Foundry's configuration is five things: artefact types, laws, appraisers, cycles
59
59
 
60
60
  ### Author through the Foundry agent
61
61
 
62
+ The Foundry agent walks through a four-phase wizard protocol — **Understand,
63
+ Plan, Confirm, Build** — asking one question at a time. Configuration files are
64
+ created only after you confirm the plan. This wizard eliminates hand-authoring
65
+ of normal setup by using the structured config creation tools on a `config/*`
66
+ branch.
67
+
62
68
  Ask the Foundry agent to author or modify any part of the configuration. For example:
63
69
 
64
70
  > Add a `haiku` artefact type with a `poetic-form` appraiser.
@@ -77,11 +83,27 @@ These are the five pieces of a Foundry configuration, in dependency order:
77
83
 
78
84
  1. **Artefact types** — define the output of each cycle. Each type has an `id`, `name`, prose description, `file-patterns` (forge's write scope), appraiser config, and optional type-specific `laws.md`. Produces `foundry/artefacts/<id>/definition.md`.
79
85
 
80
- 2. **Laws** — subjective pass/fail criteria evaluated by appraisers. Two scopes: global (`foundry/laws/*.md`, concatenated for every artefact) and type-specific (`foundry/artefacts/<type>/laws.md`). Each law is a `## heading` (its identifier, referenced as `law:<id>` in feedback) with a description, passing criteria, and failing criteria.
86
+ 2. **Laws** — rules or criteria evaluated by appraisers. Two scopes: global (`foundry/laws/*.md`, concatenated for every artefact) and type-specific (`foundry/artefacts/<type>/laws.md`). Each law is a `## heading` (its identifier, referenced as `law:<id>` in feedback) with a description, passing criteria, and failing criteria.
81
87
 
82
88
  3. **Appraisers** — independent evaluators with named personalities. Each may override the cycle-level appraise model via a `model` field. Artefact types pick which appraisers may evaluate them (`appraisers.allowed`).
83
89
 
84
- 4. **Cycles** — produce one artefact type and declare `output-type`, `inputs` (a contract over other types), `targets` (reachable downstream cycles), human-gate config, and optional per-stage model overrides. Example:
90
+ 4. **Cycles** — produce one artefact type from a definition with these fields:
91
+
92
+ | Field | Purpose |
93
+ |-------|---------|
94
+ | `id` | Unique identifier |
95
+ | `name` | Human-readable label |
96
+ | `output-type` | The artefact type this cycle produces |
97
+ | `inputs` | Contract over upstream types (e.g. `any-of`, `all-of`) |
98
+ | `targets` | Reachable downstream cycles for flow routing |
99
+ | `always-human-appraise` | Bypass LLM appraisers on every iteration |
100
+ | `deadlock-human-appraise` | Escalate to human appraiser at iteration limit |
101
+ | `max-iterations` | Maximum forge iterations before deadlock |
102
+ | `assay` | Optional extractor config for pre-forge measurement |
103
+ | `memory` | Optional entity read/write permissions |
104
+ | `models` | Per-stage model overrides (e.g. `appraise`, `forge`) |
105
+
106
+ Example:
85
107
 
86
108
  ```markdown
87
109
  ---
@@ -93,9 +115,9 @@ These are the five pieces of a Foundry configuration, in dependency order:
93
115
  artefacts:
94
116
  - petition
95
117
  targets: []
96
- human-appraise: false
97
- deadlock-appraise: true
98
- deadlock-iterations: 5
118
+ always-human-appraise: false
119
+ deadlock-human-appraise: true
120
+ max-iterations: 5
99
121
  models:
100
122
  appraise: openai/gpt-5
101
123
  ---
@@ -114,15 +136,15 @@ Users who prefer to write configuration files by hand open a config branch first
114
136
  To run a flow, ask the Foundry agent with your goal as the input (e.g. "Run the make-haiku flow to write a haiku about autumn rain"). The Foundry agent dispatches the `flow` skill, which:
115
137
 
116
138
  1. Checks prerequisites and picks a starting cycle — matching your prose to a cycle's output type. If the request is ambiguous, it prompts (defaulting to `starting-cycles`). If a cycle's input contract can't be satisfied from files on disk, it won't be chosen.
117
- 2. Creates a work branch and scaffolds `WORK.md` with the goal.
118
- 3. Hands off to `orchestrate`, which drives the cycle:
139
+ 2. Creates a work branch and scaffolds `WORK.md` with frontmatter (`flow`, `cycle`) and the `# Goal` section. No artefact table is stored in the workfile; artefacts are discovered from branch diffs.
140
+ 3. Hands off to `orchestrate`, which drives the cycle. Orchestrate setup fills the remaining frontmatter (`stages`, `max-iterations`, model overrides, `assay` config) from the cycle definition, then runs the loop:
119
141
  - **forge** writes the artefact.
120
- - **quench** runs CLI validators (if configured).
121
- - **appraise** dispatches parallel appraiser sub-agents and consolidates their `law:<id>` feedback.
122
- - **human-appraise** (if configured, or on deadlock) asks you for input.
142
+ - **quench** runs deterministic validation inside the orchestrator, executing any validators attached to laws.
143
+ - **appraise** fans out parallel appraiser sub-agents via `dispatch_multi` and internally consolidates their `law:<id>` feedback.
144
+ - **human-appraise** (if configured, or at the iteration limit) asks you for input.
123
145
  - If any unresolved feedback remains, another forge iteration begins.
124
146
  4. When the cycle completes, the flow skill checks the cycle's `targets`. If a target's input contract is satisfied, it asks whether to proceed.
125
- 5. When all desired cycles are done, the flow skill summarises the output and asks how to finish squash-merge, PR, or leave the branch.
147
+ 5. When all desired cycles are complete, the flow skill asks you to attest the work via `foundry_attest`, which verifies cycle completion, writes and commits `ATTEST.md`. After attestation succeeds, `foundry_git_finish` squash-merges to the base branch with a signed attestation block, preserves the work branch as an archive, and creates the final signed commit. See [`docs/tools.md`](./tools.md#foundry_attest) for the attestation contract.
126
148
 
127
149
  Every stage ends with a micro-commit. Violations of the write invariant (writing to disallowed files) hard-stop the cycle.
128
150
 
@@ -154,7 +176,7 @@ never committed by foundry. See the `dry-run` skill for the full loop.
154
176
 
155
177
  While a flow is running, the state of the world is in four places:
156
178
 
157
- - `WORK.md` — current cycle, goal, and artefact table.
179
+ - `WORK.md` — current cycle, goal, and frontmatter state. Artefacts are discovered from branch diffs against the current cycle output type; see `foundry_artefacts_list`.
158
180
  - `WORK.feedback.yaml` — feedback items and their lifecycle history.
159
181
  - `WORK.history.yaml` — append-only stage execution log.
160
182
  - `git log` — one commit per stage.
@@ -185,7 +207,7 @@ Use `foundry_stage_retry()` when the underlying problem is fixed and you want to
185
207
 
186
208
  ## Cleaning up
187
209
 
188
- When a flow completes, `foundry_git_finish` handles integration with audit guarantees. On `work/*` branches, it commits `WORK.*` cleanup, preserves the branch as `archive/work/<flow>-<desc>-<hash>` for immutable forensic history, squash-merges to the base branch, and creates a signed commit whose message embeds the canonical Foundry attestation block. See [`docs/tools.md`](./tools.md#foundry_git_finish) for the full contract.
210
+ When a flow completes, the flow skill asks you to attest the work via `foundry_attest`, which verifies cycle completion, writes `ATTEST.md` at `HEAD`, and commits it. After attestation succeeds, `foundry_git_finish` handles integration with audit guarantees: it commits `WORK.*` cleanup, preserves the branch as `archive/work/<flow>-<desc>-<hash>` for immutable forensic history, squash-merges to the base branch, and creates a signed commit whose message embeds the canonical Foundry attestation block. See [`docs/tools.md`](./tools.md#foundry_attest) and [`docs/tools.md`](./tools.md#foundry_git_finish) for the full contracts.
189
211
 
190
212
  ---
191
213
 
@@ -4,7 +4,7 @@ Contributor-facing notes. This file records the derived details from the
4
4
  Cozo docs / plugin surface that cost us time to establish. Add entries when a
5
5
  fix required non-trivial spelunking, so the next maintainer can reuse the result.
6
6
 
7
- ## Backend status (as of 3.0.0)
7
+ ## Backend status
8
8
 
9
9
  The memory subsystem persists to `cozo-node@0.7.6`, which wraps the Rust
10
10
  `cozodb` engine. Both are effectively unmaintained:
@@ -23,7 +23,7 @@ property-graph with HNSW, Cypher dialect), **SurrealDB embedded**,
23
23
  **DuckDB + vss + PGQ**, and **SQLite + `sqlite-vec`** with hand-rolled
24
24
  graph traversal. The migration is structured so the public memory tool
25
25
  surface (`foundry_memory_*`) and the on-disk durable artefacts
26
- (`foundry-memory/entities/*.md`, `foundry-memory/edges/*.md`,
26
+ (`foundry/memory/entities/*.md`, `foundry/memory/edges/*.md`,
27
27
  `foundry-memory/relations/*.ndjson`) remain stable; only the live
28
28
  in-process store changes.
29
29
 
@@ -126,7 +126,7 @@ Extractors are defined at `foundry/memory/extractors/<name>.md` with a `command`
126
126
 
127
127
  ## Memory layout: two trees
128
128
 
129
- Since Phase 2 (3.0.0), memory is split across two top-level trees:
129
+ Memory is split across two top-level trees:
130
130
 
131
131
  - `foundry/memory/` — *config*. Holds `config.md`, `schema.json`,
132
132
  `entities/<name>.md`, `edges/<name>.md`, `extractors/<name>.md`,
@@ -1,8 +1,8 @@
1
1
  # Foundry Public Tool Reference
2
2
 
3
- Generated from the v3.0.x public plugin API. The authoritative tool set is
3
+ Generated from the current public plugin API for Foundry 3.5.8. The authoritative tool set is
4
4
  enforced by `tests/plugin/tool-registration.test.js` — if that snapshot
5
- drifts, this doc must be updated. Total: **66 tools**.
5
+ drifts, this doc must be updated. Total: **65 tools**.
6
6
 
7
7
  All tools accept arguments as a JSON object and return JSON-stringified
8
8
  results. Errors are returned as a stringified `{error: "..."}` object (not
@@ -39,13 +39,15 @@ state machine, see [`docs/concepts.md`](./concepts.md) and
39
39
 
40
40
  | Namespace | Applies to | Notes |
41
41
  |-----------|------------|-------|
42
- | `config/<description>` | `foundry_config_create_*` (5), `foundry_memory_create_entity_type`, `foundry_memory_create_edge_type`, `foundry_memory_rename_*`, `foundry_memory_drop_*`, `foundry_memory_reset`, `foundry_memory_init`, `foundry_memory_change_embedding_model`, `foundry_extractor_create` | Config and schema mutation only. |
42
+ | `config/<description>` | `foundry_config_create_artefact_type`, `foundry_config_create_appraiser`, `foundry_config_create_flow`, `foundry_config_create_cycle`, `foundry_config_add_law`, `foundry_config_edit_law`, `foundry_memory_create_entity_type`, `foundry_memory_create_edge_type`, `foundry_memory_rename_*`, `foundry_memory_drop_*`, `foundry_memory_reset`, `foundry_memory_init`, `foundry_memory_change_embedding_model`, `foundry_extractor_create` | Config and schema mutation only. |
43
43
  | `work/<flow>-<desc>` or `dry-run/<x>/<y>` | `foundry_orchestrate`, `foundry_stage_begin`, `foundry_stage_end`, `foundry_stage_retry`, `foundry_workfile_*`, `foundry_artefacts_*`, `foundry_feedback_*`, `foundry_assay_run`, `foundry_validate_run`, `foundry_memory_put`, `foundry_memory_relate`, `foundry_memory_unrelate` | Flow-data mutation only. |
44
44
  | Any branch | `foundry_workfile_get`, `foundry_artefacts_list`, `foundry_feedback_list`, `foundry_history_list`, `foundry_config_*` read tools, `foundry_config_validate_*`, `foundry_appraisers_select`, `foundry_memory_get`, `foundry_memory_list`, `foundry_memory_neighbours`, `foundry_memory_query`, `foundry_memory_search`, `foundry_memory_dump`, `foundry_memory_validate`, `foundry_snapshot_*` | No branch guard and no failed-flow guard. |
45
45
  | Self-classifying | `foundry_git_branch`, `foundry_git_finish` | Each tool checks its own branch rules. Leaving the failed branch is the recovery path. |
46
46
 
47
47
  Off-namespace calls return a structured refusal envelope naming the required namespace and the current branch.
48
48
 
49
+ > **Memory admin callability:** Schema-mutation and destructive memory admin tools (`foundry_memory_init`, `foundry_memory_create_entity_type`, `foundry_memory_create_edge_type`, `foundry_memory_rename_entity_type`, `foundry_memory_rename_edge_type`, `foundry_memory_drop_entity_type`, `foundry_memory_drop_edge_type`, `foundry_memory_reset`, `foundry_memory_change_embedding_model`) require `config/*` branches and non-failed flow. Read-only diagnostics (`foundry_memory_get`, `foundry_memory_list`, `foundry_memory_neighbours`, `foundry_memory_query`, `foundry_memory_search`, `foundry_memory_dump`, `foundry_memory_validate`) are broadly callable. `foundry_memory_vacuum` uses only the failed-flow guard and is not config-branch guarded.
50
+
49
51
  ## Tool index
50
52
 
51
53
  **Lifecycle**
@@ -238,12 +240,17 @@ frontmatter.
238
240
  **Args:**
239
241
  - `lastResult` (object, optional): `{ ok: boolean, error?: string }` — output of the
240
242
  prior action.
243
+ - `lastResults` (array, optional): Output of prior `dispatch_multi` actions.
241
244
  - `cycleDef` (string, optional): Test-mode override path to a cycle file.
245
+ - `baseBranch` (string, optional, default `main`): Base branch for diff and merge.
246
+ - `defaultModel` (string, optional): Model override for all dispatch prompts.
242
247
 
243
248
  **Returns:** one of:
244
249
  - `{ action: "dispatch", stage, cycle, prompt, token, ... }` — caller
245
250
  should dispatch a subagent. The `prompt` field is augmented with cycle
246
251
  memory context (entity types, edge types, extractor briefs) when configured.
252
+ - `{ action: "dispatch_multi", tasks: [...], ... }` — caller should
253
+ dispatch multiple subagents in parallel (used for parallel appraiser dispatch).
247
254
  - `{ action: "human_appraise", ... }` — surface to the user.
248
255
  - `{ action: "done", ... }` — cycle complete.
249
256
  - `{ action: "blocked", ... }` — cycle stalled.
@@ -261,6 +268,8 @@ failed flow.
261
268
  **Side effects:** mints/persists dispatch tokens (in-memory pending
262
269
  store); commits via `commitWithPolicy` when finalising stages (refuses
263
270
  on unexpected files); appends WORK.md artefact rows when finalising.
271
+ Runs quench synchronously when laws contain validators; runs appraise
272
+ via `gatherAppraiseContext` + `consolidateAppraise`.
264
273
 
265
274
  ### `foundry_workfile_create`
266
275
 
@@ -325,7 +334,7 @@ flow** (escape hatch).
325
334
 
326
335
  ### `foundry_artefacts_list`
327
336
 
328
- > List artefact changes on the current work branch for the current cycle.
337
+ > List artefact changes on the current work branch for the current cycle. Artefacts are discovered from branch diff status (git diff against base branch), filtered by the current cycle's output-type file patterns.
329
338
 
330
339
  **Args:**
331
340
  - none.
@@ -359,7 +368,7 @@ existing equivalent item was returned). `{ error: ... }` otherwise.
359
368
  **Stage requirements:** requires active stage. Tag is gated by stage
360
369
  base:
361
370
  - `forge` → forbidden (forge stages do not add feedback).
362
- - `quench` → tag must be exactly `validation`.
371
+ - `quench` → tag must start with `law:`.
363
372
  - `appraise` → tag must start with `law:`.
364
373
  - `human-appraise` → tag must be exactly `human`.
365
374
  - `assay` → forbidden. Extractor failures mark the workfile failed and end
@@ -542,7 +551,8 @@ that id is registered.
542
551
  `file-patterns`.
543
552
 
544
553
  **Stage requirements:** none (callable outside any stage; intended to be
545
- invoked by quench, but not enforced). Refused on a failed flow.
554
+ invoked by quench, but not enforced). Requires a `work/*` or `dry-run/*`
555
+ branch (flow-data mutation namespace). Refused on a failed flow.
546
556
 
547
557
  **Side effects:** spawns subprocesses via `execSync` in the worktree —
548
558
  external commands may have arbitrary side effects, which is why the tool
@@ -654,11 +664,13 @@ can branch away to recover.
654
664
  | current branch | mode | what happens |
655
665
  | -------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
656
666
  | `work/<x>` | work | commits `WORK.*` cleanup on the work branch, preserves the branch as `archive/work/<x>-<hash>`, squash-merges to `baseBranch`, creates a signed commit whose message embeds the canonical Foundry attestation block. |
657
- | `config/<x>` | config | squash-merges to `baseBranch`, force-deletes the config branch. No WORK cleanup. |
667
+ | `config/<x>` | config | squash-merges to `baseBranch`, force-deletes the config branch. No WORK cleanup. |
658
668
  | `dry-run/<x>/<y>` | dry-run | writes `.snapshots/<run-id>/{README.md, work/WORK*, diff.patch, trace.jsonl}` on the parent `config/<x>` working tree; force-deletes the dry-run branch. No merge, no commit. |
659
669
  | base branch (`main` by default) | noop | `{ ok: true, noop: true, ... }`. |
660
670
  | anything else | refused | `{ ok: false, error: "... nothing to finish ..." }`. |
661
671
 
672
+ **Work-branch precondition (work mode):** `ATTEST.md` must exist at HEAD, created by a prior `foundry_attest({ confirm: true })` call. Without it, the work mode refuses.
673
+
662
674
  **Returns:**
663
675
  - Plan (when `confirm` is not true):
664
676
  - Work mode: `{ ok: false, error: "... requires {confirm: true}...",
@@ -789,8 +801,7 @@ schema checks without writing. Laws use a different shape: `add_law`
789
801
  creates a new entry, `edit_law` updates an existing one, and
790
802
  `foundry_config_validate_law` covers schema validation for either.
791
803
 
792
- Common args across the `_create_*` tools: `name` (string), `body`
793
- (string, markdown). Common returns across the whole family:
804
+ Common returns across the whole family:
794
805
  `{ ok: true, path, sha }` on success; `{ ok: false, errors: [...] }`
795
806
  on validation failure; `{ error, affected_files: [...] }` on
796
807
  commit-policy refusal (the worktree was dirty with files outside
@@ -805,9 +816,11 @@ to update an existing law in place.
805
816
  > `foundry/artefacts/<typeId>/`.
806
817
 
807
818
  **Args:**
808
- - `name` (string, required): typeId (kebab-case slug).
809
- - `body` (string, required): markdown body with frontmatter
810
- (`file-patterns`, optional `description`, etc.).
819
+ - `id` (string, required): Artefact type id (kebab-case slug).
820
+ - `name` (string, required): Human-readable name.
821
+ - `filePatterns` (string[], required): Glob patterns for matching artefacts.
822
+ - `description` (string, required): Prose description of the artefact type.
823
+ - `appraisers` (object, optional): `{ allowed: string[], count: number }` — appraiser pool and selection count.
811
824
 
812
825
  **Returns:** `{ ok: true, path, sha }` on success;
813
826
  `{ ok: false, errors: [...] }` on schema failure;
@@ -832,49 +845,53 @@ current `config/*` branch.
832
845
 
833
846
  ### `foundry_config_add_law`
834
847
 
835
- > Add a new law markdown entry. Locator depends on `target.kind`.
848
+ > Add a new law entry.
836
849
 
837
850
  **Args:**
838
- - `name` (string, required): law id (kebab-case slug). Used in the
839
- commit message.
840
- - `body` (string, required): markdown body for the law, starting with
841
- a `## <law-id>` heading.
842
- - `target` (object, required):
843
- - `{ kind: "global", file: "<name>.md" }` — appends or writes
844
- `foundry/laws/<file>`.
845
- - `{ kind: "type-specific", typeId: "<id>" }` — appends or writes
846
- `foundry/artefacts/<typeId>/laws.md`.
847
-
848
- **Returns / Stage requirements / Side effects:** as for
849
- `foundry_config_create_artefact_type`.
850
-
851
- **Failure modes:** as for `foundry_config_create_artefact_type`, plus
852
- `target` shape errors:
853
- - Missing or non-object `target` → `{ ok: false, errors: ["target
854
- argument is required (object with kind + locator)"] }`.
855
- - Unknown `target.kind``{ ok: false, errors: ["unknown
856
- target.kind: <kind>"] }`.
857
- - Missing `target.file` for `global` / missing `target.typeId` for
858
- `type-specific` `{ ok: false, errors: [...] }`.
859
- - Target file already exists
860
- `{ ok: false, errors: ["… already exists; use foundry_config_edit_law
861
- to update an existing law in place"] }`.
851
+ - `id` (string, required): Law id (kebab-case slug).
852
+ - `name` (string, required): Human-readable name.
853
+ - `description` (string, required): Prose description of the law.
854
+ - `passing` (string, required): Feedback text when the law passes.
855
+ - `failing` (string, required): Feedback text when the law fails.
856
+ - `target` (object, required): `{ kind: "global"|"type-specific", file?: string, typeId?: string }` — locator for the law target.
857
+ - `validators` (array, optional): Array of `{ name: string, command: string }` objects defining validator commands.
858
+
859
+ **Returns:** `{ ok: true, path, sha }` on success;
860
+ `{ ok: false, errors: [...] }` on validation failure;
861
+ `{ error, affected_files }` on commit-policy refusal.
862
+
863
+ **Stage requirements:** none (no active stage); requires a
864
+ `config/*` branch.
865
+
866
+ **Failure modes:**
867
+ - Off `config/*` branch branch-guard refusal envelope.
868
+ - Failed flowtool-name-prefixed error.
869
+ - Schema validation failure → `{ ok: false, errors: [...] }`.
870
+ - Target file already exists → `{ ok: false, errors: ["… already
871
+ exists; use foundry_config_edit_law to update an existing law in place"] }`.
872
+ - Worktree has changes outside `foundry/**`
873
+ `{ error, affected_files }`.
874
+
875
+ **Side effects:** writes the law file and commits it on the current
876
+ `config/*` branch.
862
877
 
863
878
  ### `foundry_config_edit_law`
864
879
 
865
- > Replace the body of an existing law in place, preserving sibling
866
- > laws in the same file. Locates the law by id across both global laws
867
- > and per-type `laws.md` files.
880
+ > Update an existing law's fields in place. Locates the law by id across
881
+ > both global laws and per-type `laws.md` files.
868
882
 
869
883
  **Args:**
870
- - `id` (string, required): law id to edit.
871
- - `body` (string, required): full new markdown body for the law,
872
- starting with a `## <law-id>` heading.
884
+ - `id` (string, required): Law id to edit.
885
+ - `name` (string, optional): New human-readable name.
886
+ - `description` (string, optional): New prose description.
887
+ - `passing` (string, optional): New passing feedback text.
888
+ - `failing` (string, optional): New failing feedback text.
889
+ - `validators` (array, optional): New validator list replacing the current one.
873
890
 
874
891
  **Returns:** `{ ok: true, id, path, source }` on success, where
875
892
  `source` is `"global"` or `"type:<typeId>"`. Returns
876
893
  `{ ok: false, errors: ["Law \"<id>\" not found"] }` when no law of
877
- that id exists, or `{ ok: false, errors: [...] }` when the new body
894
+ that id exists, or `{ ok: false, errors: [...] }` when the update
878
895
  fails law schema validation.
879
896
 
880
897
  **Stage requirements:** none (no active stage); requires a `config/*`
@@ -888,48 +905,92 @@ the current `config/*` branch with message `config: edit law <id>`.
888
905
  > Create a new appraiser personality at `foundry/appraisers/<id>.md`.
889
906
 
890
907
  **Args:**
891
- - `name` (string, required): appraiser id.
892
- - `body` (string, required): markdown body with frontmatter
893
- (`description`, optional `model`, …).
908
+ - `id` (string, required): Appraiser id (kebab-case slug).
909
+ - `name` (string, required): Human-readable name.
910
+ - `description` (string, required): Prose description of the appraiser's role.
911
+ - `model` (string, optional): Model override for this appraiser.
912
+
913
+ **Returns:** `{ ok: true, path, sha }` on success;
914
+ `{ ok: false, errors: [...] }` on schema failure;
915
+ `{ error, affected_files }` on commit-policy refusal.
894
916
 
895
- **Returns / Stage requirements / Side effects:** as for
896
- `foundry_config_create_artefact_type`.
917
+ **Stage requirements:** none (no active stage); requires a
918
+ `config/*` branch.
919
+
920
+ **Failure modes:**
921
+ - Off `config/*` branch → branch-guard refusal envelope.
922
+ - Failed flow → tool-name-prefixed error.
923
+ - Schema validation failure (missing description, semantic overlap
924
+ with an existing appraiser, …) → `{ ok: false, errors: [...] }`.
925
+ - Worktree has changes outside `foundry/**` →
926
+ `{ error, affected_files }`.
897
927
 
898
- **Failure modes:** as for `foundry_config_create_artefact_type`,
899
- applied to the appraiser schema (missing description, semantic overlap
900
- with an existing appraiser, …).
928
+ **Side effects:** writes the appraiser file and commits it on the
929
+ current `config/*` branch.
901
930
 
902
931
  ### `foundry_config_create_flow`
903
932
 
904
933
  > Create a new flow definition under `foundry/flows/<flowId>/`.
905
934
 
906
935
  **Args:**
907
- - `name` (string, required): flowId (kebab-case slug).
908
- - `body` (string, required): markdown body with frontmatter
909
- (`description`, `cycles: [...]`).
936
+ - `id` (string, required): Flow id (kebab-case slug).
937
+ - `name` (string, required): Human-readable name.
938
+ - `startingCycles` (string[], required): Ordered list of cycle ids for this flow.
939
+ - `description` (string, required): Prose description of the flow.
940
+
941
+ **Returns:** `{ ok: true, path, sha }` on success;
942
+ `{ ok: false, errors: [...] }` on schema failure;
943
+ `{ error, affected_files }` on commit-policy refusal.
944
+
945
+ **Stage requirements:** none (no active stage); requires a
946
+ `config/*` branch.
910
947
 
911
- **Returns / Stage requirements / Side effects:** as for
912
- `foundry_config_create_artefact_type`.
948
+ **Failure modes:**
949
+ - Off `config/*` branch → branch-guard refusal envelope.
950
+ - Failed flow → tool-name-prefixed error.
951
+ - Schema validation failure → `{ ok: false, errors: [...] }`.
952
+ - Worktree has changes outside `foundry/**` →
953
+ `{ error, affected_files }`.
913
954
 
914
- **Failure modes:** as for `foundry_config_create_artefact_type`,
915
- applied to the flow schema.
955
+ **Side effects:** writes the flow file and commits it on the
956
+ current `config/*` branch.
916
957
 
917
958
  ### `foundry_config_create_cycle`
918
959
 
919
960
  > Create a new cycle markdown file under `foundry/cycles/<cycleId>.md`.
920
961
 
921
962
  **Args:**
922
- - `name` (string, required): cycleId (kebab-case slug).
923
- - `body` (string, required): markdown body with frontmatter
924
- (`flowId`, `output`, optional `inputs`, `memory`, `models`, …).
963
+ - `id` (string, required): Cycle id (kebab-case slug).
964
+ - `name` (string, required): Human-readable name.
965
+ - `outputType` (string, required): Artefact type id for this cycle's output.
966
+ - `inputs` (object, optional): `{ type: "any-of"|"all-of", artefacts: string[] }` — input filtering rules.
967
+ - `targets` (string[], optional): Target artefact file paths.
968
+ - `alwaysHumanAppraise` (boolean, optional): Force human appraisal on every run.
969
+ - `deadlockHumanAppraise` (boolean, optional): Fall back to human appraisal on deadlock.
970
+ - `maxIterations` (number, optional): Maximum forge-quench-appraise iterations.
971
+ - `assay` (object, optional): `{ extractors: string[] }` — extractors to run in the assay stage.
972
+ - `memory` (object, optional): `{ read: string[], write: string[] }` — memory permissions.
973
+ - `models` (object, optional): Per-stage model overrides.
974
+ - `description` (string, optional): Prose description of the cycle.
975
+
976
+ **Returns:** `{ ok: true, path, sha }` on success;
977
+ `{ ok: false, errors: [...] }` on schema failure;
978
+ `{ error, affected_files }` on commit-policy refusal.
979
+
980
+ **Stage requirements:** none (no active stage); requires a
981
+ `config/*` branch.
925
982
 
926
- **Returns / Stage requirements / Side effects:** as for
927
- `foundry_config_create_artefact_type`.
983
+ **Failure modes:**
984
+ - Off `config/*` branch → branch-guard refusal envelope.
985
+ - Failed flow → tool-name-prefixed error.
986
+ - Schema validation failure (unknown `outputType`, unknown
987
+ `memory.read` / `memory.write` types, unknown referenced appraisers,
988
+ …) → `{ ok: false, errors: [...] }`.
989
+ - Worktree has changes outside `foundry/**` →
990
+ `{ error, affected_files }`.
928
991
 
929
- **Failure modes:** as for `foundry_config_create_artefact_type`,
930
- applied to the cycle schema (unknown `output` artefact-type, unknown
931
- `memory.read` / `memory.write` types, unknown referenced appraisers,
932
- …).
992
+ **Side effects:** writes the cycle file and commits it on the
993
+ current `config/*` branch.
933
994
 
934
995
  ---
935
996
 
@@ -1181,7 +1242,7 @@ read-disallowed.
1181
1242
 
1182
1243
  **Args:**
1183
1244
  - `type`, `name` (string, required).
1184
- - `depth` (number, optional, default 1).
1245
+ - `depth` (number, optional, default 1, maximum 5).
1185
1246
  - `edge_types` (string[], optional): Restrict traversal to named edges;
1186
1247
  defaults to all known edges.
1187
1248
 
@@ -1211,7 +1272,7 @@ cycle cannot read; query contains a forbidden keyword.
1211
1272
 
1212
1273
  **Args:**
1213
1274
  - `query_text` (string, required).
1214
- - `k` (number, optional, default 5).
1275
+ - `k` (number, optional, default 5, maximum 100).
1215
1276
  - `type_filter` (string[], optional): default = all readable entity
1216
1277
  types.
1217
1278