Skip to content

Commit 858dfde

Browse files
etrclaude
andcommitted
Merge TASK-076: replace tautological-pass blocks in TLS test lanes
Replaces ~25 LT_CHECK_EQ(1,1) tautologies in ws_start_stop.cpp with LT_SKIP / LT_SKIP_IF (new littletest macros, Automake exit-77 semantics) or typed std::exception catches that distinguish "config unsupported" from "config broken". Adds tls-no-cli CI matrix lane and a regression gate (lint-no-tautological-asserts) wired into make check-local. Includes iter-1 review-cleanup fixes (test-quality-reviewer majors) and 28 persisted unworked findings. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2 parents b51cbf2 + b9968b3 commit 858dfde

12 files changed

Lines changed: 809 additions & 135 deletions

File tree

.github/workflows/verify-build.yml

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,24 @@ jobs:
304304
coverage: nocoverage
305305
linking: dynamic
306306
shell: bash
307+
# TASK-076: TLS-no-CLI lane. Installs libgnutls28-dev (so the
308+
# library compiles WITH HAVE_GNUTLS) but deliberately omits
309+
# `gnutls-bin`, so the gnutls-cli binary is NOT on $PATH. The
310+
# five `psk_connection_*` tests in test/integ/ws_start_stop.cpp
311+
# must report `[SKIP]` (via LT_SKIP_IF(!has_gnutls_cli(), ...))
312+
# rather than tautological PASS. Post-test verification step
313+
# below greps the test log for the [SKIP] markers.
314+
- test-group: extra
315+
os: ubuntu-latest
316+
os-type: ubuntu
317+
build-type: tls-no-cli
318+
compiler-family: gcc
319+
c-compiler: gcc-14
320+
cc-compiler: g++-14
321+
debug: nodebug
322+
coverage: nocoverage
323+
linking: dynamic
324+
shell: bash
307325
- test-group: basic
308326
os: windows-latest
309327
os-type: windows
@@ -565,7 +583,23 @@ jobs:
565583
# TASK-037: skip gnutls install on the flag-invariance-off lane so
566584
# HAVE_GNUTLS auto-detects to off (the configure script just
567585
# AC_CHECK_HEADER's gnutls/gnutls.h, no header == HAVE_GNUTLS=0).
568-
if: ${{ matrix.os-type == 'ubuntu' && matrix.build-type != 'flag-invariance-off' }}
586+
# TASK-076: also skip on the tls-no-cli lane — it does its own
587+
# install of libgnutls28-dev WITHOUT gnutls-bin in the next step
588+
# so the per-test LT_SKIP_IF(!has_gnutls_cli(), ...) gate fires.
589+
if: ${{ matrix.os-type == 'ubuntu' && matrix.build-type != 'flag-invariance-off' && matrix.build-type != 'tls-no-cli' }}
590+
591+
- name: Setup gnutls dependency WITHOUT gnutls-cli (TASK-076 tls-no-cli lane)
592+
run: |
593+
sudo apt-get install libgnutls28-dev ;
594+
# Deliberate: NO gnutls-bin here. The lane asserts that
595+
# has_gnutls_cli() returns false at runtime, which makes the
596+
# five `psk_connection_*` tests in ws_start_stop.cpp emit
597+
# `[SKIP]` rather than tautological PASS.
598+
if which gnutls-cli >/dev/null 2>&1; then
599+
echo "ERROR: gnutls-cli is on PATH but the tls-no-cli lane requires it absent" >&2
600+
exit 1
601+
fi
602+
if: ${{ matrix.build-type == 'tls-no-cli' }}
569603

570604
- name: Fetch libmicrohttpd from cache
571605
id: cache-libmicrohttpd
@@ -923,6 +957,56 @@ jobs:
923957
make check-hygiene
924958
if: ${{ matrix.build-type == 'header-hygiene' }}
925959

