From 5ccaf11b799203a88b6c7df0aa42d13cefbbd4d2 Mon Sep 17 00:00:00 2001 From: cds-amal Date: Wed, 25 Mar 2026 17:40:06 -0400 Subject: [PATCH 1/6] docs: add ADR for config monoid unification ADR-01 documents the decision to unify three separate config merge code paths (mergeConfigs, applyDefaults, inline spreads in command-builder) under a single concatFrontmatter monoid operation with verified algebraic laws: identity, right-bias, associativity, and no-mutation. --- docs/ADR01.config-monad.md | 56 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 docs/ADR01.config-monad.md diff --git a/docs/ADR01.config-monad.md b/docs/ADR01.config-monad.md new file mode 100644 index 0000000..547ab38 --- /dev/null +++ b/docs/ADR01.config-monad.md @@ -0,0 +1,56 @@ +# ADR-01: Unify config merging under a monoid + +- **Status**: Accepted +- **Date**: 2025-12-12 +- **Scope**: `config.ts`, `command-builder.ts` + +## Context + +mdflow's config precedence chain merges six layers, each overriding the last: + +``` +built-in ⊕ global ⊕ git-root ⊕ cwd ⊕ frontmatter ⊕ CLI flags +``` + +This is structurally a monoidal fold: `{}` is the identity, right-biased shallow merge is the associative binary operation, and `reduce` is the fold. But before this change, three separate code paths expressed that same operation differently: + +1. `mergeConfigs()` in `config.ts`: deep-clones base, then shallow-merges override per command key +2. `applyDefaults()` in `config.ts`: spreads defaults first, then iterates frontmatter entries with assignment +3. Inline spreads in `command-builder.ts`: `{ ...defaults, ...frontmatter } as AgentFrontmatter` + +The inline spreads don't deep-clone, so they can alias nested objects. `applyDefaults` uses iteration rather than spread, which behaves identically for flat objects but could diverge with getters or `toJSON`. There were ~18 tests across three files testing variations of the same merge logic, but no integration test verified the full precedence chain end-to-end. + +## Decision + +Introduce `concatFrontmatter(base, override)` as the single canonical merge operation, with documented algebraic laws: + +```typescript +export function concatFrontmatter( + base: AgentFrontmatter, + override: AgentFrontmatter +): AgentFrontmatter { + return { ...base, ...override }; +} +``` + +Laws (verified by property-based tests): +- **Identity**: `concatFrontmatter({}, x) ≡ x` and `concatFrontmatter(x, {}) ≡ x` +- **Right-bias**: for any key `k` in both `a` and `b`, `result[k] === b[k]` +- **Associativity**: `concat(a, concat(b, c)) ≡ concat(concat(a, b), c)` +- **No mutation**: neither input is modified + +All three code paths now delegate to this function: +- `applyDefaults` becomes a thin wrapper: `concatFrontmatter(defaults, frontmatter)` +- `mergeConfigs` uses it for per-command merging +- `buildCommand` / `buildCommandBase` call it instead of inline spreads + +## Testing strategy + +Property-based tests (fast-check, 200 randomized inputs per law) replace the case-by-case merge tests. A mutation proof (`doc/mutation-proof.md`) demonstrates equivalence: three deliberate bugs were introduced one at a time, and the property tests caught all three (3/3) while the case tests caught only one (1/3). The two bugs missed by case tests were phantom key injection (caught by identity law) and input mutation (caught by no-mutation law). + +## Consequences + +- One function to reason about for all config merging, instead of three +- Property-based tests provide strictly stronger coverage with fewer test cases +- `applyDefaults` is retained as a backward-compatible wrapper (thin delegation, no separate logic) +- `mergeConfigs` still handles the `GlobalConfig` level (per-command dispatch), but its inner merge is now `concatFrontmatter` From fd9ac2e607fc3709ca937c28a36d3161b6c28b4d Mon Sep 17 00:00:00 2001 From: cds-amal Date: Wed, 25 Mar 2026 17:40:24 -0400 Subject: [PATCH 2/6] refactor: unify config merging under concatFrontmatter monoid Introduces concatFrontmatter(base, override) as the single canonical right-biased merge for AgentFrontmatter. This replaces three separate code paths that expressed the same operation differently: 1. applyDefaults() in config.ts (iteration-based) 2. mergeConfigs() per-command merge (inline spread) 3. buildCommand/buildCommandBase in command-builder.ts (inline spread) All three now delegate to concatFrontmatter. applyDefaults is retained as a thin backward-compatible wrapper. Property-based tests (fast-check, 200 runs each) verify the monoid laws: identity, right-bias, associativity, no-mutation, and key preservation. All 152 existing tests pass unchanged alongside the 6 new property tests (158 total, 3147 expect() calls). --- bun.lockb | Bin 0 -> 212361 bytes package.json | 2 +- src/command-builder.ts | 9 +-- src/config-monoid.test.ts | 118 ++++++++++++++++++++++++++++++++++++++ src/config.ts | 46 ++++++++++----- 5 files changed, 157 insertions(+), 18 deletions(-) create mode 100755 bun.lockb create mode 100644 src/config-monoid.test.ts diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..2a37d60d2b1c561a38323fd5f52699364e3f9c23 GIT binary patch literal 212361 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 = fc.dictionary( + // Keys: mix of plain flags, _template vars, and $N positionals + fc.oneof( + fc.stringMatching(/^[a-z][a-z0-9-]{0,10}$/), // plain flags: model, verbose, add-dir + fc.stringMatching(/^_[a-z][a-z0-9]{0,8}$/), // template vars: _name, _stdin + fc.constantFrom("$1", "$2", "$3"), // positional mappings + ), + // Values: the types that actually appear in frontmatter + fc.oneof( + fc.string(), + fc.integer(), + fc.boolean(), + fc.constant(null), + fc.constant(undefined), + fc.array(fc.string(), { maxLength: 3 }), + ), +) as fc.Arbitrary; + +describe("concatFrontmatter monoid laws", () => { + it("right identity: concat(x, {}) ≡ x", () => { + fc.assert( + fc.property(arbFrontmatter, (x) => { + const result = concatFrontmatter(x, {}); + expect(result).toEqual(x); + }), + { numRuns: 200 }, + ); + }); + + it("left identity: concat({}, x) ≡ x", () => { + fc.assert( + fc.property(arbFrontmatter, (x) => { + const result = concatFrontmatter({}, x); + expect(result).toEqual(x); + }), + { numRuns: 200 }, + ); + }); + + it("right-bias: for any key in both a and b, result[k] === b[k]", () => { + fc.assert( + fc.property(arbFrontmatter, arbFrontmatter, (a, b) => { + const result = concatFrontmatter(a, b); + for (const key of Object.keys(b)) { + expect(result[key]).toEqual(b[key]); + } + }), + { numRuns: 200 }, + ); + }); + + it("associativity: concat(a, concat(b, c)) ≡ concat(concat(a, b), c)", () => { + fc.assert( + fc.property(arbFrontmatter, arbFrontmatter, arbFrontmatter, (a, b, c) => { + const leftAssoc = concatFrontmatter(concatFrontmatter(a, b), c); + const rightAssoc = concatFrontmatter(a, concatFrontmatter(b, c)); + expect(leftAssoc).toEqual(rightAssoc); + }), + { numRuns: 200 }, + ); + }); + + it("no mutation: neither input is modified", () => { + fc.assert( + fc.property(arbFrontmatter, arbFrontmatter, (a, b) => { + // Deep clone inputs before the operation + const aCopy = JSON.parse(JSON.stringify(a)); + const bCopy = JSON.parse(JSON.stringify(b)); + + concatFrontmatter(a, b); + + // Inputs must be unchanged (compare via JSON since toEqual + // treats undefined values inconsistently across deep clone) + expect(JSON.stringify(a)).toEqual(JSON.stringify(aCopy)); + expect(JSON.stringify(b)).toEqual(JSON.stringify(bCopy)); + }), + { numRuns: 200 }, + ); + }); + + it("base keys not in override are preserved", () => { + fc.assert( + fc.property(arbFrontmatter, arbFrontmatter, (a, b) => { + const result = concatFrontmatter(a, b); + for (const key of Object.keys(a)) { + if (!(key in b)) { + expect(result[key]).toEqual(a[key]); + } + } + }), + { numRuns: 200 }, + ); + }); +}); diff --git a/src/config.ts b/src/config.ts index c1882a7..4491167 100644 --- a/src/config.ts +++ b/src/config.ts @@ -301,6 +301,10 @@ function deepCloneConfig(config: GlobalConfig): GlobalConfig { /** * Deep merge two configs (second takes priority) * Returns a new object - does not modify either input. + * + * Per-command merging delegates to concatFrontmatter, so the same + * right-biased merge operation is used at every level of the + * precedence chain. */ export function mergeConfigs(base: GlobalConfig, override: GlobalConfig): GlobalConfig { // Start with a deep clone of base @@ -309,10 +313,10 @@ export function mergeConfigs(base: GlobalConfig, override: GlobalConfig): Global if (override.commands) { result.commands = result.commands ? { ...result.commands } : {}; for (const [cmd, defaults] of Object.entries(override.commands)) { - result.commands[cmd] = { - ...(result.commands[cmd] || {}), - ...defaults, - }; + result.commands[cmd] = concatFrontmatter( + (result.commands[cmd] || {}) as AgentFrontmatter, + defaults as AgentFrontmatter, + ) as CommandDefaults; } } @@ -327,9 +331,33 @@ export async function getCommandDefaults(command: string): Promise Date: Wed, 25 Mar 2026 17:42:12 -0400 Subject: [PATCH 3/6] docs: add mutation proof showing property tests subsume case tests Three deliberate mutations introduced one at a time into concatFrontmatter, with both test suites run against each: 1. Left-bias (base wins): caught by both suites 2. Phantom key injection: caught by property tests ONLY 3. Input mutation: caught by property tests ONLY Property tests catch 3/3 mutations; case tests catch 1/3. This justifies removing the redundant case-by-case merge tests in the next commit. --- docs/mutation-proof.md | 75 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 docs/mutation-proof.md diff --git a/docs/mutation-proof.md b/docs/mutation-proof.md new file mode 100644 index 0000000..1ad880f --- /dev/null +++ b/docs/mutation-proof.md @@ -0,0 +1,75 @@ +# Mutation Proof: Property Tests vs Case Tests + +Demonstrates that the property-based tests for `concatFrontmatter` catch +a strict superset of the bugs that the case-by-case tests catch. + +## Setup + +- **Property tests**: 6 tests in `config-monoid.test.ts` (identity, right-bias, associativity, no-mutation, key preservation) +- **Case tests**: merge-related tests across `config.test.ts`, `context.test.ts`, `command-builder.test.ts` +- **Baseline**: 158 tests, 0 failures + +## Mutation 1: Left-bias (base wins instead of override) + +```diff +- return { ...base, ...override }; ++ return { ...override, ...base }; +``` + +| Suite | Caught? | Failing tests | +|-------|---------|---------------| +| Case tests | Yes (5 failures) | `mergeConfigs > override takes priority`, `applyDefaults merges defaults with frontmatter (frontmatter wins)`, `loadFullConfig > project config overrides global config`, `config cascade > CWD config overrides git root config`, `buildCommand > frontmatter overrides config defaults` | +| Property tests | Yes (1 failure) | `right-bias: for any key in both a and b, result[k] === b[k]` | + +**Both suites catch this mutation.** + +## Mutation 2: Break identity (inject phantom key) + +```diff +- return { ...base, ...override }; ++ return { ...base, ...override, _phantom: true }; +``` + +| Suite | Caught? | Failing tests | +|-------|---------|---------------| +| Case tests | No | All pass (case tests only assert specific keys, not absence of extras) | +| Property tests | Yes (2 failures) | `right identity: concat(x, {}) ≡ x`, `left identity: concat({}, x) ≡ x` | + +**Only property tests catch this mutation.** The case tests check for the presence +of expected keys but don't verify that no unexpected keys are added. The identity +law catches this immediately because `concat(x, {})` should equal `x` exactly, +and the phantom key breaks that equality. + +## Mutation 3: Mutate base input (return mutated base instead of new object) + +```diff +- return { ...base, ...override }; ++ Object.assign(base, override); return base; +``` + +| Suite | Caught? | Failing tests | +|-------|---------|---------------| +| Case tests | No | All pass (case tests don't snapshot inputs before/after) | +| Property tests | Yes (1 failure) | `no mutation: neither input is modified` | + +**Only property tests catch this mutation.** The case tests pass fresh literals +to each test, so mutating them has no observable effect within a single test. +The property test explicitly verifies that inputs are unchanged after the call. + +## Conclusion + +| Mutation | Case tests | Property tests | +|----------|-----------|----------------| +| Left-bias | Caught | Caught | +| Phantom key injection | **Missed** | Caught | +| Input mutation | **Missed** | Caught | + +The property tests catch all 3 mutations. The case tests catch only 1 of 3. +The property tests are strictly more powerful for verifying the algebraic +properties of `concatFrontmatter`, which justifies removing the case-by-case +merge tests that the property tests subsume. + +Note: the case tests that test *other* behavior (config file loading, interactive +mode, project cascade with real filesystem) are NOT subsumed and should be retained. +Only the pure merge-logic tests (identity, precedence, key preservation) are +redundant with the property tests. From ec809068d98a82d2912268c82d41db98d0c2b3bc Mon Sep 17 00:00:00 2001 From: cds-amal Date: Wed, 25 Mar 2026 17:43:57 -0400 Subject: [PATCH 4/6] test: remove case-by-case merge tests subsumed by property tests Removes 8 case tests that verified pure merge logic (identity, right-bias, key preservation) from config.test.ts and context.test.ts. These are now covered by 6 property-based tests in config-monoid.test.ts that run 200 randomized inputs each (3147 expect() calls total). The mutation proof in docs/mutation-proof.md demonstrates the property tests catch a strict superset of bugs: 3/3 mutations caught vs 1/3 for the case tests. Retained: all config loading, filesystem cascade, interactive mode, and command-builder integration tests (these exercise I/O and mode-specific behavior that property tests don't cover). 150 tests pass, 0 failures. --- src/config.test.ts | 19 ++--------- src/context.test.ts | 78 ++++----------------------------------------- 2 files changed, 9 insertions(+), 88 deletions(-) diff --git a/src/config.test.ts b/src/config.test.ts index 0ef6a8f..4f8b360 100644 --- a/src/config.test.ts +++ b/src/config.test.ts @@ -2,7 +2,6 @@ import { expect, test, describe, beforeEach, afterEach } from "bun:test"; import { loadGlobalConfig, getCommandDefaults, - applyDefaults, applyInteractiveMode, clearConfigCache, findGitRoot, @@ -40,21 +39,9 @@ describe("config", () => { expect(defaults).toBeUndefined(); }); - test("applyDefaults merges defaults with frontmatter (frontmatter wins)", () => { - const frontmatter = { model: "opus", $1: "custom" }; - const defaults = { $1: "prompt", verbose: true }; - const result = applyDefaults(frontmatter, defaults); - - expect(result.model).toBe("opus"); - expect(result.$1).toBe("custom"); // frontmatter wins - expect(result.verbose).toBe(true); // default applied - }); - - test("applyDefaults returns frontmatter unchanged when no defaults", () => { - const frontmatter = { model: "opus" }; - const result = applyDefaults(frontmatter, undefined); - expect(result).toEqual(frontmatter); - }); + // NOTE: Pure merge-logic tests (identity, right-bias, associativity) have been + // replaced by property-based tests in config-monoid.test.ts. See docs/mutation-proof.md + // for the equivalence proof showing property tests catch a strict superset of bugs. }); describe("findGitRoot", () => { diff --git a/src/context.test.ts b/src/context.test.ts index f543fff..97d53ad 100644 --- a/src/context.test.ts +++ b/src/context.test.ts @@ -15,13 +15,12 @@ import { createSilentLogger, createTestLogger, createConsoleLogger, - mergeConfigs, BUILTIN_DEFAULTS, type TestLogger, } from "./context"; import type { RunContext, GlobalConfig } from "./types"; import { expandImports } from "./imports"; -import { loadFullConfigFresh, getCommandDefaultsFromConfig, applyDefaults } from "./config"; +import { loadFullConfigFresh, getCommandDefaultsFromConfig } from "./config"; describe("RunContext", () => { describe("createRunContext", () => { @@ -146,59 +145,9 @@ describe("RunContext", () => { }); }); - describe("mergeConfigs", () => { - it("merges empty configs", () => { - const result = mergeConfigs({}, {}); - expect(result).toEqual({}); - }); - - it("base config is preserved when override is empty", () => { - const base: GlobalConfig = { - commands: { claude: { model: "opus" } }, - }; - const result = mergeConfigs(base, {}); - - expect(result.commands?.claude?.model).toBe("opus"); - }); - - it("override takes priority", () => { - const base: GlobalConfig = { - commands: { claude: { model: "opus" } }, - }; - const override: GlobalConfig = { - commands: { claude: { model: "sonnet" } }, - }; - const result = mergeConfigs(base, override); - - expect(result.commands?.claude?.model).toBe("sonnet"); - }); - - it("merges command settings", () => { - const base: GlobalConfig = { - commands: { claude: { model: "opus" } }, - }; - const override: GlobalConfig = { - commands: { claude: { verbose: true } }, - }; - const result = mergeConfigs(base, override); - - expect(result.commands?.claude?.model).toBe("opus"); - expect(result.commands?.claude?.verbose).toBe(true); - }); - - it("adds new commands", () => { - const base: GlobalConfig = { - commands: { claude: { model: "opus" } }, - }; - const override: GlobalConfig = { - commands: { gemini: { model: "pro" } }, - }; - const result = mergeConfigs(base, override); - - expect(result.commands?.claude?.model).toBe("opus"); - expect(result.commands?.gemini?.model).toBe("pro"); - }); - }); + // NOTE: mergeConfigs merge-logic tests (identity, right-bias, key preservation) + // have been replaced by property-based tests in config-monoid.test.ts. + // See docs/mutation-proof.md for the equivalence proof. }); describe("RunContext Isolation", () => { @@ -332,23 +281,8 @@ After import`; expect(unknownDefaults).toBeUndefined(); }); - it("applyDefaults works with RunContext config", () => { - const ctx = createTestRunContext({ - config: { - commands: { - claude: { model: "opus", verbose: true }, - }, - }, - }); - - const frontmatter = { temperature: 0.7 }; - const defaults = getCommandDefaultsFromConfig(ctx.config, "claude"); - const result = applyDefaults(frontmatter, defaults); - - expect(result.model).toBe("opus"); - expect(result.verbose).toBe(true); - expect(result.temperature).toBe(0.7); - }); + // NOTE: applyDefaults merge-logic test replaced by property-based tests + // in config-monoid.test.ts. See docs/mutation-proof.md. }); describe("Parallel Test Isolation Demo", () => { From 37525f3ab04728440d44b884faf27f0387f8f64f Mon Sep 17 00:00:00 2001 From: cds-amal Date: Wed, 25 Mar 2026 18:14:16 -0400 Subject: [PATCH 5/6] Update docs/ADR01.config-monad.md good catch. Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- docs/ADR01.config-monad.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ADR01.config-monad.md b/docs/ADR01.config-monad.md index 547ab38..e6e8adc 100644 --- a/docs/ADR01.config-monad.md +++ b/docs/ADR01.config-monad.md @@ -46,7 +46,7 @@ All three code paths now delegate to this function: ## Testing strategy -Property-based tests (fast-check, 200 randomized inputs per law) replace the case-by-case merge tests. A mutation proof (`doc/mutation-proof.md`) demonstrates equivalence: three deliberate bugs were introduced one at a time, and the property tests caught all three (3/3) while the case tests caught only one (1/3). The two bugs missed by case tests were phantom key injection (caught by identity law) and input mutation (caught by no-mutation law). +A mutation proof (`docs/mutation-proof.md`) demonstrates equivalence: three deliberate bugs were introduced one at a time, and the property tests caught all three (3/3) while the case tests caught only one (1/3). The two bugs missed by case tests were phantom key injection (caught by identity law) and input mutation (caught by no-mutation law). ## Consequences From fa5e8077944c8de60978dcced9878b44c224dfd5 Mon Sep 17 00:00:00 2001 From: cds-amal Date: Wed, 25 Mar 2026 18:19:42 -0400 Subject: [PATCH 6/6] Update docs/ADR01.config-monad.md sigh..dates. Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- docs/ADR01.config-monad.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ADR01.config-monad.md b/docs/ADR01.config-monad.md index e6e8adc..df2fb72 100644 --- a/docs/ADR01.config-monad.md +++ b/docs/ADR01.config-monad.md @@ -1,7 +1,7 @@ # ADR-01: Unify config merging under a monoid - **Status**: Accepted -- **Date**: 2025-12-12 +- **Date**: 2026-03-25 - **Scope**: `config.ts`, `command-builder.ts` ## Context