From e9dd06205e03071234be43542920bc7f17929ec6 Mon Sep 17 00:00:00 2001 From: Bill Date: Thu, 26 Feb 2026 14:57:16 -0700 Subject: [PATCH] Add native decomposition retry telemetry path (sprint 240) --- docs/constructive_editing_runtime_plan.md | 6 ++- ...rator_readiness_gap_registry_2026-02-26.md | 2 +- docs/progress_log_2026-02-26.md | 12 +++++ .../sprint240_execution_tracker_2026-02-26.md | 31 +++++++++++ editor/src/Sprint240IntegrationSummary.h | 6 +++ sprint240_plan.md | 11 ++++ tools/mcp/run_sprint_taskitem_pipeline.sh | 52 +++++++++++++++++++ 7 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 docs/sprint240_execution_tracker_2026-02-26.md create mode 100644 editor/src/Sprint240IntegrationSummary.h create mode 100644 sprint240_plan.md diff --git a/docs/constructive_editing_runtime_plan.md b/docs/constructive_editing_runtime_plan.md index d2c1ab2..7be4402 100644 --- a/docs/constructive_editing_runtime_plan.md +++ b/docs/constructive_editing_runtime_plan.md @@ -150,7 +150,7 @@ Parallel planning tranche (active): - `logs/taskitem_runs/TEST_ONLY_spec_planning_baseline_20260226/deterministic_spec_readiness.json` Planning runtime controls (active): -- `sprint232_plan.md` to `sprint239_plan.md` +- `sprint232_plan.md` to `sprint240_plan.md` - semantic bridge + intake augmentation + requirement injection + expansion gating are wired into: - `tools/mcp/run_sprint_taskitem_pipeline.sh` - current policy default is native-first semantic fallback: @@ -165,3 +165,7 @@ Planning runtime controls (active): - native reason enrichment can inject semantic tags into native task reasons: - `WSTONE_NATIVE_REASON_ENRICHMENT` - `native_reason_enrichment` +- native decomposition retry path can run second-pass task generation: + - `WSTONE_NATIVE_DECOMP_RETRY` + - `WSTONE_NATIVE_DECOMP_TARGET_MIN_TASKS` + - `native_decomposition_retry` diff --git a/docs/generator_readiness_gap_registry_2026-02-26.md b/docs/generator_readiness_gap_registry_2026-02-26.md index 6b84afe..ce2f2c1 100644 --- a/docs/generator_readiness_gap_registry_2026-02-26.md +++ b/docs/generator_readiness_gap_registry_2026-02-26.md @@ -46,7 +46,7 @@ This is the canonical dated registry for "not production-ready" generator gaps. | GR-017 | Full-stack contract propagation gap | `docs/gap_hunt_fullstack_multifile_2026-02-26.md`, `logs/taskitem_runs/challenging_fullstack_multifile_20260226_r5/fullstack_contract_closure.json` | `partial` | Full-stack contract packet + strict validation added in benchmark orchestration and summary aggregation. Contract invalid rate is `0%` on valid catalog, but cross-layer semantic consistency is not yet equivalence-verified. | Semantic propagation verifier sprint | | GR-018 | Performance/security/rollout constrained refactor enforcement gap | `docs/gap_hunt_fullstack_multifile_2026-02-26.md`, `logs/taskitem_runs/challenging_fullstack_multifile_20260226_r5/results.jsonl` | `partial` | Hard checks now enforce migration rollback + data-loss policy, security deny-by-default, SLO p95 presence, and rollout staged+abort policy. Enforcement is contract-level; generator capability under these constraints is still weak in C++ AB path. | Constraint-aware generation follow-up | | GR-019 | Parity-blocked readiness load (gating without capability closure) | `logs/taskitem_runs/challenging_fullstack_multifile_20260226_r7/summary.json`, `logs/taskitem_runs/challenging_subset_prod_20260226_r7/summary.json`, `docs/sprint225_227_execution_tracker_2026-02-26.md` | `partial` | Sprint 225-227 reduced blocked parity load from `6` to `0` on both tracked hard catalogs while keeping unresolved divergence at `0`. This closes immediate safety debt for current corpora, but robustness is still contingent on pattern-driven repair classes. | Generalize repairs beyond queue-shaped transpile outputs | -| GR-020 | Semantic fallback overuse masks weak native decomposition | `logs/taskitem_runs/TEST_ONLY_sprint236_semantic_fallback_audit_20260226/semantic_fallback_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint237_semantic_fallback_gate_fail_20260226/semantic_fallback_budget_gate.json`, `logs/taskitem_runs/TEST_ONLY_sprint238_native_gate_fail_20260226.json`, `logs/taskitem_runs/TEST_ONLY_sprint239_semantic_fallback_audit_20260226/semantic_fallback_summary.json`, `docs/sprint236_execution_tracker_2026-02-26.md`, `docs/sprint237_execution_tracker_2026-02-26.md`, `docs/sprint238_execution_tracker_2026-02-26.md`, `docs/sprint239_execution_tracker_2026-02-26.md` | `partial` | Sprint 236 added deterministic fallback-gap auditing with tool + constraint metadata. Sprint 237 added fallback-budget hard gate (`max-fallback-rate`) and produced expected fail/pass artifacts. Sprint 238 added native decomposition hard gate in pipeline (`min task count`, `min semantic signal count`) so weak native generation can be blocked before fallback masking. Sprint 239 added native reason enrichment and shifted root-cause mix in A/B slice (`native_semantic_signal_count 0 -> 6`), but native task depth remains shallow (`2`), so fallback still triggers. | Native decomposition task-depth upgrade (increase native task granularity beyond 2) | +| GR-020 | Semantic fallback overuse masks weak native decomposition | `logs/taskitem_runs/TEST_ONLY_sprint236_semantic_fallback_audit_20260226/semantic_fallback_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint237_semantic_fallback_gate_fail_20260226/semantic_fallback_budget_gate.json`, `logs/taskitem_runs/TEST_ONLY_sprint238_native_gate_fail_20260226.json`, `logs/taskitem_runs/TEST_ONLY_sprint239_semantic_fallback_audit_20260226/semantic_fallback_summary.json`, `logs/taskitem_runs/TEST_ONLY_sprint240_retry_20260226_145631/00_summary.json`, `docs/sprint236_execution_tracker_2026-02-26.md`, `docs/sprint237_execution_tracker_2026-02-26.md`, `docs/sprint238_execution_tracker_2026-02-26.md`, `docs/sprint239_execution_tracker_2026-02-26.md`, `docs/sprint240_execution_tracker_2026-02-26.md` | `partial` | Sprint 236 added deterministic fallback-gap auditing with tool + constraint metadata. Sprint 237 added fallback-budget hard gate (`max-fallback-rate`) and produced expected fail/pass artifacts. Sprint 238 added native decomposition hard gate in pipeline (`min task count`, `min semantic signal count`) so weak native generation can be blocked before fallback masking. Sprint 239 added native reason enrichment and improved semantic signal density (`0 -> 6`). Sprint 240 added native decomposition retry with explicit minimum-task policy; on current sample retry attempted but did not improve depth (`2 -> 2`). | Native decomposition task-depth upgrade (increase native task granularity beyond 2) | ## What Was Covered Today (Sprints 175-184) diff --git a/docs/progress_log_2026-02-26.md b/docs/progress_log_2026-02-26.md index 766f8d3..f143191 100644 --- a/docs/progress_log_2026-02-26.md +++ b/docs/progress_log_2026-02-26.md @@ -173,3 +173,15 @@ - `logs/taskitem_runs/TEST_ONLY_sprint239_reason_enrich_20260226_145443/00_summary.json` - Dated fallback audit for this slice: - `logs/taskitem_runs/TEST_ONLY_sprint239_semantic_fallback_audit_20260226/semantic_fallback_summary.json` + +## Sprint 240 Added (Same Day) + +- Added native decomposition retry path: + - `WSTONE_NATIVE_DECOMP_RETRY` + - `WSTONE_NATIVE_DECOMP_TARGET_MIN_TASKS` + - summary packet: `native_decomposition_retry` +- A/B smoke artifacts: + - `logs/taskitem_runs/TEST_ONLY_sprint240_retry_20260226_145631/00_summary.json` + - `logs/taskitem_runs/TEST_ONLY_sprint240_retry_20260226_145632/00_summary.json` +- Current measured result: + - retry attempted but not applied (`2 -> 2` tasks), confirming remaining native decomposition depth gap. diff --git a/docs/sprint240_execution_tracker_2026-02-26.md b/docs/sprint240_execution_tracker_2026-02-26.md new file mode 100644 index 0000000..ff210e7 --- /dev/null +++ b/docs/sprint240_execution_tracker_2026-02-26.md @@ -0,0 +1,31 @@ +# Sprint 240 Execution Tracker - 2026-02-26 + +## Scope +- `sprint240_plan.md` + +## Implemented + +Pipeline updates in `tools/mcp/run_sprint_taskitem_pipeline.sh`: +- Added `WSTONE_NATIVE_DECOMP_RETRY` (default `1`). +- Added `WSTONE_NATIVE_DECOMP_TARGET_MIN_TASKS` (default `5`). +- Added retry artifacts when attempted: + - `02aa_generate_taskitems_retry_raw.ndjson.json` + - `02aa_generate_taskitems_retry.json` +- Added summary packet: + - `native_decomposition_retry` + +## Baseline A/B Smoke + +- retry enabled run: + - `logs/taskitem_runs/TEST_ONLY_sprint240_retry_20260226_145631/00_summary.json` +- retry disabled run: + - `logs/taskitem_runs/TEST_ONLY_sprint240_retry_20260226_145632/00_summary.json` + +Observed behavior on current sample: +- retry attempted: `true` +- retry applied: `false` +- `initial_task_count=2`, `retry_task_count=2` + +## Explicit Completion Signal + +- Sprint 240: `DONE` (retry path implemented + telemetry verified) diff --git a/editor/src/Sprint240IntegrationSummary.h b/editor/src/Sprint240IntegrationSummary.h new file mode 100644 index 0000000..9a80be2 --- /dev/null +++ b/editor/src/Sprint240IntegrationSummary.h @@ -0,0 +1,6 @@ +#pragma once + +// Sprint 240 integration summary: +// - Added native decomposition retry path with decomposition-min-task policy prompt. +// - Retry is applied only when it improves native task count. +// - Pipeline now emits native decomposition retry telemetry. diff --git a/sprint240_plan.md b/sprint240_plan.md new file mode 100644 index 0000000..cfb0ab7 --- /dev/null +++ b/sprint240_plan.md @@ -0,0 +1,11 @@ +# Sprint 240 Plan: Native Decomposition Retry Path + +## Goal +Attempt a deterministic second-pass native decomposition before fallback expansion when initial native task depth is below target. + +## Steps +- Step 2243: Add configurable native decomposition retry toggle and target minimum task count. +- Step 2244: Retry `whetstone_generate_taskitems` with explicit decomposition constraint. +- Step 2245: Apply retry result only when it improves native task count. +- Step 2246: Emit retry telemetry in pipeline summary. +- Step 2247: Add `Sprint240IntegrationSummary.h` and execution tracker. diff --git a/tools/mcp/run_sprint_taskitem_pipeline.sh b/tools/mcp/run_sprint_taskitem_pipeline.sh index 8e6837c..173b574 100755 --- a/tools/mcp/run_sprint_taskitem_pipeline.sh +++ b/tools/mcp/run_sprint_taskitem_pipeline.sh @@ -37,6 +37,8 @@ NATIVE_DECOMP_HARD_GATE="${WSTONE_NATIVE_DECOMP_HARD_GATE:-0}" NATIVE_TASK_MIN_COUNT="${WSTONE_NATIVE_TASK_MIN_COUNT:-0}" NATIVE_SEMANTIC_SIGNAL_MIN="${WSTONE_NATIVE_SEMANTIC_SIGNAL_MIN:-0}" NATIVE_REASON_ENRICHMENT="${WSTONE_NATIVE_REASON_ENRICHMENT:-1}" +NATIVE_DECOMP_RETRY="${WSTONE_NATIVE_DECOMP_RETRY:-1}" +NATIVE_DECOMP_TARGET_MIN_TASKS="${WSTONE_NATIVE_DECOMP_TARGET_MIN_TASKS:-5}" CAPABILITY_SIGNALS_JSON="${WSTONE_CAPABILITY_SIGNALS_JSON:-}" if [[ -z "$CAPABILITY_SIGNALS_JSON" ]]; then CAPABILITY_SIGNALS_JSON='{}' @@ -90,6 +92,7 @@ SEMANTIC_TASK_EXPANSION_JSON='{}' SEMANTIC_GATE_JSON='{}' NATIVE_DECOMP_GATE_JSON='{}' NATIVE_REASON_ENRICHMENT_JSON='{}' +NATIVE_DECOMP_RETRY_JSON='{}' if [[ "$SEMANTIC_PLANNING_BRIDGE" == "1" ]]; then python3 "$ROOT_DIR/tools/mcp/markdown_to_semantic_annotations.py" \ --spec "$INPUT_FILE" \ @@ -292,6 +295,53 @@ if [[ "$(printf '%s' "$GEN_JSON" | jq -r '.success // false')" != "true" ]]; the fi TASKS="$(printf '%s' "$GEN_JSON" | jq '.tasks')" +native_task_count_initial="$(printf '%s' "$TASKS" | jq 'length')" +if [[ "$NATIVE_DECOMP_RETRY" == "1" && "$native_task_count_initial" -lt "$NATIVE_DECOMP_TARGET_MIN_TASKS" ]]; then + RETRY_REQS="$(jq -nc --argjson base "$NORMALIZED_REQS" --arg min "$NATIVE_DECOMP_TARGET_MIN_TASKS" ' + $base + [{ + requirementId: "native-decomp-min-task-count", + kind: "constraint", + normalizedText: ("native decomposition policy: produce at least " + $min + " concrete taskitems with deterministic execution contracts"), + anchor: "pipeline_native_retry", + sourceLine: 0, + ambiguous: false + }] + ')" + RETRY_GEN_ARGS="$(jq -nc --argjson nr "$RETRY_REQS" --argjson cf "$CONFLICTS" --arg strict "$STRICT_EXECUTION_CONTRACT" \ + '{normalizedRequirements:$nr,conflicts:$cf,strictExecutionContract:($strict == "1")}')" + RETRY_GEN_RESP_RAW="$(call_tool "whetstone_generate_taskitems" "$RETRY_GEN_ARGS")" + printf '%s\n' "$RETRY_GEN_RESP_RAW" > "$OUT_DIR/02aa_generate_taskitems_retry_raw.ndjson.json" + RETRY_GEN_JSON="$(extract_tool_text_json "$RETRY_GEN_RESP_RAW")" + printf '%s\n' "$RETRY_GEN_JSON" > "$OUT_DIR/02aa_generate_taskitems_retry.json" + retry_success="$(printf '%s' "$RETRY_GEN_JSON" | jq -r '.success // false')" + retry_task_count="$(printf '%s' "$RETRY_GEN_JSON" | jq '.tasks | length')" + if [[ "$retry_success" == "true" && "$retry_task_count" -gt "$native_task_count_initial" ]]; then + GEN_JSON="$RETRY_GEN_JSON" + TASKS="$(printf '%s' "$GEN_JSON" | jq '.tasks')" + NATIVE_DECOMP_RETRY_JSON="$(jq -nc \ + --argjson attempted true \ + --argjson applied true \ + --argjson initial_task_count "$native_task_count_initial" \ + --argjson retry_task_count "$retry_task_count" \ + --argjson target_min_task_count "$NATIVE_DECOMP_TARGET_MIN_TASKS" \ + '{attempted:$attempted, applied:$applied, initial_task_count:$initial_task_count, retry_task_count:$retry_task_count, target_min_task_count:$target_min_task_count}')" + else + NATIVE_DECOMP_RETRY_JSON="$(jq -nc \ + --argjson attempted true \ + --argjson applied false \ + --argjson initial_task_count "$native_task_count_initial" \ + --argjson retry_task_count "$retry_task_count" \ + --argjson target_min_task_count "$NATIVE_DECOMP_TARGET_MIN_TASKS" \ + '{attempted:$attempted, applied:$applied, initial_task_count:$initial_task_count, retry_task_count:$retry_task_count, target_min_task_count:$target_min_task_count}')" + fi +else + NATIVE_DECOMP_RETRY_JSON="$(jq -nc \ + --argjson attempted false \ + --argjson applied false \ + --argjson initial_task_count "$native_task_count_initial" \ + --argjson target_min_task_count "$NATIVE_DECOMP_TARGET_MIN_TASKS" \ + '{attempted:$attempted, applied:$applied, initial_task_count:$initial_task_count, target_min_task_count:$target_min_task_count}')" +fi if [[ "$NATIVE_REASON_ENRICHMENT" == "1" && -f "$OUT_DIR/01c_semantic_injected_requirements.json" ]]; then TASKS="$(jq -nc \ --argjson tasks "$TASKS" \ @@ -459,6 +509,7 @@ SUMMARY_JSON="$(jq -nc \ --argjson semantic_task_expansion "$SEMANTIC_TASK_EXPANSION_JSON" \ --argjson native_decomposition_gate "$NATIVE_DECOMP_GATE_JSON" \ --argjson native_reason_enrichment "$NATIVE_REASON_ENRICHMENT_JSON" \ + --argjson native_decomposition_retry "$NATIVE_DECOMP_RETRY_JSON" \ --argjson intake "$INTAKE_JSON" \ --argjson generated "$GEN_JSON" \ --argjson queue "$QUEUE_JSON" \ @@ -478,6 +529,7 @@ SUMMARY_JSON="$(jq -nc \ semantic_task_expansion: $semantic_task_expansion, native_decomposition_gate: $native_decomposition_gate, native_reason_enrichment: $native_reason_enrichment, + native_decomposition_retry: $native_decomposition_retry, intake: { success: ($intake.success // false), normalized_requirement_count: (($intake.normalizedRequirements // [])|length),