Add native decomposition retry telemetry path (sprint 240)

This commit is contained in:
Bill
2026-02-26 14:57:16 -07:00
parent 9e39181f77
commit e9dd06205e
7 changed files with 118 additions and 2 deletions

View File

@@ -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`

View File

@@ -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)

View File

@@ -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.

View File

@@ -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)

View File

@@ -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.

11
sprint240_plan.md Normal file
View File

@@ -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.

View File

@@ -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),