Skip to content

Commit 4de49a3

Browse files
committed
Track timer teardown repair before final v3 release gates
1 parent d3c1d5d commit 4de49a3

5 files changed

Lines changed: 45 additions & 12 deletions

File tree

‎specs/tasks/M13-v3-release/TASK-185.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Provide final dependency, conformance, sanitizer and performance release gates f
1414
- [ ] Require every v3.0 in-scope gate to pass before tagging.
1515

1616
**Dependencies:**
17-
- Blocked by: TASK-180, TASK-181, TASK-182, TASK-183, TASK-184, TASK-199
17+
- Blocked by: TASK-180, TASK-181, TASK-182, TASK-183, TASK-184, TASK-200
1818
- Blocks: None
1919

2020
**Acceptance Criteria:**
@@ -27,7 +27,7 @@ Provide final dependency, conformance, sanitizer and performance release gates f
2727
**Status:** In Progress
2828

2929
**Authorized repair continuation (2026-10-10):** The user instructed that all
30-
remaining failures and missing capabilities be fixed. TASK-186–TASK-199 deliver
30+
remaining failures and missing capabilities be fixed. TASK-186–TASK-200 deliver
3131
those dependencies serially on `v3`; this task remains open in its preserved
3232
worktree until the complete required local release inventory passes on a fresh
3333
package. Preserve earlier repairs, validation findings and unsuccessful receipts.

‎specs/tasks/M14-v3-release-repairs/TASK-199.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
**Dependencies:**
2424
- Blocked by: TASK-198
25-
- Blocks: TASK-185
25+
- Blocks: TASK-200, TASK-185
2626
**Related Requirements:** PRD-V3N-REQ-001 through PRD-V3N-REQ-038 as applicable to the complete public-capability inventory; TASK-185 native-throughput-latency inventory.
2727
**Related Decisions:** DR-V3-001 through DR-V3-008; architecture §5 packaging and validation.
2828
**Status:** Not Started
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
### TASK-200: Repair intermittent timer and executor teardown race
2+
3+
**Milestone:** M14 - v3 local release readiness repairs
4+
**Component:** Concurrency timer ownership and executor teardown
5+
**Estimate:** M
6+
**Branch policy:** Current `v3` → isolated task branch → validated merge into `v3` → cleanup.
7+
**Goal:** Resolve the observed `task_race` TSan teardown failure before the final packaged local inventory.
8+
9+
**Workflow:** Follow `../v3-release-repair-workflow.md`; use the Groundwork identity helper, branch from `v3`, systematic debugging, verified RED/GREEN, validation and finalization. Preserve historical receipts and unrelated worktrees.
10+
11+
**Action Items:**
12+
- [ ] Read TASK-187's unresolved extra finding and immutable receipts at `build/task187-evidence/implementation-ad76a561/build/task187-implementation/tsan-off/extra-task-race-failure.log`, `focused-check.log`, and `base-task-race-identities.json`. The observed failure is `pthread_cond_destroy` versus timer-thread `manual_executor::post`, exit 66; a single equivalent unchanged base comparison passed. Treat this as unresolved intermittent behavior, not a proven production or fixture cause.
13+
- [ ] Identify the timer, callback, task frame and executor lifetime boundary using bounded deterministic interleaving. Add a regression that fails for the demonstrated cause and cleans up all threads/owners even on failure. Do not replace a failing diagnostic with retries, sleeps, longer deadlines or a new suppression.
14+
- [ ] Repair the proven production or fixture ownership boundary while preserving executor borrowing, cancellation, one-shot delivery and timer cleanup contracts. Use the smallest causal change; inspect public/API implications before changing a contract.
15+
- [ ] Execute affected task/timer/resume/cancellation suites under normal, ASan/nonrecovering UBSan and TSan in TLS-off/on, with leak/stack checks and existing suppressions unchanged. Run relevant installed consumers and record assertion counts, RED/GREEN receipts and ownership conclusions.
16+
17+
**Acceptance Criteria:**
18+
- A meaningful deterministic regression demonstrates and closes the observed race with exactly-once outcomes and safe executor/timer teardown.
19+
- Required affected local sanitizer lanes and public consumers pass; no required check is waived and no race suppression is added.
20+
- Groundwork validation passes, evidence and tracking are updated, and the task is merged/cleaned before TASK-185 resumes.
21+
22+
**Dependencies:**
23+
- Blocked by: TASK-199
24+
- Blocks: TASK-185
25+
**Related Requirements:** PRD-V3N-REQ-024, PRD-V3N-REQ-025, PRD-V3N-REQ-031, PRD-V3N-REQ-037; owned-engine sanitizer acceptance.
26+
**Related Decisions:** DR-V3-003, DR-V3-006, DR-V3-008.
27+
**Status:** Not Started

