Walkthrough

Step 06 — Act: improve the process

05 Check · Index · next: 07 Cross-cutting →

Beat: Act. Touch point #3, and the last one. Plan/Do/Check operate on one contribution. Act operates on the process itself, across many completed cycles, on its own cadence (every N cycles, or weekly — not per-cycle). It's what closes the PDCA loop: turning what several cycles exposed into a permanently better baseline, so the next Plan starts from firmer ground.

Two parts follow: how to use it — the commands, and two real process deltas it produced — then how it works underneath: the leaf, what it reads (and explicitly refuses to do), where a delta can land, and the cadence that keeps it from firing on noise.

How to use

pdca act index                              # read-only: frozen cycles + recurring signals
pdca act log --date 2026-06-12 --append     # scaffold a dated entry into process/act-log.md

Act reads the COMPLETE bundles' SUMMARYs — especially §6 (what needed a human), §7 (what stayed unproven), and §10 (Act candidates the cycle flagged) — looking for patterns. A one-off is noise; the same gap across three cycles is a process defect.

A real Act entry

This is from gramps-testbed-v2/process/act-log.md (2026-06-12), and it's the clearest demonstration of why the beat exists. A maintainer reviewing the glade-setattr cycle's published PR was asked to list a new .py file in po/POTFILES — a documented rule no gate owned:

# Act review — 2026-06-12 — cycles considered: glade-setattr (PR #2356 review feedback)

## What the cycles' records exposed
- A documented doc-16 MUST with no owner in the cycle — surfaced by a maintainer
  at review, not by any gate. Nick-Hall asked for the new test file to be listed
  in `po/POTFILES.{in,skip}`. The rule is explicit and sourced ... It is not
  exotic — it simply has no encoding in our T1–T4 ladder.
- The omission fell through every beat. Plan: the brief never stated the
  obligation. Do: the builder has no independent doc-16 checklist. Check/gates:
  T1 is addon-only; T2 checks file *shape*; T4 checks the commit/PR *wrapper* —
  none implement doc 16 §Translation Files. New-file→manifest registration falls
  in the gap between T2 (shape) and T4 (wrapper); neither owns it.

## Process deltas (candidates — routed for engineering, NOT applied here)
- Gate (highest-value): add a bundle-scoped, deterministic check — for a *core*
  bundle whose `patch.diff` adds a `.py` file, assert it appears in
  `po/POTFILES.in` or `po/POTFILES.skip`. Directly implements doc 16:99-100, is
  target-aware (core-only), and needs no Docker. Home: extend `t2_shape.py`.

Trace the loop: a human review comment (§ outside the gates) → Act generalizes it ("this will recur on every core bundle that adds a file") → a concrete process delta (a new gate) → which, once built, means the next cycle's gates catch it automatically instead of a maintainer catching it at review. That is the "→ back to Plan with a better baseline" arrow made operational.

Another entry shows Act tightening the spec, not the gates — the issue_8653 cycle shipped a test that exercised a hand-ported copy of production rather than production itself; only the human's T5 judgment caught it:

- Reference (applied): new principle §3.4 — test the production path: the success
  evidence MUST exercise the production path; a parallel re-implementation that
  mirrors production is not acceptable evidence. (docs/principles.md §3.4)
- Spec template (applied): brief Test file field now reminds that the test must
  drive the production path, not a parallel copy. (templates/brief.md.tpl)

That second delta is now also a mechanical check you can wire in: the reference scripts/checks/test_exercises_production.py (a [[gates.checks]] example, issue #154) asserts each added test file imports the production package and declares itself UNVERIFIABLE → §6 when it can't — promoting "test the production path" from a human-only T5 judgment to a deterministically-surfaced one.

Closing the loop — the process-delta ledger

A delta is only worth anything if it works. Act keeps a process/act-ledger.json: each recurring signal it surfaces is tracked open; once you land the fix you run

pdca act resolve "<signal>" --location <path:line>

to mark it applied; and on a later review Act flags any applied delta whose miss recurs in a cycle frozen after the applied date — a loud "⚠ Ineffective deltas" section in act index / the act log scaffold. So Act audits its own prescriptions instead of writing them and forgetting.


How it works

The leaf Act uses

Act has one leaf — act, interactive, like planner and signoff: the human touch point is the whole beat, not a step inside it. The leaf instruments the process — presenting the bundle index and recurring-signal candidates — but pdca act index's pattern-detection and the ledger are pure code; the leaf only helps you draft the dated entry.

What Act reads, and what it explicitly does not do

Act reads COMPLETE bundles only — frozen records, never anything in-flight. What it explicitly does not do: re-decide any disposition, re-run the suite, or write the next brief. It generalizes a pattern into a candidate delta; a human still judges what to actually change (what rule to add, which template field to revise, whether to retire a check) — the bundle index surfaces patterns, the human decides.

Where deltas land

Act deltas land in five places: the spec template (a brief field), the ruleset (a written rule), the gates (a new/promoted check), the agent role prompts (agents/*.md), or the orchestration (driver/state). Each is a permanent improvement to the baseline every future cycle starts from — the next Do should not recreate the issue the previous Act tried to eliminate; if it does, the Act wasn't effective (which is exactly what the ledger's "⚠ Ineffective deltas" check is for).

Cadence — why Act doesn't fire every cycle

[driver].act_cadence (default 5) is why "every N cycles, not per-cycle" is a real mechanism, not just a suggestion: pdca flow auto-runs Act only once this many cycles have frozen since the last Act review, counted across flow invocations (five separate one-bundle flows trip it on the fifth, same as one five-bundle batch would). Below the threshold, a flow skips Act with a hint instead of running it on too little evidence to show a pattern; pdca act log still runs it on demand any time, and --no-act always forces a skip. Set act_cadence = 1 to restore "run after every completed flow."

The loop, closed

flowchart LR Plan --> Do --> Check --> signoff["(sign-off)"] --> COMPLETE --> publish["publish (draft PR)"] COMPLETE -.-> Act["Act<br/><small>every N cycles: turn recurring<br/>misses into spec/gate/rule deltas</small>"] Act -.-> Plan

You've now walked one contribution from a tracker issue to a merged, signed-off, verified fix — and seen how the cycle feeds its own improvement. To do it for real, go back to step 01 and render the harness into your own project; the reference spec in ../template/PCDA/quality-cycle/ is there when you want the why behind any beat.

One more thing worth knowing before you go: three mechanisms — sizing/splitting an oversized brief, how an iterate actually archives and carries context forward, and running several cycles concurrently — cut across every beat above rather than belonging to one of them. Step 07 covers them.

05 Check · Index · next: 07 Cross-cutting →