960+
- name: Verify [SKIP] markers fire on tls-no-cli lane (TASK-076)
961+
# The five `psk_connection_*` tests in ws_start_stop.cpp gate on
962+
# has_gnutls_cli(); since this lane installs libgnutls28-dev WITHOUT
963+
# gnutls-bin, the gate must fire. The runner's stdout must contain
964+
# at least 5 [SKIP] markers AND zero [CHECK FAILURE] / [ASSERT
965+
# FAILURE] markers attributable to a psk_connection_* test. The
966+
# ws_start_stop binary log is at build/test/ws_start_stop.log
967+
# (Automake's per-test capture).
968+
run: |
969+
set -euo pipefail
970+
cd build
971+
LOG=test/ws_start_stop.log
972+
if [ ! -f "$LOG" ]; then
973+
echo "ERROR: $LOG missing — ws_start_stop did not run" >&2
974+
exit 1
975+
fi
976+
SKIP_COUNT=$(grep -c '^\[SKIP\].*gnutls-cli' "$LOG" || true)
977+
echo "Found $SKIP_COUNT [SKIP] markers attributable to gnutls-cli"
978+
if [ "$SKIP_COUNT" -lt 5 ]; then
979+
echo "ERROR: expected >=5 [SKIP] markers in $LOG; got $SKIP_COUNT" >&2
980+
cat "$LOG"
981+
exit 1
982+
fi
983+
if grep -E '\[(CHECK|ASSERT) FAILURE\].*psk_connection' "$LOG"; then
984+
echo "ERROR: a psk_connection_* test reported FAILURE in tls-no-cli lane" >&2
985+
exit 1
986+
fi
987+
if: ${{ matrix.build-type == 'tls-no-cli' }}
988+
989+
- name: Verify TLS blocks exercised when gnutls-cli is present (TASK-076)
990+
# Canary invariant on a representative healthy gnutls-bin-installed
991+
# lane: the psk_connection_* tests must NOT report [SKIP]. If they
992+
# do, gnutls-cli detection regressed. Runs on the classic
993+
# ubuntu/gcc/nodebug/dynamic baseline only.
994+
run: |
995+
set -euo pipefail
996+
cd build
997+
LOG=test/ws_start_stop.log
998+
if [ ! -f "$LOG" ]; then
999+
echo "ERROR: $LOG missing — ws_start_stop did not run" >&2
1000+
exit 1
1001+
fi
1002+
if grep -E '^\[SKIP\].*psk_connection' "$LOG"; then
1003+
echo "ERROR: psk_connection_* skipped on a lane that has gnutls-bin" >&2
1004+
cat "$LOG"
1005+
exit 1
1006+
fi
1007+
echo "PASS — no psk_connection_* SKIPs on the with-gnutls baseline lane"
1008+
if: ${{ matrix.os-type == 'ubuntu' && matrix.test-group == 'basic' && matrix.compiler-family == 'gcc' && matrix.debug == 'nodebug' && matrix.linking == 'dynamic' && matrix.build-type == 'classic' }}
1009+
9261010
- name: Print tests results
9271011
shell: bash
9281012
run: |

