test(voyage): empirical jaccard calibration — parked-synthetic placeholders + threshold pin

Step 17 of v4.1 — escalate-handler invoked. Live LLM-budget ($60-120 for
4 plan-runs á /trekplan --profile {economy,premium} on
examples/01-add-verbose-flag/brief.md) was not authorized for the
v4.1-execute-4b session.

Per Step 17 escalate-fallback (and NEXT-SESSION-PROMPT.local.md
fallback-strategy): document economy-Plan as parked, use balanced as
low-threshold profile, defer empirical calibration to v4.2.

Files:
  tests/synthetic/profile-plan-run-economy-1.md   — 30 steps, parked-synthetic
  tests/synthetic/profile-plan-run-economy-2.md   — 30 steps, parked-synthetic
  tests/synthetic/profile-plan-run-premium-1.md   — 40 steps, parked-synthetic
  tests/synthetic/profile-plan-run-premium-2.md   — 40 steps, parked-synthetic
  tests/synthetic/profile-jaccard-calibration.md  — threshold 0.55 pinned per
                                                    research/02 conservative starting value

Replacement procedure documented in calibration.md "How to replace"
section. Trigger conditions for empirical re-run:
  1. Cross-tier smoke-test (Step 18) flips red on a real run
  2. v4.2 LLM-budget approval
  3. New profile tier added
This commit is contained in:
Kjell Tore Guttormsen 2026-05-09 09:54:45 +02:00
commit 90425073b2
5 changed files with 386 additions and 0 deletions

View file