‎specs/tasks/_index.md‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99

1010
## v3.0 plan
1111

12-
104 tasks, TASK-096–TASK-199, across M8–M14. The 14 M14 repairs implement the 2026-10-10 instruction to fix all remaining local release failures and missing public capabilities; TASK-185 runs after those dependencies. See the [repair roadmap](v3-release-repair-roadmap.md). M1–M7 and TASK-001–TASK-095 remain the v2 plan. Current task states appear in the status table and task cards. Estimates are S ≈ 1 day, M ≈ 2 days, L ≈ 3 days of focused implementation and tests; interoperability work may take longer.
12+
105 tasks, TASK-096–TASK-200, across M8–M14. The 15 M14 repairs implement the 2026-10-10 instruction to fix all remaining local release failures and missing public capabilities; TASK-185 runs after those dependencies. See the [repair roadmap](v3-release-repair-roadmap.md). M1–M7 and TASK-001–TASK-095 remain the v2 plan. Current task states appear in the status table and task cards. Estimates are S ≈ 1 day, M ≈ 2 days, L ≈ 3 days of focused implementation and tests; interoperability work may take longer.
1313

1414
### v3 integration branch
1515

16-
The base and integration branch for every TASK-096–TASK-199 is **`v3`**. Before executing a task, confirm that `v3` exists, contains the approved v3 specs and task files, and is the checked-out base branch. Create the task's branch and worktree from `v3`; validate and merge the completed task back into `v3`. If a Groundwork workflow reports another `base_branch`, stop before implementation or merge and correct the branch context. Integration of `v3` into `main` is a separate release decision.
16+
The base and integration branch for every TASK-096–TASK-200 is **`v3`**. Before executing a task, confirm that `v3` exists, contains the approved v3 specs and task files, and is the checked-out base branch. Create the task's branch and worktree from `v3`; validate and merge the completed task back into `v3`. If a Groundwork workflow reports another `base_branch`, stop before implementation or merge and correct the branch context. Integration of `v3` into `main` is a separate release decision.
1717

1818
### v3 milestones
1919

@@ -25,7 +25,7 @@ The base and integration branch for every TASK-096–TASK-199 is **`v3`**. Befor
2525
| [M11: First HTTP/3 slice](M11-http3-first-slice/) | Owned QUIC v1 and static-QPACK HTTP/3 serve bounded GET/POST through the shared exchange. | 15 |
2626
| [M12: Full HTTP/3](M12-http3-full/) | QUIC recovery and migration, dynamic QPACK, H3 drain, and WebSockets over H3 pass independent-client gates. | 15 |
2727
| [M13: v3.0 release](M13-v3-release/) | Parity, cross-platform packages, resource limits, documentation, and all protocol/security release gates pass. | 7 |
28-
| [M14: v3 local release readiness repairs](M14-v3-release-repairs/) | Complete public TLS/H2/H3 and credential integration, repair local failures, and supply native benchmarks before the final release gate. | 14 |
28+
| [M14: v3 local release readiness repairs](M14-v3-release-repairs/) | Complete public TLS/H2/H3 and credential integration, repair local failures, and supply native benchmarks before the final release gate. | 15 |
2929

3030
### v3 dependency graph
3131

