---
phase: 63
plan: 04
type: execute
wave: 3
depends_on: [63-02, 63-03]
files_modified:
  - Cargo.toml
  - description.yml
requirements: [REL-01]
autonomous: true

must_haves:
  truths:
    - "`grep -nE '^version = \"0\\.9\\.0\"$' Cargo.toml` returns exactly 1 match."
    - "`grep -nE '^  version: 0\\.9\\.0$' description.yml` returns exactly 1 match."
    - "`just test-all` exits 0 on the final post-bump build."
    - "`just ci` exits 0 on the final post-bump build."
    - "Working tree is clean after the bump commit (no uncommitted changes that would block the human-driven `git tag v0.9.0` step)."
  artifacts:
    - path: "Cargo.toml"
      provides: "version = \"0.9.0\""
      contains: "0.9.0"
    - path: "description.yml"
      provides: "extension.version: 0.9.0"
      contains: "0.9.0"
  key_links:
    - from: "Cargo.toml"
      to: "CHANGELOG.md"
      via: "version string matches CHANGELOG ## [0.9.0] section"
      pattern: "0\\.9\\.0"
    - from: "description.yml"
      to: "Cargo.toml"
      via: "version field mirrors crate version"
      pattern: "version: 0\\.9\\.0"
---

<objective>
Bump versions to `0.9.0` in `Cargo.toml` and `description.yml`, then run the final `just test-all` + `just ci` to confirm a tagged-release-ready state.

Tag creation (`git tag v0.9.0`) and the squash-merge to `main` are OUT OF SCOPE for execute-phase — they are explicitly maintainer-driven steps per the v0.5.4 release recipe pattern (justfile:203+ runs on `main` only, after merge). This plan ends with a clean working tree on `milestone/v0.9.0` and a SUMMARY flagging the maintainer-action items.

Purpose: REL-01 — version artefacts must reflect the milestone version BEFORE the tag is cut, so the tag SHA matches the version string, so the CE registry release recipe (`just release` on main) can consume the bumped `description.yml`.

Output: Two file changes + final green `just ci`. SUMMARY explicitly enumerates the remaining maintainer steps (verify tests, squash-merge, tag, push tag, run `just release`).
</objective>

<execution_context>
@$HOME/.claude/get-shit-done/workflows/execute-plan.md
@$HOME/.claude/get-shit-done/templates/summary.md
</execution_context>

<context>
@.planning/PROJECT.md
@.planning/REQUIREMENTS.md
@.planning/phases/63-readonly-database-load-support/63-RESEARCH.md
@.planning/phases/63-readonly-database-load-support/63-01-PLAN.md
@.planning/phases/63-readonly-database-load-support/63-02-PLAN.md
@.planning/phases/63-readonly-database-load-support/63-03-PLAN.md
@CLAUDE.md
@Cargo.toml
@description.yml

<interfaces>
<!-- Current version strings the executor mutates -->

Cargo.toml line 3 (current):
```toml
version = "0.8.0"
```

description.yml lines 1-12 (current):
```yaml
extension:
  name: semantic_views
  description: "Semantic views ..."
  version: 0.8.0
  language: Rust
  build: cargo
  ...
```

Note: description.yml's `repo.ref:` is set by `just release` on the main branch using the post-tag commit SHA. Do NOT touch `repo.ref:` here — leave it at the existing pre-release value. The maintainer's `just release` run handles ref bumping.
</interfaces>
</context>

<tasks>

<task type="auto">
  <name>Task 1: Bump version in Cargo.toml from 0.8.0 to 0.9.0</name>
  <files>Cargo.toml</files>
  <read_first>
    - Cargo.toml (lines 1-15 — package metadata block)
    - CLAUDE.md (Milestone Completion: bump Cargo.toml + description.yml before tagging)
  </read_first>
  <action>
    Change line 3 of `Cargo.toml` from:

    ```toml
    version = "0.8.0"
    ```

    to:

    ```toml
    version = "0.9.0"
    ```

    Notes:
    - Do NOT touch any other line in `Cargo.toml`. The `[features]`, `[dependencies]`, etc. sections remain unchanged.
    - This single-character bump triggers `cargo build`'s lockfile regeneration on the next build; that is expected.
  </action>
  <verify>
    <automated>grep -cE '^version = "0\.9\.0"$' Cargo.toml</automated>
  </verify>
  <acceptance_criteria>
    - `grep -nE '^version = "0\\.9\\.0"$' Cargo.toml` returns exactly 1 match (the line being changed).
    - `grep -nE '^version = "0\\.8\\.0"$' Cargo.toml` returns 0 matches (old version is gone).
    - `git diff Cargo.toml` shows exactly one removed line (`version = "0.8.0"`) and one added line (`version = "0.9.0"`); no other changes.
    - `cargo build --no-default-features --features bundled` succeeds (compile sanity check; lockfile regenerates if needed).
  </acceptance_criteria>
  <done>
    - Cargo.toml version bumped.
    - Build still compiles cleanly.
  </done>
