fabro/lib/crates
Bryan Helmkamp 003b691de5
fix(config): route project/workflow loaders through ConfigLayer::load
The Stage 6 audit caught that `load_project_config` and `load_run_config`
bypassed `ConfigLayer::load` and called `parse_project_config` /
`ConfigLayer::parse` directly. As a result, `resolve_goal_file_paths` —
which rewrites relative `[run.goal] file = "..."` paths to absolute
against the declaring file's directory — only fired for
`~/.fabro/settings.toml`, never for `fabro.toml` or `workflow.toml`.

That meant a project author writing

    [run.goal]
    file = "prompts/goal.md"

would have the relative path survive all the way to consume time and
get resolved against the run's `working_directory` instead of the
config-file directory, contradicting the agreed "config-file rooted"
rule and breaking the most common case.

Both loaders now delegate to `ConfigLayer::load(path)`, which performs
the load-time rewrite. The user-settings path was already correct.

## Tests

- `load_project_config_rewrites_relative_goal_file_path`
- `load_run_config_rewrites_relative_goal_file_path`
- `load_run_config_leaves_absolute_goal_file_untouched`
- `build_manifest_resolves_relative_goal_file_in_project_config` —
  end-to-end via `build_run_manifest`, asserting the absolute path lands
  in `manifest.goal.path` and the file contents land in
  `manifest.goal.text`.
- `build_manifest_resolves_relative_goal_file_in_workflow_config` — same
  shape but exercising `workflow.toml`-declared goal files, which
  resolve relative to the much deeper workflow directory rather than
  the project root.

3,787 workspace tests pass (was 3,782, +5 new). `cargo fmt --check
--all` and `cargo clippy --workspace -- -D warnings` are clean.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:41:00 -04:00
..
fabro-agent refactor(settings): stage 6.3b promote user runtime types into consumers 2026-04-09 17:59:49 -04:00
fabro-api fix(api): resolve build spec path at runtime 2026-04-07 23:05:07 -04:00
fabro-checkpoint refactor(settings): stage 6.5b sweep ::v2:: prefix out of consumers 2026-04-09 18:42:05 -04:00
fabro-cli fix(config): route project/workflow loaders through ConfigLayer::load 2026-04-09 20:41:00 -04:00
fabro-config fix(config): route project/workflow loaders through ConfigLayer::load 2026-04-09 20:41:00 -04:00
fabro-core feat: embed fabro spa and align interruption semantics 2026-04-08 14:43:44 -04:00
fabro-devcontainer refactor(workspace): satisfy clippy all-targets warnings 2026-04-05 14:37:32 -04:00
fabro-github refactor(cli): make run-adjacent commands server-only 2026-04-06 06:12:16 -04:00
fabro-graphviz Clean up workspace clippy warnings 2026-03-30 11:27:25 -04:00
fabro-hooks refactor(settings): stage 6.5b sweep ::v2:: prefix out of consumers 2026-04-09 18:42:05 -04:00
fabro-interview feat: embed fabro spa and align interruption semantics 2026-04-08 14:43:44 -04:00
fabro-llm feat: embed fabro spa and align interruption semantics 2026-04-08 14:43:44 -04:00
fabro-macros refactor(settings): stage 6.3b shrink server runtime types + delete Combine 2026-04-09 18:27:46 -04:00
fabro-mcp refactor(settings): stage 6.5b sweep ::v2:: prefix out of consumers 2026-04-09 18:42:05 -04:00
fabro-model fix(clippy): restore workspace lint cleanups after main merge 2026-04-07 18:01:53 -04:00
fabro-oauth refactor(workspace): satisfy clippy all-targets warnings 2026-04-05 14:37:32 -04:00
fabro-proc feat(run): harden server-supervised worker lifecycle 2026-04-07 07:59:35 -04:00
fabro-retro Merge remote-tracking branch 'origin/main' 2026-04-07 15:24:07 -04:00
fabro-sandbox refactor(settings): stage 6.5b sweep ::v2:: prefix out of consumers 2026-04-09 18:42:05 -04:00
fabro-server feat(settings): run.goal tagged union (inline | file) 2026-04-09 19:47:12 -04:00
fabro-slack fix(clippy): restore workspace lint cleanups 2026-04-07 20:40:02 -04:00
fabro-spa feat: embed fabro spa and align interruption semantics 2026-04-08 14:43:44 -04:00
fabro-store refactor(settings): stage 6.5b sweep ::v2:: prefix out of consumers 2026-04-09 18:42:05 -04:00
fabro-telemetry fix(home): migrate all runtime consumers to use Home 2026-04-06 13:36:43 -04:00
fabro-test test(migration): land final Stage 4 fixes — 100% workspace tests green 2026-04-09 11:07:18 -04:00
fabro-tracker fix(test): remove hidden HTTP client startup overhead 2026-04-04 21:25:51 -04:00
fabro-types feat(settings): run.goal tagged union (inline | file) 2026-04-09 19:47:12 -04:00
fabro-util refactor(home): move Home to fabro-util so all crates can share it 2026-04-06 13:08:35 -04:00
fabro-validate Add publish = false to all crates to prevent accidental crates.io publish 2026-03-29 13:47:09 -04:00
fabro-workflow feat(settings): run.goal tagged union (inline | file) 2026-04-09 19:47:12 -04:00