@@ -39,7 +39,7 @@ M10 108 → 129 → 130 → 131 → 132 [TLS]; 137 → 138 → 139–145 [HTTP/2
3939
M11 149–158 [owned QUIC]; 159 [static QPACK] → 160–163 [first H3 slice]
4040
M12 164–178 [QUIC/H3 recovery, migration, dynamic QPACK, WebSocket]
4141
M13 179–184 [migration, package, platform gates]
42-
M14 186–199 [local repairs, public transports, native benchmarks] → 185 [release gate]
42+
M14 186–200 [local repairs, public transports, native benchmarks] → 185 [release gate]
4343
```
4444

4545
The graph shows the main tracks; each task file and the status table below give exact blockers. The longest path by task count has 27 tasks:
@@ -332,7 +332,7 @@ Nominally: **13 sequential tasks**, each S–XL. Most other tasks parallelize of
332332
| TASK-182 | [Complete four-platform managed/external-loop package validation](M13-v3-release/TASK-182.md) | M13 | Complete | TASK-125, TASK-126, TASK-127, TASK-146, TASK-178 |
333333
| TASK-183 | [Publish v2-to-v3 migration guide and API examples](M13-v3-release/TASK-183.md) | M13 | Complete | TASK-179 |
334334
| TASK-184 | [Remove MHD build/link paths and bump v3 SOVERSION](M13-v3-release/TASK-184.md) | M13 | Complete | TASK-179, TASK-182, TASK-183 |
335-
| TASK-185 | [Run final dependency, conformance, sanitizer and performance release gates](M13-v3-release/TASK-185.md) | M13 | In Progress | TASK-180, TASK-181, TASK-182, TASK-183, TASK-184, TASK-199 |
335+
| TASK-185 | [Run final dependency, conformance, sanitizer and performance release gates](M13-v3-release/TASK-185.md) | M13 | In Progress | TASK-180, TASK-181, TASK-182, TASK-183, TASK-184, TASK-200 |
336336
| TASK-186 | [Repair concurrency consumer lifetime and sanitizer-owned allocation coverage](M14-v3-release-repairs/TASK-186.md) | M14 | Complete | None |
337337
| TASK-187 | [Repair response-source and multipart coroutine lifetimes](M14-v3-release-repairs/TASK-187.md) | M14 | Complete | TASK-186 |
338338
| TASK-188 | [Eliminate peer-policy mutation starvation](M14-v3-release-repairs/TASK-188.md) | M14 | Not Started | TASK-187 |
@@ -347,6 +347,7 @@ Nominally: **13 sequential tasks**, each S–XL. Most other tasks parallelize of
347347
| TASK-197 | [Complete public HTTP/3 lifecycle, policy and WebSocket parity](M14-v3-release-repairs/TASK-197.md) | M14 | Not Started | TASK-194, TASK-196 |
348348
| TASK-198 | [Provide native public throughput and latency benchmarks](M14-v3-release-repairs/TASK-198.md) | M14 | Not Started | TASK-195, TASK-197 |
349349
| TASK-199 | [Deliver packaged public-capability and benchmark adapters for release execution](M14-v3-release-repairs/TASK-199.md) | M14 | Not Started | TASK-198 |
350+
| TASK-200 | [Repair intermittent timer and executor teardown race](M14-v3-release-repairs/TASK-200.md) | M14 | Not Started | TASK-199 |
350351

351352
## PRD requirement coverage
352353

‎specs/tasks/v3-release-repair-roadmap.md‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ The user's new authorization supersedes the old TASK-185 plan's product/benchmar
2020
| 12 | TASK-197 | Complete public H3 semantics, limits/drain/RFC9220/TLS policy |
2121
| 13 | TASK-198 | Native public throughput/latency runner and valid measurements |
2222
| 14 | TASK-199 | Package-callable public/benchmark adapters, negative contracts and current docs reconciliation |
23-
| 15 | TASK-185 resumed | Bind new witnesses, one fresh complete packaged local inventory, validation and finalization |
23+
| 15 | TASK-200 | Resolve intermittent timer/executor teardown TSan failure observed during TASK-187 |
24+
| 16 | TASK-185 resumed | Bind new witnesses, one fresh complete packaged local inventory, validation and finalization |
2425

25-
Task cards are in `M14-v3-release-repairs/TASK-186.md` through `M14-v3-release-repairs/TASK-199.md`; shared Groundwork/TDD/validation/merge contract is `v3-release-repair-workflow.md`; bounded integration design/doubts are `v3-release-integration-design.md`. Copy these into the chosen repository task/spec locations with references adjusted before runner activation. Add a M14 index, update the global task index, and make primary TASK-185 depend on TASK-186..199 (or TASK-199 plus the cards' complete transitive chain). Use standard standalone `- Blocked by:` and `- Blocks:` lines so runner catalog parsing resolves the order. Root owns final TASK-185 plan/addendum and runner recovery changes.
26+
Task cards are in `M14-v3-release-repairs/TASK-186.md` through `M14-v3-release-repairs/TASK-200.md`; shared Groundwork/TDD/validation/merge contract is `v3-release-repair-workflow.md`; bounded integration design/doubts are `v3-release-integration-design.md`. Copy these into the chosen repository task/spec locations with references adjusted before runner activation. Add a M14 index, update the global task index, and make primary TASK-185 depend on TASK-186..200 (or TASK-200 plus the cards' complete transitive chain). Use standard standalone `- Blocked by:` and `- Blocks:` lines so runner catalog parsing resolves the order. Root owns final TASK-185 plan/addendum and runner recovery changes.
2627

2728
## Retained failures and closure mapping
2829

@@ -45,12 +46,16 @@ The unchanged 509-SLOC poll-backend baseline finding is not independently expand
4546
## TASK-185 resume addendum and safe base integration
4647

4748
1. Before activation, snapshot/hash the existing185 dirty diff, untracked source/evidence inventory and validation coordinator ledger using the runner's supported recovery mechanism. Preserve the old plan and append/replace it with a dated authorized addendum. Do not delete receipts, rewrite historic statuses/hashes, mark acceptance complete or reset the branch.
48-
2. Update dependencies/task plan in the selected catalog and inspect runner dry-run for TASK-185..TASK-199: all new tasks must run before185. Its parser reads selected worktree cards; ensure copied cards/index and selected root are consistent. No runner may concurrently edit primary docs while the root is changing the catalog.
49-
3. After199 merges/cleans, resolve185 via worktree helper and inspect identity/status/runner phase. Old phase/checkpoint evidence cannot imply completion against changed scope/source. Invalidate only stale implementation/validation checkpoints via supported recovery, preserving historical findings and causal evidence. Treat changed source/archive inputs as requiring new affected reviews and final checks.
49+
2. Update dependencies/task plan in the selected catalog and inspect runner dry-run for TASK-185..TASK-200: all new tasks must run before185. Its parser reads selected worktree cards; ensure copied cards/index and selected root are consistent. No runner may concurrently edit primary docs while the root is changing the catalog.
50+
3. After200 merges/cleans, resolve185 via worktree helper and inspect identity/status/runner phase. Old phase/checkpoint evidence cannot imply completion against changed scope/source. Invalidate only stale implementation/validation checkpoints via supported recovery, preserving historical findings and causal evidence. Treat changed source/archive inputs as requiring new affected reviews and final checks.
5051
4. Integrate updated `v3` into the preserved185 task branch using an explicit reviewed merge after protecting dirty repairs (commit/checkpoint task-owned repair source, or supported reversible save/apply); do not force reset/recreate/drop the worktree. Resolve conflicts preserving source/data/runner repairs and new dependencies. Verify185 still has `base_branch=v3` and the final candidate includes every dependency commit. Old artifact identities remain historical, never relabeled as new source.
5152
5. Expand185 implementation plan to replace `v3_release_execution.py`'s hardcoded `blocked()` lambdas for `public-capabilities` and `native-throughput-latency` with the real installed public and benchmark adapters delivered by199 from193..198. Bind all executable/client/library/header/configuration/receipt provenance. Finish any installed matrix/consumer/TLS example expectation changes now necessary. Negative contracts must reject private-fixture success, wrong installed library, missing scenarios, fake benchmark samples and stale archive identities; add RED/GREEN tests before adapter changes.
5253
6. Reuse immutable stage evidence retention, pending-platform positive control and corrected native output adapters. Run focused changed contracts and package registration first; preserve all 18 mandatory stages and existing scenario requirements, fuzz bounds, slow-peer thresholds and allowed named exclusions. No missing capability is waived or accepted by exit-zero alone.
5354
7. Create one fresh distribution/extracted-source identity after integration and run the entire packaged TLS-off/on shared/static managed/external inventory, normal/ASan/UBSan/TSan, independent H1/H2/H3/WS, TLS, parity, resource, native benchmarks and fuzz with pinned tools/provider. All required local gates must pass on that one artifact; supplements from different archives cannot combine into completion. Record failed attempts intact and repair exact causes with TDD if fresh failures remain.
5455
8. Reconcile current docs/card/index, close only evidence-backed validation findings, run applicable Groundwork validation and finalize185 into `v3` only after complete local acceptance. Nonlocal BSD/macOS/Windows/backend receipts remain CI/v3-PR work, and full tag readiness remains false until they arrive. No tag/push/publication/deploy is performed.
5556

5657
Native benchmark policy: the v3 PRD contains no absolute throughput or percentile target. TASK198 therefore requires reproducible successful measurements and existing resource thresholds, with no invented speed bar or revival of historical v2 numeric microbench claims. Any future performance regression policy needs an explicitly documented comparable baseline/threshold.
58+
59+
## Additional observed failure (2026-10-10)
60+
61+
TASK-187 affected checks and eight-domain validation pass. Its extra unchanged task_race TSan target reported an intermittent timer/manual_executor teardown race; one equivalent base comparison passed. TASK-200 owns causal diagnosis and repair after199 and before185. The original failing receipt is retained in the immutable TASK-187 archive; the passing comparison does not close it. TASK-186 also established usable local sanitizer execution outside ptrace with leak/stack checking enabled; use that execution route instead of treating the old ptrace limitation as a waiver.

0 commit comments

Comments
 (0)