</task>

<task type="auto">
  <name>Task 2: Bump version in description.yml from 0.8.0 to 0.9.0</name>
  <files>description.yml</files>
  <read_first>
    - description.yml (full file — top-level `extension:` block)
    - CLAUDE.md (description.yml is part of the milestone bump checklist)
    - justfile lines 220-232 (the `release` recipe sed-edits both `version` and `ref`; we touch ONLY `version` here)
  </read_first>
  <action>
    Change line 4 of `description.yml` from:

    ```yaml
      version: 0.8.0
    ```

    to:

    ```yaml
      version: 0.9.0
    ```

    Notes:
    - Do NOT touch `repo.ref:` (line 15) — that is sed-edited by `just release` after the tag is cut.
    - Do NOT touch the `docs.hello_world:` or `docs.extended_description:` blocks.
    - YAML indentation must remain exactly two spaces (matches existing file).
  </action>
  <verify>
    <automated>grep -cE '^  version: 0\.9\.0$' description.yml</automated>
  </verify>
  <acceptance_criteria>
    - `grep -nE '^  version: 0\\.9\\.0$' description.yml` returns exactly 1 match.
    - `grep -nE '^  version: 0\\.8\\.0$' description.yml` returns 0 matches.
    - `git diff description.yml` shows exactly one removed line (`  version: 0.8.0`) and one added line (`  version: 0.9.0`); no other changes (especially NOT `repo.ref`).
    - YAML still parses: `python -c "import yaml; yaml.safe_load(open('description.yml'))"` exits 0 (yaml is in the standard examples-time deps).
  </acceptance_criteria>
  <done>
    - description.yml version field bumped.
    - repo.ref untouched (left for `just release`).
    - YAML still parses.
  </done>
</task>

