runbook-tutorials/workplans/RBT-WP-0008-runbook-maturity-projects-and-idempotency.md
tegwick 2f60d47746
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 13s
Work Records / validate (push) Successful in 25s
Sync consistency output
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: sonnet
Assistant-Process: 295952@bnt-lap001
Assistant-Session: e93f64ad-516c-46eb-9666-aad8d300c477
2026-09-29 12:20:49 +02:00

111 lines
3.3 KiB
Markdown

---
id: RBT-WP-0008
type: workplan
title: "Runbook maturity, projects and idempotency"
domain: infotech
repo: runbook-tutorials
status: active
flavor: implementation
owner: claude
topic_slug: stack
created: "2026-09-29"
updated: "2026-09-29"
depends_on: [RBT-WP-0007]
state_hub_workstream_id: "8f11966b-1e6c-5b12-8bc4-a13c52307c4c"
---
## Goal
Separate what a runbook is (characteristics), how far it can be trusted (maturity, earned and bound to a
pack revision), and what state an environment is in (projects). Replaces the environment-dependent
`exercise_status`. Model and candidate terminology: `docs/maturity-and-projects.md`.
## Decide the terminology and model
```task
id: RBT-WP-0008-T01
status: progress
priority: high
state_hub_task_id: "904939c5-ed69-53a0-8fe1-2a0ae6d5337d"
```
Review `docs/maturity-and-projects.md` with Bernd: names (project or target, environment class), maturity
ladder and thresholds, project states, where project files live, retry policy for non-idempotent steps.
## Idempotency as a declared characteristic
```task
id: RBT-WP-0008-T02
status: done
priority: high
state_hub_task_id: "911ef051-ee55-5c65-b134-57fa9f1fddce"
```
Done 2026-09-29: `idempotent: idempotent | non-idempotent | conditional` (+ `idempotent_note`) per step in the v0.2
schema, validator rule for `conditional`, derived runbook value (`flow.pack_idempotency`), declared honestly in the
showcase. Values are words because YAML reads unquoted yes/no as booleans. Follow-ups: show it in the UI, and use
it for the retry policy (T07).
## Bind runs to a pack revision
```task
id: RBT-WP-0008-T03
status: wait
priority: high
state_hub_task_id: "a79e5b3d-221b-5ac6-a7a1-44737139c8f3"
```
Record a digest of the pack directory in every run so maturity and project state can be tied to the revision used,
and expire when it changes.
## Derive maturity from run history
```task
id: RBT-WP-0008-T04
status: wait
priority: high
state_hub_task_id: "53fe81cd-6b67-5508-bdbd-38073a0d77e7"
```
`draft`, `reviewed`, `rehearsed`, `proven`, `stale`, derived from clean runs (no deviations) in rehearsal and other
environments, replacing `exercise_status` and the "Record pack as exercised" click.
## Project specification and shared datapoints
```task
id: RBT-WP-0008-T05
status: wait
priority: high
state_hub_task_id: "d022c7fb-1421-5738-a00f-5b18593fb1a2"
```
`project.yaml`: environment class, shared non-secret datapoints provided as defaults to member runbooks, member
runbooks and ordering. Validator, and runs that belong to a project.
## Project state
```task
id: RBT-WP-0008-T06
status: wait
priority: medium
state_hub_task_id: "41f2b781-3699-5d21-bdfd-4ff3c2c0b777"
```
Derive `planned`, `applying`, `applied`, `stale` (later `drifted`) from each member's latest run at the current revision.
## Retry policy for non-idempotent steps
```task
id: RBT-WP-0008-T07
status: wait
priority: medium
state_hub_task_id: "8b34c57b-3380-5f7b-aaf5-6227a47dcf60"
```
Retrying a failed non-idempotent step requires the operator to confirm the earlier attempt did not partly apply.
## Acceptance Criteria
- "Exercised" has a precise, environment-aware meaning; a production project is never called "exercised".
- Maturity is derived from runs, bound to a revision, and expires when the pack changes.
- A value shared by several runbooks is entered once, in the project.