Files
2026-07-13 12:40:00 +08:00

76 lines
2.4 KiB
Markdown

# Attestation Locking and Fallback
`scripts/attest-plan.sh` stores a SHA-256 hash for the active `task_plan.md`.
Hooks compare the current file hash with that stored attestation before they
inject plan content into model context.
## Write path
When you run `sh scripts/attest-plan.sh`, the script:
1. Resolves the active plan directory.
2. Hashes the active `task_plan.md`.
3. Writes the hash to a temporary file beside the attestation file.
4. Renames the temporary file into place.
5. Uses `flock -w 5` around the rename when `flock` is available.
The atomic rename is the correctness guarantee. It prevents readers from seeing
a partially written attestation file. The `flock` call is only a cooperative
gate for concurrent writers on systems that provide it.
## Platform behavior
| Platform | `flock` availability | Behavior |
|----------|----------------------|----------|
| Linux | Usually available | Atomic rename plus advisory `flock` guard. |
| macOS | Not installed by default | Atomic rename still protects correctness. |
| Windows Git Bash | Usually absent | Atomic rename still protects correctness. |
| WSL | Usually available | Same behavior as Linux. |
If `flock` is missing, `attest-plan.sh` skips the advisory lock and still
renames the temporary file into place. This is correct, but less coordinated
for multiple writers in the same directory.
## When fallback matters
The fallback only matters for legacy mode when two sessions write the same root
attestation file:
```text
./task_plan.md
./.plan-attestation
```
In that mode, both sessions share one plan file and one attestation file. The
atomic rename keeps the attestation file valid, but it does not make the shared
plan file a safe parallel workspace.
## Recommended parallel workflow
Use slug-mode for parallel sessions:
```bash
./scripts/init-session.sh "Backend Refactor"
./scripts/init-session.sh "Incident Investigation"
```
Each slug gets its own isolated files:
```text
.planning/2026-01-10-backend-refactor/task_plan.md
.planning/2026-01-10-backend-refactor/.attestation
.planning/2026-01-10-incident-investigation/task_plan.md
.planning/2026-01-10-incident-investigation/.attestation
```
Pin a terminal to one plan when needed:
```bash
export PLAN_ID=2026-01-10-backend-refactor
sh scripts/attest-plan.sh
```
Slug-mode avoids same-file contention by giving each session its own
`task_plan.md` and `.attestation` file.