<task type="auto">
  <name>Task 3: Final `just test-all` and `just ci` to confirm tag-ready state</name>
  <files></files>
  <read_first>
    - Cargo.toml (post-Task 1)
    - description.yml (post-Task 2)
    - CLAUDE.md (Quality Gate: `just ci` is the pre-push gate)
    - feedback_no_tail_on_long_commands (redirect to $TMPDIR)
    - feedback_no_parallel_builds (foreground only)
  </read_first>
  <action>
    Final pre-tag green build, IN FOREGROUND, redirecting per `feedback_no_tail_on_long_commands`:

    1. `git branch --show-current` — must output `milestone/v0.9.0`. If it doesn't, STOP and surface the branch mismatch in the SUMMARY (do NOT proceed to commit on the wrong branch).

    2. `just test-all > $TMPDIR/phase63_release_test_all.log 2>&1; STATUS=$?; tail -n 80 $TMPDIR/phase63_release_test_all.log; exit $STATUS` — must exit 0. This re-validates the full chain (Rust unit tests, sqllogictest including `readonly_load.test`, DuckLake CI, vtab crash, caret, ADBC, large-view, multi-DB, **read-only**, concurrent) against the version-bumped binary.

    3. `just ci > $TMPDIR/phase63_release_ci.log 2>&1; STATUS=$?; tail -n 80 $TMPDIR/phase63_release_ci.log; exit $STATUS` — must exit 0. Lint + test-all + check-fuzz + docs-check.

    4. `git status --short` — should show exactly two modified files (`Cargo.toml`, `description.yml`) and no untracked files (the SUMMARY.md files from Plans 01-04 are committed by their respective plans). Verify no stray `Cargo.lock` change is present beyond the version-bump-induced one — `git diff Cargo.lock | head -20` should show only the `name = "semantic_views"` version line changing if Cargo.lock is tracked, otherwise no Cargo.lock diff at all.

    If any step fails:
    - `just test-all` regression → identify the failing test from the tail output, root-cause it, do NOT bypass. Common cause at this stage: a docs-only change in Plan 03 accidentally referenced something this build doesn't have, or Plan 02's integration test depends on a Plan 03 file (it shouldn't — verify dependencies).
    - `just ci` lint failure → `cargo fmt`, fix clippy. Cargo-deny advisory failure → investigate the new advisory, do NOT bypass.
    - Branch mismatch → STOP and report.
  </action>
  <verify>
    <automated>just ci > $TMPDIR/phase63_final_ci.log 2>&1; STATUS=$?; tail -n 50 $TMPDIR/phase63_final_ci.log; exit $STATUS</automated>
  </verify>
  <acceptance_criteria>
    - `git branch --show-current` outputs exactly `milestone/v0.9.0`.
    - `just test-all` exits 0; tail output shows `test-readonly` ran with `SUMMARY: 3/3 tests passed`.
    - `just ci` exits 0.
    - `git status --short` lists only `M Cargo.toml`, `M description.yml`, and (acceptable) `M Cargo.lock` if the workspace tracks it.
    - No untracked planning files (the four SUMMARY.md files from Plans 01-04 should already be committed by their respective plans).
  </acceptance_criteria>
  <done>
    - Working tree is clean except for the two version-bump file modifications.
    - All gates green.
    - Branch verified.
  </done>
</task>

</tasks>

<threat_model>
## Trust Boundaries

| Boundary | Description |
|----------|-------------|
| Version string in Cargo.toml → published artefact name | A wrong version here ships with the wrong file name; CE registry rejects mismatched ref/version pairs. |
| description.yml.version → CE registry submission | The `just release` recipe on `main` consumes this verbatim. |

## STRIDE Threat Register

| Threat ID | Category | Component | Disposition | Mitigation Plan |
|-----------|----------|-----------|-------------|-----------------|
| T-63-R1 | Tampering | Wrong branch at commit time would land version bump on `main` or another milestone branch | mitigate | Task 3 step 1 explicitly checks `git branch --show-current` BEFORE the commit and aborts on mismatch. The user's MEMORY.md feedback_worktree_isolation explicitly flags branch-switching as a recurring concern. |
| T-63-R2 | Tampering | Accidental edit to `description.yml` `repo.ref:` field would point CE at the wrong commit SHA | mitigate | Task 2 explicitly forbids touching `repo.ref:` and Task 3 step 4 verifies the diff is exactly the version line. The maintainer's `just release` recipe owns ref bumping. |
| T-63-R3 | Repudiation | Plan declares "tag-ready" without running the full quality gate | mitigate | Task 3 runs the FULL `just ci` chain (lint + test-all + fuzz-compile + docs-check). |
| T-63-R4 | Information Disclosure | The bump commit message accidentally mentions internal phase identifiers | mitigate | Suggest commit message in SUMMARY: `chore: bump version to 0.9.0` — terse, user-facing, no GSD vocabulary. |
</threat_model>

<verification>
After all tasks complete:

1. `grep -n '^version = "0.9.0"$' Cargo.toml` — exactly 1 match.
2. `grep -n '^  version: 0.9.0$' description.yml` — exactly 1 match.
3. `git diff --stat Cargo.toml description.yml` — both files show changes; no other files touched (Cargo.lock acceptable if tracked).
4. `git branch --show-current` outputs `milestone/v0.9.0`.
5. `just test-all` exits 0.
6. `just ci` exits 0.
</verification>

<success_criteria>
- Both version artefacts bumped to `0.9.0`.
- `repo.ref:` in description.yml UNCHANGED (maintainer's `just release` owns it).
- Final `just ci` green.
- Branch verified as `milestone/v0.9.0`.
- Working tree clean except for the two intended file modifications.
</success_criteria>

<output>
After completion, create `.planning/phases/63-readonly-database-load-support/63-04-SUMMARY.md` documenting:

- Two version files bumped (Cargo.toml + description.yml) — diff stats.
- Confirmation `just test-all` and `just ci` green on the final post-bump build.
- Branch verified as `milestone/v0.9.0`.
- **MAINTAINER ACTIONS REQUIRED (out of scope for execute-phase):**
  1. Verify the SUMMARY against ROADMAP success criteria (use `/gsd-verify-work 63`).
  2. Squash-merge `milestone/v0.9.0` to `main`.
  3. On `main`, cut the tag: `git tag -a v0.9.0 -m "v0.9.0 — Read-Only Database LOAD Support"`.
  4. Push the tag: `git push origin v0.9.0`.
  5. Run `just release` (on `main`) to update `description.yml repo.ref:` to the merge SHA, commit, and open the CE registry PR.
- Hand-off: phase 63 implementation complete; ready for `/gsd-verify-work 63` then milestone close.
</output>