Makefile.am

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ EXTRA_DIST = libhttpserver.pc.in $(DX_CONFIG) scripts/extract-release-notes.sh s
4747
scripts/check-file-size.sh \
4848
scripts/check-warning-suppressions.sh \
4949
scripts/check-server-ready-helper.sh \
50+
scripts/check-no-tautological-asserts.sh \
51+
scripts/test_check_littletest_skip_exit_code.sh \
5052
scripts/verify-installed-examples.sh \
5153
test/headers/consumer_direct.cpp test/headers/consumer_detail.cpp test/headers/consumer_detail_modded.cpp \
5254
test/headers/consumer_umbrella.cpp \
@@ -369,7 +371,7 @@ check-hygiene:
369371
# staged the install; sub-check skips the install step to avoid double cost.
370372
# This knob is set only by check-local; do not set it when invoking sub-checks
371373
# standalone.
372-
check-local: check-headers check-examples check-readme check-release-notes check-doxygen check-hooks-doc-spotcheck lint-warning-suppressions lint-server-ready-helper
374+
check-local: check-headers check-examples check-readme check-release-notes check-doxygen check-hooks-doc-spotcheck lint-warning-suppressions lint-server-ready-helper lint-no-tautological-asserts lint-littletest-skip-exit-code
373375
@echo "=== Shared staged install for check-install-layout and check-hygiene ==="
374376
@rm -rf "$(abs_top_builddir)/.shared-check-stage"
375377
@$(MAKE) $(AM_MAKEFLAGS) install DESTDIR="$(abs_top_builddir)/.shared-check-stage" >check-shared-install.log 2>&1 || { \
@@ -485,7 +487,30 @@ lint-server-ready-helper:
485487
@echo "=== lint-server-ready-helper: forbid bare server-ready sleeps in hooks_* integ tests ==="
486488
@$(top_srcdir)/scripts/check-server-ready-helper.sh
487489

488-
.PHONY: check-headers check-install-layout check-hygiene check-local check-examples check-readme check-release-notes check-doxygen check-hooks-doc-spotcheck check-soversion check-parallel-install lint-complexity lint-duplication lint-file-size lint-warning-suppressions lint-server-ready-helper
490+
# TASK-076: forbid `LT_CHECK_EQ(1, 1)` in test/integ/ws_start_stop.cpp.
491+
# Pre-TASK-076 ~33 catches in the TLS test suite used the tautological
492+
# assertion as a fake "skip" — a build that silently lost TLS support
493+
# would still report PASS. The replacement uses LT_SKIP_IF (added to
494+
# test/littletest.hpp by TASK-076) which reports SKIP. This gate
495+
# prevents regressing back to the broken pattern in ws_start_stop.cpp.
496+
# Wired into `make check` via check-local; pure bash/grep, runs in
497+
# every CI lane.
498+
lint-no-tautological-asserts:
499+
@echo "=== lint-no-tautological-asserts: forbid tautological pseudo-skip in ws_start_stop.cpp ==="
500+
@$(top_srcdir)/scripts/check-no-tautological-asserts.sh
501+
502+
# TASK-076: pin the LT_SKIP exit-code semantics in test/littletest.hpp.
503+
# Asserts (a) an all-skip binary exits 77 (Automake SKIP), (b) a mixed
504+
# pass+skip binary exits 0 and emits both `[SKIP]` and `-> N skipped`
505+
# stdout markers. The textual markers are what CI greps for in the
506+
# tls-no-cli lane to assert per-test SKIPs fired. Wired into `make
507+
# check` via check-local; needs only a C++ compiler on $PATH so it
508+
# runs in every lane.
509+
lint-littletest-skip-exit-code:
510+
@echo "=== lint-littletest-skip-exit-code: pin LT_SKIP exit-code semantics ==="
511+
@$(top_srcdir)/scripts/test_check_littletest_skip_exit_code.sh
512+
513+
.PHONY: check-headers check-install-layout check-hygiene check-local check-examples check-readme check-release-notes check-doxygen check-hooks-doc-spotcheck check-soversion check-parallel-install lint-complexity lint-duplication lint-file-size lint-warning-suppressions lint-server-ready-helper lint-no-tautological-asserts lint-littletest-skip-exit-code
489514

490515
# TASK-039: top-level convenience rule that descends into test/ to
491516
# build and run the bench binaries (see test/Makefile.am and

RELEASE_NOTES.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,23 @@ v2 is a clean rename, not an ABI overlay over v1. v1.x is end-of-life
344344
on the day v2.0 ships — there is no v1 maintenance branch (PRD §1,
345345
DR-011 ([specs/architecture/11-decisions/DR-011.md](specs/architecture/11-decisions/DR-011.md))).
346346

347+
## Test infrastructure
348+
349+
- **`LT_SKIP` / `LT_SKIP_IF` macros (TASK-076).** The internal
350+
`test/littletest.hpp` framework now distinguishes SKIP from PASS.
351+
Test bodies that depend on a runtime resource (for example
352+
`gnutls-cli` for the PSK connection tests in
353+
`test/integ/ws_start_stop.cpp`) now call
354+
`LT_SKIP_IF(cond, reason)` instead of recording a tautological
355+
`LT_CHECK_EQ(1, 1)`. A binary whose only outcomes are skips exits
356+
77 (Automake's SKIP code from `test-driver`); a binary with mixed
357+
skips and successes exits 0 and the runner summary reports
358+
`-> N skipped`. The TLS lanes in `ws_start_stop.cpp` now skip — not
359+
silently pass — when GnuTLS or `gnutls-cli` is absent, so a build
360+
that silently lost TLS support is no longer hidden behind a green
361+
CI signal. Two new CI lanes (`tls-no-cli`, plus a baseline canary)
362+
assert the SKIP wiring fires (or does not) as configured.
363+
347364
## See also
348365

349366
- [README.md](README.md) — full v2.0 introduction and worked examples.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/usr/bin/env bash
2+
#
3+
# TASK-076 regression gate: forbid `LT_CHECK_EQ(1, 1)` in
4+
# test/integ/ws_start_stop.cpp.
5+
#
6+
# The pattern was used as a fake "skip" before LT_SKIP / LT_SKIP_IF
7+
# existed in test/littletest.hpp. A build that silently lost TLS support
8+
# would still report green because every catch block in the TLS suite
9+
# swallowed the exception with a tautological `LT_CHECK_EQ(1, 1)`.
10+
# TASK-076 replaced all 33 occurrences with either:
11+
# (a) `LT_SKIP_IF(cond, reason)` for environment-conditional skips
12+
# (e.g. gnutls-cli absent from PATH); or
13+
# (b) a real postcondition assertion / typed catch + re-throw for
14+
# cases where the implementation should be exercised; or
15+
# (c) deletion of redundant tail-position liveness pseudo-asserts.
16+
#
17+
# This gate keeps the regression visible by failing if any future patch
18+
# reintroduces the pattern in ws_start_stop.cpp. The scope is
19+
# intentionally narrow — `test/integ/basic.cpp:1877` and
20+
# `test/unit/no_v1_compat_shim_test.cpp:96` both use the same textual
21+
# pattern as intentional liveness/compile-sentinel assertions and are
22+
# NOT covered by this gate (the task wording scopes only to
23+
# ws_start_stop.cpp).
24+
#
25+
26+
set -euo pipefail
27+
28+
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
29+
FILE="$REPO_ROOT/test/integ/ws_start_stop.cpp"
30+
31+
if [ ! -f "$FILE" ]; then
32+
echo "ERROR: $FILE missing" >&2
33+
exit 1
34+
fi
35+
36+
if grep -nE 'LT_CHECK_EQ\(1, *1\)' "$FILE"; then
37+
echo "ERROR: LT_CHECK_EQ(1, 1) found in $FILE." >&2
38+
echo " Use LT_SKIP_IF(...) for environment-conditional skips" >&2
39+
echo " (see TASK-076). The tautological assertion masks broken" >&2
40+
echo " TLS builds as PASS instead of SKIP." >&2
41+
exit 1
42+
fi
43+
44+
echo "PASS — no tautological LT_CHECK_EQ(1, 1) in $(realpath --relative-to="$REPO_ROOT" "$FILE" 2>/dev/null || echo "$FILE")"
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
#!/usr/bin/env bash
2+
#
3+
# TASK-076 Cycle 1 / sentinel for `LT_SKIP` exit-code plumbing.
4+
#
5+
# Asserts that the littletest binary semantics for SKIP are:
6+
#
7+
# (a) A binary whose only outcomes are SKIPs exits 77 (Automake's SKIP
8+
# code from `test-driver` line 131: `77:*) col=$blu res=SKIP …`).
9+
# This is what makes "all dependencies missing" reportable to
10+
# Automake as SKIP rather than PASS — the regression the rest of
11+
# TASK-076 patches at every TLS test site.
12+
#
13+
# (b) A binary that mixes passes and skips exits 0 (the existing
14+
# behaviour; SKIPs do not "infect" a successful run).
15+
#
16+
# The script compiles two tiny throwaway TUs against the in-tree
17+
# `test/littletest.hpp` and runs them. It is wired into Makefile.am as a
18+
# `lint-`-style script (no library link required); it does NOT depend on
19+
# anything libhttpserver-specific so it can run on any host with a C++
20+
# compiler.
21+
#
22+
# Exit codes:
23+
# 0 — both assertions held.
24+
# 1 — at least one assertion failed.
25+
#
26+
27+
set -euo pipefail
28+
29+
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
30+
LITTLETEST_HDR="$REPO_ROOT/test/littletest.hpp"
31+
if [ ! -f "$LITTLETEST_HDR" ]; then
32+
echo "ERROR: $LITTLETEST_HDR missing" >&2
33+
exit 1
34+
fi
35+
36+
CXX="${CXX:-c++}"
37+
38+
TMPDIR_=$(mktemp -d)
39+
trap 'rm -rf "$TMPDIR_"' EXIT
40+
41+
# ---- (a) all-skip → exit 77 -------------------------------------------------
42+
cat > "$TMPDIR_/only_skips.cpp" <<'EOF'
43+
#include "littletest.hpp"
44+
45+
LT_BEGIN_SUITE(only_skips_suite)
46+
void set_up() {}
47+
void tear_down() {}
48+
LT_END_SUITE(only_skips_suite)
49+
50+
LT_BEGIN_AUTO_TEST(only_skips_suite, this_test_only_skips)
51+
LT_SKIP("dependency missing");
52+
LT_END_AUTO_TEST(this_test_only_skips)
53+
54+
LT_BEGIN_AUTO_TEST_ENV()
55+
AUTORUN_TESTS()
56+
LT_END_AUTO_TEST_ENV()
57+
EOF
58+
59+
"$CXX" -std=c++20 -I"$REPO_ROOT/test" \
60+
"$TMPDIR_/only_skips.cpp" -o "$TMPDIR_/only_skips"
61+
62+
set +e
63+
"$TMPDIR_/only_skips" > "$TMPDIR_/only_skips.log" 2>&1
64+
ec_a=$?
65+
set -e
66+
67+
if [ "$ec_a" -ne 77 ]; then
68+
echo "FAIL (a): all-skip binary exited $ec_a, expected 77" >&2
69+
cat "$TMPDIR_/only_skips.log" >&2
70+
exit 1
71+
fi
72+
73+
# ---- (b) pass + skip → exit 0 ----------------------------------------------
74+
cat > "$TMPDIR_/mixed.cpp" <<'EOF'
75+
#include "littletest.hpp"
76+
77+
LT_BEGIN_SUITE(mixed_suite)
78+
void set_up() {}
79+
void tear_down() {}
80+
LT_END_SUITE(mixed_suite)
81+
82+
LT_BEGIN_AUTO_TEST(mixed_suite, this_passes)
83+
LT_CHECK_EQ(1 + 1, 2);
84+
LT_END_AUTO_TEST(this_passes)
85+
86+
LT_BEGIN_AUTO_TEST(mixed_suite, this_skips)
87+
LT_SKIP("dependency missing");
88+
LT_END_AUTO_TEST(this_skips)
89+
90+
LT_BEGIN_AUTO_TEST_ENV()
91+
AUTORUN_TESTS()
92+
LT_END_AUTO_TEST_ENV()
93+
EOF
94+
95+
"$CXX" -std=c++20 -I"$REPO_ROOT/test" \
96+
"$TMPDIR_/mixed.cpp" -o "$TMPDIR_/mixed"
97+
98+
set +e
99+
"$TMPDIR_/mixed" > "$TMPDIR_/mixed.log" 2>&1
100+
ec_b=$?
101+
set -e
102+
103+
if [ "$ec_b" -ne 0 ]; then
104+
echo "FAIL (b): mixed pass+skip binary exited $ec_b, expected 0" >&2
105+
cat "$TMPDIR_/mixed.log" >&2
106+
exit 1
107+
fi
108+
109+
# Confirm the binary emitted the `[SKIP]` marker and the `-> N skipped`
110+
# runner summary line — these are the textual contracts the CI lane
111+
# greps for to assert per-test SKIPs in ws_start_stop fired.
112+
if ! grep -q '^\[SKIP\] ' "$TMPDIR_/mixed.log"; then
113+
echo "FAIL (b): mixed binary stdout missing '[SKIP] ' marker" >&2
114+
cat "$TMPDIR_/mixed.log" >&2
115+
exit 1
116+
fi
117+
if ! grep -qE '^-> [0-9]+ skipped' "$TMPDIR_/mixed.log"; then
118+
echo "FAIL (b): runner summary missing '-> N skipped' line" >&2
119+
cat "$TMPDIR_/mixed.log" >&2
120+
exit 1
121+
fi
122+
123+
echo "PASS — littletest SKIP exit-code semantics held (77 for all-skip, 0 for mixed)"

specs/tasks/M7-v2-cleanup/TASK-076.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
`ws_start_stop.cpp` carries ~20 `try { ws.start() } catch { LT_CHECK_EQ(1,1); return; }` blocks across SSL/mTLS/PSK/SNI sections, plus 5 more `if (!has_gnutls_cli()) { LT_CHECK_EQ(1,1); return; }` env-gates. On hosts without GnuTLS or `gnutls-cli`, the entire TLS suite reduces to `LT_CHECK_EQ(1,1)` passes — a build that silently lost TLS support would still report green. Replace these with a real fail-fast or skip mechanism that distinguishes "configuration not supported" from "configuration broken".
99

1010
**Action Items:**
11-
- [ ] Audit each `LT_CHECK_EQ(1,1)` at the lines listed in the audit (759, 789, 914, 949, 1016, 1051, 1091, 1129, 1171, 1212, 1266, 1367, 1486, 1512, 1537, 1552, 1599, 1642, 1685, 1728, plus env-gates at 1550, 1597, 1640, 1683, 1726).
12-
- [ ] For each, classify:
13-
- (a) Environment lacks TLS dependencies → use the littletest `LT_SKIP_IF(!has_gnutls(), "gnutls not available")` (or equivalent) macro that the runner reports as `SKIP`, not `PASS`. Add such a macro if littletest does not have one.
14-
- (b) Environment supports TLS but a specific cipher/PSK config is rejected → assert specifically on that rejection rather than swallowing all exceptions; the test must distinguish "expected reject" from "implementation broken".
15-
- [ ] Add a CI matrix lane that runs `ws_start_stop.cpp` on a host *with* GnuTLS + `gnutls-cli` and a separate lane that asserts the suite reports `SKIP` (not `PASS`) when they are absent.
16-
- [ ] RELEASE_NOTES.md "Test infrastructure" note (if applicable) on the new skip semantics.
11+
- [x] Audit each `LT_CHECK_EQ(1,1)` at the lines listed in the audit (759, 789, 914, 949, 1016, 1051, 1091, 1129, 1171, 1212, 1266, 1367, 1486, 1512, 1537, 1552, 1599, 1642, 1685, 1728, plus env-gates at 1550, 1597, 1640, 1683, 1726). The implementation grepped the full set at start-of-cycle and replaced all 33 matches (the plan audit covered 8 lines the original task enumeration omitted).
12+
- [x] For each, classify:
13+
- (a) Environment lacks TLS dependencies → emitted `LT_SKIP_IF(...)` via the new littletest macro (added to `test/littletest.hpp`). Runner reports `[SKIP]`, not `PASS`; a binary whose only outcomes are SKIPs exits 77 (Automake SKIP).
14+
- (b) Environment supports TLS but a specific cipher/PSK config is rejected → typed catch on `std::exception` + substring-match on `is_psk_unsupported_error(e)` for SKIP, otherwise `throw;` so implementation-broken cases fail loudly.
15+
- [x] Added a CI matrix lane (`build-type: tls-no-cli`) that runs `ws_start_stop.cpp` with `libgnutls28-dev` installed but `gnutls-bin` deliberately absent; the post-test verification step greps `test/ws_start_stop.log` for ≥5 `[SKIP]` markers (the five `psk_connection_*` tests) and zero `[CHECK/ASSERT FAILURE]` lines. A separate canary step on the baseline `classic` lane asserts those tests do NOT report SKIP when `gnutls-bin` is present.
16+
- [x] Added RELEASE_NOTES.md "Test infrastructure" section documenting `LT_SKIP` / `LT_SKIP_IF` and the new exit-77 semantics.
1717

1818
**Dependencies:**
1919
- Blocked by: None
@@ -30,4 +30,4 @@
3030
**Related Requirements:** PRD §2 test reliability NFR
3131
**Related Decisions:** None new
3232

33-
**Status:** Backlog
33+
**Status:** Done

specs/tasks/M7-v2-cleanup/_index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ TASK-093).
4040
| TASK-073 | Revisit libmicrohttpd v0.99 unescape workaround | LOW | S | Done |
4141
| TASK-074 | Gate DEBUG raw-body printing behind explicit opt-in | LOW (sec) | S | Done |
4242
| TASK-075 | Propagate `wait_for_server_ready` to sibling hooks integ tests | HIGH | M | Done |
43-
| TASK-076 | Replace tautological-pass blocks in TLS test lanes | HIGH | M | Backlog |
43+
| TASK-076 | Replace tautological-pass blocks in TLS test lanes | HIGH | M | Done |
4444
| TASK-077 | Restore Windows / Darwin coverage in skipped test suites | HIGH | L | Backlog |
4545
| TASK-078 | Resolve commented-out CONNECT-method test bodies | HIGH | S | Backlog |
4646
| TASK-079 | Drive nonce/opaque state machine in v2 digest-auth integ tests | MED | M | Backlog |

0 commit comments

Comments
 (0)