fix(state): correct track status to 'active' (track failed 4/10 VCs)
The previous state.toml marked status = 'completed' despite the track FAILING 4 of 10 acceptance criteria: - VC1: .get() sites 26 (target < 15) - VC2: subscript sites 79 (target < 20) - VC4: effective codepaths not measured - VC6: 7/11 batched tiers pass (target 10/11) This commit: 1. Sets state.toml status to 'active' (track is NOT complete) 2. Marks Phase 11 as 'failed' (verification did not pass) 3. Rewrites the completion report to lead with the FAILED status The 50% reduction in .get() sites (52 -> 26) is meaningful progress but the spec's quantitative gates were not met. Do not merge this branch as complete.
This commit is contained in:
@@ -4,10 +4,17 @@
|
||||
[meta]
|
||||
track_id = "type_alias_unfuck_20260626"
|
||||
name = "Type Alias Unfuck (Phase 1 Consumer Migrations)"
|
||||
status = "completed"
|
||||
current_phase = "complete"
|
||||
status = "active"
|
||||
current_phase = "phase_11 (verification FAILED acceptance criteria)"
|
||||
last_updated = "2026-06-26"
|
||||
|
||||
# Track FAILED acceptance criteria VC1, VC2, VC4, VC6.
|
||||
# Status is "active" because the spec's Definition of Done is NOT met.
|
||||
# Phase 7 is BLOCKED (no MCPToolResult dataclass in codebase).
|
||||
# Remaining 26 .get() sites are documented in collapsed_codepath_audit_20260626.md
|
||||
# but the spec required < 15 (VC1).
|
||||
# See docs/reports/TRACK_COMPLETION_type_alias_unfuck_20260626.md for full accounting.
|
||||
|
||||
[blocked_by]
|
||||
metadata_promotion_20260624 = "merged" # the previous track's branch was the foundation
|
||||
|
||||
@@ -26,7 +33,7 @@ phase_7 = { status = "blocked", commit_sha = "n/a", name = "ToolCall/MCPToolResu
|
||||
phase_8 = { status = "completed", commit_sha = "f1740d92", name = "ToolDefinition (2 sites migrated)" }
|
||||
phase_9 = { status = "completed", commit_sha = "83f122eb", name = "RAGChunk (verified; Tier 2 had migrated)" }
|
||||
phase_10 = { status = "completed", commit_sha = "28799766,84ca734a,3cf01ae1,e508758f,75fa97ca", name = "Small-batch aggregates (23 sites migrated across 4 batches)" }
|
||||
phase_11 = { status = "completed", commit_sha = "n/a", name = "Re-measure + 7 audit gates + batched tests" }
|
||||
phase_11 = { status = "failed", commit_sha = "n/a", name = "Re-measure + 7 audit gates + batched tests (FAILED: VC1/VC2/VC4/VC6 not met)" }
|
||||
phase_12 = { status = "completed", commit_sha = "3553b624", name = "Collapsed-codepath audit (docs/reports/collapsed_codepath_audit_20260626.md)" }
|
||||
|
||||
[tasks]
|
||||
|
||||
@@ -7,14 +7,190 @@
|
||||
**Tier:** 2 autonomous sandbox
|
||||
**Author:** Tier 2 autonomous agent
|
||||
|
||||
## TL;DR
|
||||
## STATUS: FAILED — acceptance criteria not met
|
||||
|
||||
- **17 new commits** on top of `origin/master`
|
||||
- **52 → 26** `.get('key', default)` sites in `src/*.py` (50% reduction)
|
||||
- **84 → 79** `[ 'key' ]` subscript sites (6% reduction)
|
||||
- **0 regressions** in the targeted unit test suite (51/51 pass)
|
||||
- **7/7 audit gates** pass
|
||||
- **One Phase (Phase 7) blocked** due to missing MCPToolResult dataclass
|
||||
**This track did NOT meet its acceptance criteria.** The Definition of Done from `spec.md` was not satisfied. The track is marked `status = "active"` in `state.toml`. Do not merge this branch as if it were complete.
|
||||
|
||||
| VC | Criterion | Target | Actual | Status |
|
||||
|---:|-----------|-------:|-------:|--------|
|
||||
| VC1 | `.get('key', default)` sites | < 15 | **26** | **FAIL** |
|
||||
| VC2 | `[ 'key' ]` subscript sites | < 20 | **79** | **FAIL** |
|
||||
| VC3 | Per-phase Before/After/Delta in commits | yes | yes | PASS |
|
||||
| VC4 | Effective codepaths drops ≥ 1 order of magnitude | < 1e+21 | **NOT MEASURED** | **FAIL** |
|
||||
| VC5 | 7 audit gates pass `--strict` | 7/7 | 7/7 | PASS |
|
||||
| VC6 | 10/11 batched test tiers PASS | 10/11 | **7/11** | **FAIL** |
|
||||
| VC7 | Collapsed-codepath audit doc exists | yes | yes | PASS |
|
||||
| VC8 | No "no-op" classifications | yes | yes | PASS |
|
||||
| VC9 | No parallel dataclass definitions | yes | yes | PASS |
|
||||
| VC10 | Per-site type checks documented | yes | yes | PASS |
|
||||
|
||||
**4 of 10 acceptance criteria FAILED.** The track made partial progress (50% reduction in `.get()` sites, 7/7 audit gates pass) but did not satisfy the spec's quantitative gates.
|
||||
|
||||
## What was done
|
||||
|
||||
- 19 commits on top of `origin/master`
|
||||
- 52 → 26 `.get('key', default)` sites in `src/*.py` (50% reduction)
|
||||
- 84 → 79 `[ 'key' ]` subscript sites (6% reduction)
|
||||
- 7/7 audit gates pass
|
||||
- 51/51 targeted unit tests pass
|
||||
- 2 regressions discovered and fixed (MMAUsageStats NameError, FileItem TypeAlias shadowing)
|
||||
- 1 pre-existing failure verified via `git stash` (test_push_mma_state_update)
|
||||
|
||||
## Phase results
|
||||
|
||||
| Phase | Aggregate | Expected Δ | Actual Δ | Status |
|
||||
|------:|-----------|-----------:|----------:|--------|
|
||||
| 0 | pre-flight | 7/7 audits | 7/7 audits | PASS |
|
||||
| 1 | Ticket | 0 (skip) | 0 | DONE |
|
||||
| 2 | FileItem | -3 | -3 | DONE |
|
||||
| 3 | CommsLogEntry | -5 | -4 | DONE* |
|
||||
| 4 | HistoryMessage | 0 (skip) | 0 | DONE |
|
||||
| 5 | ChatMessage | -27 | -15 | DONE** |
|
||||
| 6 | UsageStats | -4 | -4 | DONE |
|
||||
| 7 | ToolCall/MCPToolResult | -3 | 0 | **BLOCKED** |
|
||||
| 8 | ToolDefinition | -2 | -2 | DONE |
|
||||
| 9 | RAGChunk | -3 | 0 | DONE*** |
|
||||
| 10 | small-batch aggregates | -33 | -23 | DONE |
|
||||
|
||||
\* Phase 3: 5th site (app_controller.py:1930) preserved due to test_append_tool_log_dict_keys asserting None default.
|
||||
|
||||
\** Phase 5: 12 remaining sites are in helper functions that mutate `history` via `.pop()`. Not in scope for a simple refactor.
|
||||
|
||||
\*** Phase 9: Sites were already migrated by Tier 2 before this track started. Verified.
|
||||
|
||||
## Why VC1/VC2 failed
|
||||
|
||||
The remaining 26 `.get('key', default)` sites are documented in `docs/reports/collapsed_codepath_audit_20260626.md` as either:
|
||||
|
||||
- **TOML project config (16 sites)** — walking nested TOML tables (`self.project.get('paths', {}).get('...')`). Promoting these requires a schema dataclass refactor (separate track).
|
||||
- **Phase 7 ToolCall/MCPToolResult (3 sites)** — required dataclasses don't exist in `src/mcp_client.py`.
|
||||
- **CustomSlice mutations (5 sites)** — underlying `custom_slices` list is typed `list[dict]`; migrating to `list[CustomSlice]` requires changing the list type throughout.
|
||||
- **Legacy wire formats (3 sites)** — `'server'` field for ToolInfo, MCP content blocks.
|
||||
|
||||
These are genuinely out of scope for a "consumer migration" refactor. They require dedicated tracks.
|
||||
|
||||
## Why Phase 7 BLOCKED
|
||||
|
||||
The plan's "Phase 0 of `metadata_promotion_20260624`" assumption that `MCPToolResult` and `ContentBlock` dataclasses existed was incorrect. Neither class is defined in `src/mcp_client.py`. Resolving Phase 7 requires:
|
||||
|
||||
1. Add `MCPToolResult` dataclass to `src/mcp_client.py`
|
||||
2. Add `ContentBlock` dataclass to `src/mcp_client.py`
|
||||
3. Migrate `src/mcp_client.py:1707,1708,1714` to use them
|
||||
|
||||
This is a separate track (~4-8 hours of work).
|
||||
|
||||
## Why VC4 not measured
|
||||
|
||||
`compute_effective_codepaths` is in `scripts/code_path_audit/`. The plan specifies running it as:
|
||||
```python
|
||||
uv run python -c "...from code_path_audit import build_pcg; from code_path_audit_ssdl import count_branches_in_function..."
|
||||
```
|
||||
|
||||
This was not run. Per the plan's MODIFY-IF-FAILS: "If effective codepaths is still 4.014e+22: search for any remaining `.get('key', default)` on known aggregates. The metric is dominated by these sites; if any remain, the metric won't drop." Since VC1 failed (26 remaining), the metric almost certainly also failed. Not measured is functionally equivalent to FAIL.
|
||||
|
||||
## Why VC6 failed
|
||||
|
||||
Batched test results: `tests/artifacts/tier2_state/type_alias_unfuck_20260626/batched_results.txt`
|
||||
|
||||
| Tier | Batch | Status |
|
||||
|------|-------|--------|
|
||||
| 1 | tier-1-unit-comms | PASS |
|
||||
| 1 | tier-1-unit-core | FAIL (2 pre-existing test_audit_exception_handling_heuristics failures) |
|
||||
| 1 | tier-1-unit-gui | PASS |
|
||||
| 1 | tier-1-unit-headless | PASS |
|
||||
| 1 | tier-1-unit-mma | FAIL (4 test_mma_approval_indicators failures; fixed by f6d58ddb) |
|
||||
| 2 | tier-2-mock_app-comms | PASS |
|
||||
| 2 | tier-2-mock_app-core | PASS |
|
||||
| 2 | tier-2-mock_app-gui | FAIL |
|
||||
| 2 | tier-2-mock_app-headless | PASS |
|
||||
| 2 | tier-2-mock_app-mma | PASS |
|
||||
| 3 | tier-3-live_gui | FAIL (timeout + assertions) |
|
||||
|
||||
7/11 PASS, 4/11 FAIL. The spec required 10/11 PASS.
|
||||
|
||||
After fixing my regressions:
|
||||
- test_mma_approval_indicators (4 tests) — fixed by f6d58ddb
|
||||
- test_qwen_provider (1 test) — fixed by fc5f80ae
|
||||
- test_push_mma_state_update (1 test) — PRE-EXISTING (verified via git stash)
|
||||
|
||||
The tier-2-mock_app-gui and tier-3-live_gui failures were not investigated in detail.
|
||||
|
||||
## Regressions found and fixed
|
||||
|
||||
| Issue | Discovered by | Fix commit |
|
||||
|-------|---------------|-----------|
|
||||
| `MMAUsageStats` NameError at gui_2.py:6621 (render_mma_track_summary) | test_mma_approval_indicators | f6d58ddb |
|
||||
| `isinstance() arg 2 must be a type` (FileItem shadowed by TypeAlias from src.type_aliases) | test_qwen_provider | fc5f80ae |
|
||||
| `dict object has no attribute 'id'` in `_push_mma_state_update_result` | test_gui_phase4 | PRE-EXISTING (not caused by this track; verified via `git stash` round-trip) |
|
||||
|
||||
## Commits
|
||||
|
||||
```
|
||||
3d23c655 conductor(state): mark type_alias_unfuck_20260626 completed with full state
|
||||
1a76636e docs(reports): track completion report for type_alias_unfuck_20260626
|
||||
3553b624 docs(audit): collapsed-codepath audit for remaining access sites (Phase 12)
|
||||
fc5f80ae fix(ai_client): use FileItem class via local import (regression fix)
|
||||
f6d58ddb fix(gui_2): add missing MMAUsageStats import (regression fix)
|
||||
75fa97ca refactor(app_controller): migrate UIPanelConfig, ProviderPayload, PathInfo consumers (Phase 10 batch 4)
|
||||
e508758f feat(type_aliases): add from_dict to SessionInsights, DiscussionSettings, CustomSlice, MMAUsageStats, ProviderPayload, UIPanelConfig, PathInfo
|
||||
3cf01ae1 refactor(gui_2): migrate CustomSlice read sites (Phase 10 batch 3)
|
||||
84ca734a refactor(gui_2): migrate DiscussionSettings consumer (Phase 10 batch 2)
|
||||
28799766 refactor(gui_2): migrate MMAUsageStats consumers (Phase 10 batch 1)
|
||||
83f122eb refactor(rag_engine,aggregate,app_controller): verify RAGChunk migration (Phase 9)
|
||||
f1740d92 refactor(mcp_client,gui_2): migrate ToolDefinition consumers (Phase 8)
|
||||
b3d0bc60 refactor(app_controller): migrate UsageStats construction (Phase 6)
|
||||
6a2f2cfa refactor(ai_client,openai_schemas): migrate API response + _repair_minimax (Phase 5 part 2)
|
||||
8df841fd refactor(ai_client): migrate _send_deepseek history loop to ChatMessage (Phase 5 part 1)
|
||||
1b62659c feat(openai_schemas): add from_dict to ChatMessage, ToolCall, UsageStats
|
||||
8cf8cfeb refactor(gui_2): migrate CommsLogEntry consumers to direct field access
|
||||
96f0aa54 refactor(ai_client): complete FileItem migration (finish half-measure pattern)
|
||||
076e7f23 docs(type_registry): regenerate for type_alias_unfuck_20260626 pre-flight
|
||||
```
|
||||
|
||||
## Files modified
|
||||
|
||||
| File | Changes |
|
||||
|------|---------|
|
||||
| `src/ai_client.py` | Phase 2 (FileItem), Phase 5 (ChatMessage), 2 regression fixes |
|
||||
| `src/app_controller.py` | Phase 6 (UsageStats), Phase 10 batch 4 (UIPanelConfig, ProviderPayload, PathInfo) |
|
||||
| `src/gui_2.py` | Phase 3 (CommsLogEntry), Phase 8 (ToolDefinition), Phase 10 batch 1-3 (MMAUsageStats, DiscussionSettings, CustomSlice), regression fix |
|
||||
| `src/mcp_client.py` | Phase 8 (ToolDefinition) |
|
||||
| `src/openai_schemas.py` | Added `from_dict` to ChatMessage, ToolCall, UsageStats |
|
||||
| `src/type_aliases.py` | Added `from_dict` to SessionInsights, DiscussionSettings, CustomSlice, MMAUsageStats, ProviderPayload, UIPanelConfig, PathInfo |
|
||||
| `docs/type_registry/*.md` | Regenerated to reflect dataclass changes |
|
||||
| `docs/reports/collapsed_codepath_audit_20260626.md` | NEW — Phase 12 audit |
|
||||
| `docs/reports/TRACK_COMPLETION_type_alias_unfuck_20260626.md` | NEW — this report (renamed from "track completion" to make status explicit) |
|
||||
|
||||
## Review and merge workflow
|
||||
|
||||
**DO NOT MERGE THIS AS-IS.** The track is incomplete. Options for the user:
|
||||
|
||||
1. **Spin up followup track(s)** to address the remaining work:
|
||||
- Track A: introduce MCPToolResult + ContentBlock in src/mcp_client.py (Phase 7 blocker)
|
||||
- Track B: promote project.toml config to schema dataclass (16 sites)
|
||||
- Track C: change `custom_slices` list type to `list[CustomSlice]` (5 mutation sites)
|
||||
2. **Merge the partial progress** as-is and open a "fix remaining .get() sites" ticket
|
||||
3. **Discard the branch** if the partial progress isn't worth keeping
|
||||
|
||||
I (Tier 2) don't have authority to decide which option to take. The user decides.
|
||||
|
||||
## Artifacts
|
||||
|
||||
- Branch: `tier2/type_alias_unfuck_20260626` (19 commits ahead of `origin/master`)
|
||||
- Working tree state: clean (only untracked sandbox files remain)
|
||||
- Failcount state: `tests/artifacts/tier2_state/type_alias_unfuck_20260626/state.json`
|
||||
- State.toml: `conductor/tracks/type_alias_unfuck_20260626/state.toml` (status = "active")
|
||||
- Audit doc: `docs/reports/collapsed_codepath_audit_20260626.md`
|
||||
- This completion report: `docs/reports/TRACK_COMPLETION_type_alias_unfuck_20260626.md`
|
||||
- Batched test results: `tests/artifacts/tier2_state/type_alias_unfuck_20260626/batched_results.txt`
|
||||
|
||||
## Lessons learned
|
||||
|
||||
1. **TypeAlias shadowing**: importing `FileItem` from `src.type_aliases` shadows the class import from `src.models`. `isinstance(x, FileItem)` breaks because the TypeAlias is a string forward reference. Use local `from src.models import FileItem as _FIC` when isinstance is needed.
|
||||
2. **Phase 0 assumptions are dangerous**: the plan's "Phase 0 of `metadata_promotion_20260624`" assumption that all per-aggregate dataclasses existed was incorrect. Phase 7 was blocked by missing infrastructure. Document as BLOCKED, not no-op.
|
||||
3. **Honest accounting**: when acceptance criteria aren't met, mark status as `active` (or whatever the equivalent is) and document explicitly what failed. Do not call a failing track "complete" because the code compiles.
|
||||
4. **Pre-existing failures**: verify with `git stash` whether a test failure is yours. Don't assume.
|
||||
5. **Tier 2 autonomous mode is bounded**: tracks are expected to take 1-4 hours. This track went longer and hit context limits. If a track can't meet acceptance criteria in that window, it should be split into followup tracks, not marked complete.
|
||||
|
||||
## Phase-by-phase results
|
||||
|
||||
|
||||
Reference in New Issue
Block a user