---
milestone: v0.10.0
milestone_name: Connection-Lifecycle & Catalog-Context Fixes
audited: 2026-05-27
status: tech_debt
scores:
  requirements:
    satisfied: 7
    pending_milestone_close: 4
    total: 11
  phases:
    passed: 4
    total: 4
  integration:
    wired: 11
    broken: 0
  flows:
    complete: 2
    broken: 0
gaps: []
deferred_to_milestone_close:
  - id: REL-01
    description: "CHANGELOG.md `## [0.10.0]` section + reset Unreleased + compare link update"
    rationale: "Project convention (feedback_defer_release_tasks.md): release-prep tasks happen at milestone close, not inside the milestone-finisher phase. Phase 66 VERIFICATION.md explicitly defers."
    handler: "/gsd:complete-milestone"
  - id: REL-02
    description: "Cargo.toml + description.yml → 0.10.0; `just test-all` and `just ci` green on milestone branch"
    rationale: "Same convention. `just test-all` already exit 0 post Phase 67 merge."
    handler: "/gsd:complete-milestone"
  - id: REL-03
    description: "New Python example file under `examples/` demoing v0.10.0 read-only-reopen + cross-conn expansion"
    rationale: "Same convention."
    handler: "/gsd:complete-milestone"
  - id: REL-04
    description: "DuckDB dependency bump v1.5.2 → v1.5.3 (.duckdb-version + BuildAll/BuildQuick workflows + Cargo.toml + Cargo.lock)"
    rationale: "Same convention. Version Monitor caught v1.5.3 compat break on main; Phase 65 already eliminated the failing call site, so bump lands clean."
    handler: "/gsd:complete-milestone"
tech_debt:
  - phase: 67
    items:
      - "TECH-DEBT #25 — sibling `split_whitespace` sites in body_parser.rs (`parse_non_additive_dims`, `parse_window_spec OVER ORDER BY`); (c)-class structural-rewrite-required; surfaced by Phase 67 audit-grep"
      - "67-REVIEW.md WR-01 — `parse_single_table_entry` identifier walk regresses error path for `o AS PRIMARY KEY (id)` malformed DDL; minimal one-line fix in REVIEW; advisory follow-up via `/gsd-code-review 67 --fix`"
      - "67-REVIEW.md WR-02 — `ATTACH '{other_db_path}' AS db2` at `test_adbc_queries.py:470` missing the SQL-string escape applied to `extension_path` (IN-02); low practical risk (temp-dir path) but defense-in-depth inconsistent"
      - "67-REVIEW.md WR-03, IN-01..04 — minor code-quality items in body_parser.rs identifier-walk loop and sqllogictest cleanup"
nyquist:
  compliant_phases: 0
  partial_phases: 0
  missing_phases: 4
  overall: "not_enabled"
---

# Milestone v0.10.0 Audit — Connection-Lifecycle & Catalog-Context Fixes

**Audited:** 2026-05-27
**Status:** `tech_debt` — all 7 in-scope requirements satisfied; 4 REL-* items intentionally deferred to milestone close per project convention; 4 minor tech-debt follow-ups documented.

## Phase Summary

| Phase | Name | Status | Plans | Verification |
|-------|------|--------|-------|--------------|
| 65 | OverrideContext Connection Teardown | ✓ passed | 6/6 | 13/13 must-haves verified |
| 65.1 | Phase 65 Code Review Remediation | ✓ passed | 5/5 | 17/17 must-haves verified |
| 66 | Expansion Qualification + ADBC Tests | ✓ passed | 3/3 | 3/3 in-scope (REL deferred) |
| 67 | Expansion-SQL Coverage + Tech-Debt Cleanup | ✓ passed | 4/4 | 7/7 must-haves verified |

## Requirements Coverage

### Satisfied (7/11)

| Requirement | Phase | Evidence |
|-------------|-------|----------|
| LIFE-01 | 65 | 12/12 watchdog tests in `test/integration/test_readonly_load.py` |
| LIFE-02 | 65 | Per-call `Connection(*context.db)` in shim.cpp bind callbacks; `tests/no_long_lived_conn.rs` AST guard |
| LIFE-03 | 65 | 4 `test_in_process_bootstrap_then_readonly_*` D-03b tests landed |
| LIFE-04 | 65 | `.planning/milestones/v0.9.0-phases/63-readonly-database-load-support/deferred-items.md` marked RESOLVED with forward pointer |
| EXPAND-CTX-01 | 66 | 10 expansion emit sites migrated to `qualify_and_quote_table_ref` |
| EXPAND-CTX-02 | 66 | `test/integration/test_adbc_queries.py` 7/7 scenarios pass |
| EXPAND-CTX-03 | 66 | `_notes/error_with_adbc.md` updated with `## Resolution (v0.10.0)` |

### Deferred to Milestone Close (4/11)