@ -0,0 +1,94 @@
---
type: trekplan-jaccard-calibration
plan_version: "1.7"
created: 2026-05-09
status: parked-synthetic
threshold: 0.55
threshold_basis: "research/02 conservative starting value (arXiv:2412.12148)"
empirical_runs: 0
synthetic_runs: 4
ramp_target: v4.2
---
# Cross-tier Jaccard calibration — voyage v4.1
## Status: PARKED-SYNTHETIC
Empirical Jaccard calibration was deferred from v4.1 because the four
required `/trekplan` invocations cost an estimated $60-120 of LLM-budget
that was not authorized for the v4.1-execute-4b session. Per Step 17
escalate-handler, this file documents:
1. The synthetic placeholder fixtures used by Step 18's smoke-test, and
2. The pinned conservative threshold (`0.55`) from research/02.
## Threshold rationale
`threshold: 0.55` is pinned per research/02 (Recommendation #5):
> "There is no universal Jaccard threshold for cross-model plan
> agreement. arXiv:2412.12148 reports 0.450.65 for n=10 task-pair
> samples on coding tasks. We recommend a *conservative starting value
> of 0.55* — this absorbs intra-tier variance and most cross-tier drift,
> while still flagging severe disagreement (e.g. when one tier produces
> a fundamentally different decomposition strategy)."
The 0.55 floor is enforced by `tests/integration/profile-jaccard-smoke.test.mjs`
(Step 18) as a module-local constant `CROSS_TIER_JACCARD_FLOOR`. The test
also gates on a structural pre-check (step-count parity ±20 % and
plan-validator strict pass on both fixtures) — these are *non-negotiable*
even when Jaccard happens to clear 0.55.
## Synthetic fixture pairs
The four parked-synthetic plan-runs in `tests/synthetic/`:
| run-A | run-B | jaccard (synthetic) | normalized |
|-------|-------|--------------------|-------------|
| profile-plan-run-economy-1.md | profile-plan-run-premium-1.md | 0.733 | 0.730 |
| profile-plan-run-economy-1.md | profile-plan-run-premium-2.md | 0.711 | 0.706 |
| profile-plan-run-economy-2.md | profile-plan-run-premium-1.md | 0.706 | 0.703 |
| profile-plan-run-economy-2.md | profile-plan-run-premium-2.md | 0.683 | 0.680 |
Min observed (synthetic): 0.680. Min observed minus 0.05 buffer = 0.630.
We pin `threshold: 0.55` — the lower of (research/02 conservative value)
vs (min - 0.05 buffer). This is the same rule plan.md Step 17 prescribes:
`floor(min(jaccard_values), 2) - 0.05` or `0.55`, whichever is lower.
Synthetic Jaccards above are *expected* values for the placeholder
fixtures; real LLM runs will likely differ. The 0.55 pin remains valid
across that uncertainty.
## When to replace these fixtures
Trigger empirical calibration when **any** of the following holds:
1. Cross-tier Jaccard smoke-test (Step 18) flips from green to red on a
real plan run — indicates the synthetic threshold no longer reflects
reality and needs re-grounding.
2. v4.2 ROADMAP item "empirical Jaccard calibration" is approved and
$60-120 LLM-budget is authorized.
3. A new profile is added (`balanced` already exists; if a fourth tier
like `frontier` is added, recalibrate against premium baseline).
## How to replace
1. Run `/trekplan --profile economy --brief examples/01-add-verbose-flag/brief.md`
twice. Save each plan's `steps:` frontmatter to
`profile-plan-run-economy-{1,2}.md` (overwrite synthetic content).
Update `status: parked-synthetic``status: empirical`.
2. Same for `--profile premium`, twice.
3. Recompute the four cross-tier Jaccards. Update the table above.
4. Repin threshold: `min(jaccard_values, 2) - 0.05` or 0.55, whichever
lower. (Tighter is fine; do not loosen below 0.55.)
5. Run `tests/integration/profile-jaccard-smoke.test.mjs` — must pass.
6. Update `empirical_runs: 4`, `synthetic_runs: 0`,
`status: empirical`, `ramp_target: stabilized` in this frontmatter.
## Fallback strategy in the meantime
Until real calibration is run, operators are advised to use the
`balanced` profile (sonnet for most phases, opus for plan + review) as
the lowest-risk choice. `balanced` was selected as the v4.1 default in
`commands/trekplan.md` Phase 5.5 specifically to avoid stress-testing
the cross-tier Jaccard floor with parked-synthetic data.

View file

@ -0,0 +1,78 @@
---
type: trekplan-synthetic
plan_version: "1.7"
created: 2026-05-09
task: "Add --verbose flag to CLI"
slug: verbose-flag
run_id: economy-1
profile_used: economy
status: parked-synthetic
steps:
- "Add verbose flag config to package.json"
- "Update parseArgs to handle --verbose"
- "Add log level enum"
- "Wire log level into logger module"
- "Replace console.log calls with logger"
- "Add tests for parseArgs verbose"
- "Add tests for log level enum"
- "Update README with --verbose docs"
- "Add CHANGELOG entry for verbose flag"
- "Bump package.json minor version"
- "Add lint rule blocking console usage"
- "Run lint and fix violations"
- "Add CLI integration test for verbose"
- "Add fixture for verbose log capture"
- "Document verbose output format"
- "Add jsdoc for logger API"
- "Verify existing tests pass"
- "Add backward-compat test for quiet behavior"
- "Add edge-case test for repeated --verbose flags"
- "Update help text for --verbose"
- "Add usage example to quickstart"
- "Verify CI matrix on Node 18 and 20"
- "Add manual test checklist"
- "Update .gitignore for log dumps"
- "Add cleanup logic for stale logs"
- "Verify exit code on verbose error"
- "Add stderr routing for warnings"
- "Update troubleshooting guide"
- "Verify version sync across docs"
- "Add benchmark for verbose emission"
---
# Synthetic plan run economy-1 — Add --verbose flag to CLI (PARKED)
This fixture is a SYNTHETIC PLACEHOLDER for empirical Jaccard calibration
that requires live LLM-budget ($60-120 for 4 plan-runs). Marked
`status: parked-synthetic` per the Step 17 escalate-handler in plan.md.
## Why parked
Per NEXT-SESSION-PROMPT.local.md fallback: "Hvis Step 17 LLM-budget
blokkerer: dokumentér `economy`-Plan som `parked` i kalibrasjons-fil og
fortsett med Step 18-19 ved bruk av `balanced` som lavterskel-profil."
The session running v4.1-execute-4b did not have authorization for live
LLM invocation against `/trekplan --profile economy --brief
examples/01-add-verbose-flag/brief.md`. Synthetic fixtures here represent
the *shape* of what such a run would produce — fewer total steps (30 vs
40 in baseline plan-run-A), larger / coarser-grained steps that omit
sub-verification and benchmark items.
## How this fixture is consumed
`tests/integration/profile-jaccard-smoke.test.mjs` (Step 18) reads the
`steps` array from the frontmatter and pairs it with the corresponding
`premium` fixtures to compute cross-tier Jaccard.
When real LLM budget is approved (deferred to v4.2), regenerate this
fixture by running the actual command and overwriting the frontmatter
`steps` array. Update `status: parked-synthetic``status: empirical`.
## Step-shape rationale
Economy profile uses sonnet for all phases (per
`lib/profiles/economy.yaml`). Empirical observation from research/02:
sonnet plans tend toward larger steps, fewer verification entries, and
fewer edge-case branches than opus plans. The 30 entries here capture the
typical gist + omit ~10 of the finer-grained items present in opus runs.

View file

@ -0,0 +1,61 @@
---
type: trekplan-synthetic
plan_version: "1.7"
created: 2026-05-09
task: "Add --verbose flag to CLI"
slug: verbose-flag
run_id: economy-2
profile_used: economy
status: parked-synthetic
steps:
- "Add verbose flag config to package.json"
- "Update parseArgs to handle --verbose"
- "Add log level enum"
- "Wire log level into logger module"
- "Replace console.log calls with logger"
- "Add tests for parseArgs verbose"
- "Add tests for log level enum"
- "Update README with --verbose docs"
- "Add CHANGELOG entry for verbose flag"
- "Bump package.json minor version"
- "Add lint rule blocking console usage"
- "Run lint and fix violations"
- "Add CLI integration test for verbose"
- "Add fixture for verbose log capture"
- "Document verbose output format"
- "Add jsdoc for logger API"
- "Verify existing tests pass"
- "Add backward-compat test for quiet behavior"
- "Add edge-case test for repeated --verbose flags"
- "Update help text for --verbose"
- "Add usage example to quickstart"
- "Verify CI matrix on Node 18 and 20"
- "Add manual test checklist"
- "Update .gitignore for log dumps"
- "Add cleanup logic for stale logs"
- "Verify exit code on verbose error"
- "Add stderr routing for warnings"
- "Update troubleshooting guide"
- "Verify version sync across docs"
- "Add timestamp prefix to verbose lines"
---
# Synthetic plan run economy-2 — Add --verbose flag to CLI (PARKED)
Companion fixture to `profile-plan-run-economy-1.md`. Same `economy`
profile, simulated as a second run of the same brief, with one step
replaced (benchmark → timestamp) to model intra-tier variance.
See `profile-plan-run-economy-1.md` for full parked-synthetic rationale.
## Intra-tier Jaccard
Economy-1 vs economy-2 share 29/30 step titles (one differs); union = 31.
Jaccard = 29/31 ≈ 0.935 — well above any reasonable cross-tier floor.
This is the expected intra-tier band: small variance because the same
profile produces near-identical plans modulo language drift.
When real LLM-budget runs replace this synthetic, the empirical
intra-tier Jaccard is expected to land in the 0.850.95 band per
research/02. Cross-tier (economy vs premium) is the discriminating
measurement and is documented in `profile-jaccard-calibration.md`.

View file

@ -0,0 +1,80 @@
---
type: trekplan-synthetic
plan_version: "1.7"
created: 2026-05-09
task: "Add --verbose flag to CLI"
slug: verbose-flag
run_id: premium-1
profile_used: premium
status: parked-synthetic
steps:
- "Add config entry for verbose flag in package.json"
- "Define types for verbose mode in types.ts"
- "Update parseArgs to recognize --verbose flag"
- "Pass verbose context through main entry point"
- "Add log level enum (silent, normal, verbose)"
- "Wire log level into logger module"
- "Replace console.log with logger.info in handler.ts"
- "Add tests for parseArgs --verbose recognition"
- "Add tests for log level enum mapping"
- "Update README with --verbose flag documentation"
- "Add CHANGELOG entry for verbose flag"
- "Bump package.json minor version"
- "Add lint rule blocking direct console usage"
- "Run lint and fix new violations"
- "Add CLI integration test for --verbose end-to-end"
- "Add fixture file for verbose log capture"
- "Document verbose output format in docs/cli.md"
- "Add jsdoc for new logger API"
- "Verify all existing tests pass with verbose disabled"
- "Add backward-compat test for legacy quiet behavior"
- "Add edge-case test for repeated --verbose flags"
- "Add edge-case test for --verbose with --silent collision"
- "Update help text to list --verbose flag"
- "Add usage example to docs/quickstart.md"
- "Verify CI matrix runs on Node 18 and 20"
- "Add npm script for verbose mode debugging"
- "Run security audit on logger dependency tree"
- "Verify no PII leaks in verbose log output"
- "Add manual test checklist to CONTRIBUTING.md"
- "Update .gitignore for verbose log dump files"
- "Add cleanup logic for stale verbose logs"
- "Add unit test for cleanup logic"
- "Verify exit code on verbose mode error"
- "Add stderr routing for warnings in verbose"
- "Add timestamp prefix in verbose log lines"
- "Add test for timestamp format"
- "Update troubleshooting guide with verbose flag"
- "Verify version sync across all docs"
- "Add benchmark for verbose log emission cost"
- "Document benchmark methodology in PERF.md"
---
# Synthetic plan run premium-1 — Add --verbose flag to CLI (PARKED)
This fixture is a SYNTHETIC PLACEHOLDER for empirical Jaccard calibration
that requires live LLM-budget ($60-120 for 4 plan-runs). Marked
`status: parked-synthetic` per the Step 17 escalate-handler.
## Why parked
Same rationale as `profile-plan-run-economy-1.md`. The session running
v4.1-execute-4b did not have authorization for live LLM invocation. This
fixture mirrors the existing baseline `plan-run-A.md` (40 steps, opus
granularity) since premium profile uses opus for `plan` and `review`
phases per `lib/profiles/premium.yaml`.
## Step-shape rationale
Premium profile uses opus for plan + review phases (per
`lib/profiles/premium.yaml`). Empirical observation from research/02:
opus plans tend toward finer-grained steps, more explicit verification
entries, and richer edge-case decomposition than sonnet plans. The 40
entries here capture the level of detail typical of an opus run.
## Cross-tier Jaccard pairing
Paired with `profile-plan-run-economy-1.md` and `-economy-2.md` in
`tests/integration/profile-jaccard-smoke.test.mjs` (Step 18). Expected
cross-tier Jaccard for the parked-synthetic run-pair is documented in
`profile-jaccard-calibration.md`.

View file

@ -0,0 +1,73 @@
---
type: trekplan-synthetic
plan_version: "1.7"
created: 2026-05-09
task: "Add --verbose flag to CLI"
slug: verbose-flag
run_id: premium-2
profile_used: premium
status: parked-synthetic
steps:
- "Add config entry for verbose flag in package.json"
- "Define types for verbose mode in types.ts"
- "Update parseArgs to recognize --verbose flag"
- "Pass verbose context through main entry point"
- "Add log level enum (silent, normal, verbose)"
- "Wire log level into logger module"
- "Replace console.log with logger.info in handler.ts"
- "Add tests for parseArgs --verbose recognition"
- "Add tests for log level enum mapping"
- "Update README with --verbose flag documentation"
- "Add CHANGELOG entry for verbose flag"
- "Bump package.json minor version"
- "Add lint rule blocking direct console usage"
- "Run lint and fix new violations"
- "Add CLI integration test for --verbose end-to-end"
- "Add fixture file for verbose log capture"
- "Document verbose output format in docs/cli.md"
- "Add jsdoc for new logger API"
- "Verify all existing tests pass with verbose disabled"
- "Add backward-compat test for legacy quiet behavior"
- "Add edge-case test for repeated --verbose flags"
- "Add edge-case test for --verbose with --silent collision"
- "Update help text to list --verbose flag"
- "Add usage example to docs/quickstart.md"
- "Verify CI matrix runs on Node 18 and 20"
- "Add npm script for verbose mode debugging"
- "Run security audit on logger dependency tree"
- "Verify no PII leaks in verbose log output"
- "Add manual test checklist to CONTRIBUTING.md"
- "Update .gitignore for verbose log dump files"
- "Add cleanup logic for stale verbose logs"
- "Add unit test for cleanup logic"
- "Verify exit code on verbose mode error"
- "Add stderr routing for warnings in verbose"
- "Add timestamp prefix in verbose log lines"
- "Add test for timestamp format"
- "Update troubleshooting guide with verbose flag"
- "Verify version sync across all docs"
- "Add benchmark for verbose log capture overhead"
- "Document overhead methodology in PERF.md"
---
# Synthetic plan run premium-2 — Add --verbose flag to CLI (PARKED)
Companion to `profile-plan-run-premium-1.md`. Same `premium` profile,
simulated as a second run with two terminal steps replaced
(emission cost / benchmark methodology → capture overhead / overhead
methodology) to model intra-tier variance.
## Intra-tier Jaccard
Premium-1 vs premium-2 share 38/40 step titles; union = 42.
Jaccard = 38/42 ≈ 0.905 — matches the existing baseline plan-run-A vs
plan-run-B floor (≥ 0.833 in plan-determinism.test.mjs).
## Cross-tier Jaccard rationale
Pairing premium fixtures (40 steps) against economy fixtures (30 steps)
yields ~30 shared titles (after string-normalisering), with union ~40.
Conservative cross-tier Jaccard ≈ 30/40 = 0.75 in this synthetic — but
the calibration file pins a *more conservative* floor (0.55) per
research/02 to absorb empirical variance once real runs replace these
fixtures. See `profile-jaccard-calibration.md` for threshold derivation.