---
phase: 65.1-phase-65-code-review-remediation
plan: 06
subsystem: docs
tags: [changelog, keep-a-changelog, unreleased, user-facing, milestone-finisher, d-27]

# Dependency graph
requires:
  - phase: 65.1-phase-65-code-review-remediation
    provides: "All implementing plans landed (02a, 02b, 03a, 03b, 04, 05, 07, 08, 09, 10, 11, 12) — committed behaviour changes are now the source of truth for the CHANGELOG bullets (B-08 plan-checker fix: this plan runs last)"
provides:
  - "Populated `## [Unreleased]` section in CHANGELOG.md with 5 user-visible Phase 65.1 entries grouped under Keep-a-Changelog 1.1.0 categories (Changed / Removed / Fixed / Security)"
  - "Each bullet rolled up to user-facing language; no `WR-NN`, `CR-NN`, `IN-NN`, `D-NN`, or `Phase 65` jargon leaks"
  - "Bottom-of-file link reference `[Unreleased]: ...compare/v0.9.0...HEAD` left untouched — Phase 66 milestone-finisher will fold the Unreleased section into `## [0.10.0]` at tag time"
affects:
  - milestone-v0.10.0 (release notes content)
  - docs/changelog.md (renders Unreleased verbatim on docs site Release Notes page via MyST include)

# Tech tracking
tech-stack:
  added: []
  patterns:
    - "Rolled-up CHANGELOG bullet pattern: a single user-facing bullet aggregates the behaviour change from a set of GSD plans (e.g. the four Fixed entries each correspond to one finding but read as standalone behavioural deltas). The plan->bullet mapping is documented in PLAN.md acceptance criteria but never surfaces in the CHANGELOG text."
    - "Sequencing-last CHANGELOG plan (B-08 plan-checker fix): writing CHANGELOG bullets in the LAST wave after every implementing plan has landed avoids documenting a behaviour change that diverges from what shipped. The plan touches only CHANGELOG.md so wave dependency is purely informational."

key-files:
  created: []
  modified:
    - "CHANGELOG.md — Replaced `_No unreleased changes yet._` placeholder under `## [Unreleased]` with 5 categorised entries under `### Changed`, `### Removed`, `### Fixed`, `### Security` subheadings"

key-decisions:
  - "Keep-a-Changelog canonical category order (Added / Changed / Deprecated / Removed / Fixed / Security) applied — Unreleased currently has Changed → Removed → Fixed → Security (skipping unused Added / Deprecated subheadings, per the spec)."
  - "Bullet language disciplined to user-visible behaviour. Internal cleanups with no user impact (BorrowedConnection newtype, IN-04 FFI arg trim, IN-05 sqllogictest additions, IN-06 dedup) intentionally omitted per CONTEXT D-27 scope."
  - "Bottom link reference left untouched. Phase 66 milestone-finisher will rewrite the Unreleased section to `## [0.10.0] - <date>` and add `[0.10.0]: ...compare/v0.9.0...v0.10.0` at tag time."

metrics:
  duration: "<5 minutes"
  completed: "2026-05-26"
  tasks_completed: 1
  files_modified: 1
  loc_added: 18
  loc_removed: 1

requirements:
  - REM-CHG
---

# Phase 65.1 Plan 06: CHANGELOG `[Unreleased]` Population Summary

**One-liner:** Populated the `## [Unreleased]` section of `CHANGELOG.md` with five user-visible entries covering the Phase 65.1 code-review remediation work, grouped under Keep-a-Changelog 1.1.0 categories (Changed / Removed / Fixed / Security) with no GSD/phase-internal vocabulary in the bullet text.

## What Shipped

The plan was a single edit to `CHANGELOG.md`:

1. Located the `## [Unreleased]` section near the top of the file (between the doc-include marker and the most recent tagged version `## [0.9.0]`).
2. Replaced the placeholder `_No unreleased changes yet._` with structured content under four subheadings (the spec's `Added` and `Deprecated` categories are unused for Phase 65.1 and intentionally omitted per Keep-a-Changelog conventions).
3. Bullet text rolled up the behaviour deltas from the implementing plans into user-facing language without referencing finding IDs, plan numbers, decision IDs, or "Phase 65" chronology — the audience is end users reading the docs site Release Notes page (`docs/changelog.md` includes `CHANGELOG.md` verbatim via MyST).

### Entries added

- **`### Changed`** — One entry covering the WR-07 + WR-08 promotion of silent type-inference fallbacks (`VARCHAR` / `DECIMAL(18,3)`) into `Binder Error` hard failures. This is the only user-visible behaviour change in Phase 65.1 (the contract for queries that previously masked an underlying problem with the wrong column type now surfaces the underlying problem as a clear error).
- **`### Removed`** — One entry covering the IN-02 + IN-03 `type_cache` module + `type_id_to_display_name` helper purge (~317 LOC, no API impact).
- **`### Fixed`** — Four entries:
  - WR-03 — `DROP` / `ALTER SEMANTIC VIEW` on never-bootstrapped read-only DBs now reports the clean `semantic view 'X' does not exist` instead of leaking the underlying `Catalog Error: Table _definitions does not exist`.
  - WR-02 — Extension-load registration failures now route the underlying DuckDB exception message through to the user-visible error (previously dropped, leaving callers with a generic `Failed to register …` and no diagnostic).
  - WR-09 — `LOAD semantic_views` is idempotent: repeat loads in the same process no longer accumulate parser-extension hooks in `DBConfig`.
  - CR-02 — Removed defensive single-shot fallback branches in four table-function exec callbacks; registration now refuses callbacks without an `init_local`, so the invariant is enforced at registration time rather than papered over per call.
- **`### Security`** — One entry covering the CR-01 SQL-injection elimination in `CREATE SEMANTIC VIEW v FROM YAML FILE '<path>'` (path argument now read via DuckDB's `FileSystem` API directly, removing the `SELECT content FROM read_text('…')` indirection).

### Entries intentionally excluded (per CONTEXT D-27 scope)

The following Phase 65.1 work is internal-only and ships silently:
- **BorrowedConnection newtype + 17-site migration** (WR-05 / 03a + 03b) — type-level enforcement of BORROW contract; no API surface change.
- **WR-04** — concurrent-writes integration test scaffold (`test_concurrent_writes_per_call_conn.py`); test addition only.
- **WR-06** — bridge-contract `static_assert` + load-time runtime probe; only fires if the DuckDB ABI breaks underneath us.
- **IN-04** — `__sv_compute_create_from_yaml` FFI `kind: u8` arg trim; helper TF is private (`__sv_*` prefix).
- **IN-05** — null-name input sqllogictest assertions; test addition only.
- **IN-06** — duplicate `probe_catalog_table_present` + `write_err` deletion; pure internal dedup.

## Verification

All plan-defined sanity checks pass:

```
$ grep -n "^## \[Unreleased\]" CHANGELOG.md
10:## [Unreleased]

$ grep -n "^### Security" CHANGELOG.md
27:### Security
(only one in the file)

$ grep -n "^### Changed" CHANGELOG.md   # Unreleased adds line 12; tagged versions follow
12:### Changed
68:### Changed
...

$ grep -E "(WR-0|CR-0|IN-0|Phase 65|STRIDE|D-2[0-9])" CHANGELOG.md | grep -v "^\["
(no matches — no GSD vocab leaks in bullet text)

$ grep -q "FileSystem" CHANGELOG.md && grep -q "Binder Error" CHANGELOG.md && grep -q "type_cache" CHANGELOG.md && grep -q "idempotent" CHANGELOG.md
(plan automated verify: PASS)
```

Bottom-of-file `[Unreleased]: …compare/v0.9.0…HEAD` link reference left untouched as specified — Phase 66 milestone-finisher will rewrite this when the version tag is cut.

## Deviations from Plan

None — plan executed exactly as written. The plan was a single CHANGELOG edit and the entries match the wording template in `65.1-PLAN.md` task 1 verbatim (with minor tightening for readability).

## Commit

- `a05c672` — `docs(65.1-06): populate Unreleased section with phase 65.1 entries`

## Self-Check: PASSED

- [x] FOUND: `CHANGELOG.md` (modified — `## [Unreleased]` populated with 5 entries)
- [x] FOUND: commit `a05c672` in `git log`
- [x] FOUND: `### Security` subheading at CHANGELOG.md:27
- [x] FOUND: `### Changed` subheading at CHANGELOG.md:12 (Unreleased)
- [x] FOUND: `### Fixed` subheading at CHANGELOG.md:20 (Unreleased)
- [x] FOUND: `### Removed` subheading at CHANGELOG.md:16 (Unreleased)
- [x] CHECKED: No GSD vocabulary (`WR-`, `CR-`, `IN-`, `Phase 65`, `D-2N`) in bullet text
- [x] CHECKED: Bottom link reference `[Unreleased]: ...compare/v0.9.0...HEAD` unchanged