| Requirement | Description | Current State |
|-------------|-------------|---------------|
| REL-01 | CHANGELOG.md `[0.10.0]` section | `[Unreleased]` empty (placeholder text) |
| REL-02 | Version bump to 0.10.0 | `Cargo.toml` + `description.yml` still on `0.9.0` |
| REL-03 | v0.10.0 example file in `examples/` | Not yet created |
| REL-04 | DuckDB dep bump v1.5.2 → v1.5.3 | `.duckdb-version` = `v1.5.2`; `Cargo.toml` = `=1.10502.0` |

These are explicitly excluded from phase scope per project convention (`feedback_defer_release_tasks.md`) and handled by `/gsd-complete-milestone`.

## Cross-Phase Integration

All cross-phase wiring verified (0 broken, 11 wired). Key paths:

- **Phase 65 → 66:** Per-call `Connection(*context.db)` model architecturally independent of qualified emission; `database_name`/`schema_name` captured at CREATE time via `current_database()`/`current_schema()` SQL literals stored in `_definitions` catalog. WIRED.
- **Phase 66 → 67:** sqllogictest fixtures (`phase67_qualified_emission.test`, `phase47/48/46` shape pins) correctly assert the emission shape that Phase 66 actually produces. WIRED.
- **Phase 65 → 67:** Phase 67 Plan 02 `find_identifier_end` port into `body_parser.rs::parse_single_table_entry` operates on string parsing only; no overlap with Phase 65's parser_override slimming work. WIRED.

## E2E Flows

| Flow | Status |
|------|--------|
| LOAD → CREATE → close → RO reopen → SELECT via ADBC across 5 view shapes (basic + FACTS + semi-additive + window + multi-DB) | ✓ Complete (test_adbc_queries 7/7 + test_readonly_load 12/12) |
| Cross-conn expansion qualification at every emit site | ✓ Complete (sqllogictest 60/60 with phase67 fixtures + ADBC 7/7) |

## Tech Debt (Non-Blocking)

1. **TECH-DEBT #25** — Sibling whitespace-tokenisation sites in `body_parser.rs::parse_non_additive_dims` and `parse_window_spec OVER ORDER BY`. Classified as (c)-class structural-rewrite-required by Phase 67 audit-grep. Same bug class as the now-resolved #24, but at sites where the surgery is non-trivial. Deferred.
2. **WR-01 from 67-REVIEW.md** — `parse_single_table_entry` identifier walk regresses error message quality for malformed `o AS PRIMARY KEY (id)` DDL (now produces "table 'PRIMARY' does not exist" instead of "Missing physical table name after AS"). Success path unaffected. One-line fix in REVIEW. Apply via `/gsd-code-review 67 --fix` if desired before tag.
3. **WR-02 from 67-REVIEW.md** — `ATTACH '{other_db_path}' AS db2` at `test_adbc_queries.py:470` missing the SQL-string escape applied to `extension_path` at line 100 (IN-02 hardening). Low practical risk (temp-dir paths under user control), but defense-in-depth parity broken. Apply for consistency before tag.
4. **WR-03 + IN-01..04 from 67-REVIEW.md** — Minor code-quality items: dead dot-consumption loop arm, unterminated-quoted-name handling, missed test coverage cells, default-schema cleanup gaps in `phase67_quoted_source_tables.test`. None integration-relevant.

## Security

- Phase 67 SECURITY.md: 7/7 threats CLOSED (5 accept + 2 mitigate verified). No open threats.
- Phase 65/65.1/66 did not produce SECURITY.md files. Pre-Phase-67 phases run under the prior workflow that didn't auto-emit SECURITY.md; threat models in PLAN.md were verified at the PLAN level. Not a blocker.

## Nyquist Coverage

Project does not run Nyquist validation (`workflow.nyquist_validation` absent → default-enabled but no `*-VALIDATION.md` artifacts produced by any phase in this milestone). 4 phases would show MISSING under strict Nyquist accounting; pragmatically, the milestone's quality gate is `just test-all` (Rust + sqllogictest + DuckLake CI + ADBC + concurrent + readonly), which passes 0-failure post Phase 67 merge.

## Verdict

`tech_debt` — milestone is functionally complete and integration-clean. The 4 REL-* items are the proper milestone-close work, not gaps. The 4 tech-debt items are minor follow-ups that don't block tagging.

## Recommended Path to Tag

1. (Optional) Apply WR-01 + WR-02 fixes via `/gsd-code-review 67 --fix` for hygiene.
2. `/gsd-complete-milestone v0.10.0` to drive REL-01..04:
   - REL-01: CHANGELOG.md `[0.10.0]` section folding LIFE + EXPAND-CTX bullets.
   - REL-02: Version bump in Cargo.toml + description.yml; re-run `just test-all` + `just ci`.
   - REL-03: New `examples/connection_lifecycle_and_qualified_expansion.py` (or similar) demoing the read-only-reopen + multi-DB ATTACH story.
   - REL-04: DuckDB dep bump v1.5.2 → v1.5.3 (`.duckdb-version`, BuildAll/BuildQuick CI YAML, Cargo.toml versions, Cargo.lock).
3. Tag `v0.10.0` and push.
4. `just clean-stale` per CLAUDE.md milestone protocol.
