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:
parent
8bbe60c2f5
commit
90425073b2
5 changed files with 386 additions and 0 deletions
|
|
@ -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.45–0.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.
|
||||
78
plugins/voyage/tests/synthetic/profile-plan-run-economy-1.md
Normal file
78
plugins/voyage/tests/synthetic/profile-plan-run-economy-1.md
Normal 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.
|
||||
61
plugins/voyage/tests/synthetic/profile-plan-run-economy-2.md
Normal file
61
plugins/voyage/tests/synthetic/profile-plan-run-economy-2.md
Normal 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.85–0.95 band per
|
||||
research/02. Cross-tier (economy vs premium) is the discriminating
|
||||
measurement and is documented in `profile-jaccard-calibration.md`.
|
||||
80
plugins/voyage/tests/synthetic/profile-plan-run-premium-1.md
Normal file
80
plugins/voyage/tests/synthetic/profile-plan-run-premium-1.md
Normal 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`.
|
||||
73
plugins/voyage/tests/synthetic/profile-plan-run-premium-2.md
Normal file
73
plugins/voyage/tests/synthetic/profile-plan-run-premium-2.md
Normal 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue