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

3.3 KiB

id type title domain repo status flavor owner topic_slug created updated depends_on state_hub_workstream_id
RBT-WP-0008 workplan Runbook maturity, projects and idempotency infotech runbook-tutorials active implementation claude stack 2026-09-29 2026-09-29
RBT-WP-0007
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

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

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

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

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

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

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

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.