Skip to content

Governance & Decisions ​

The Governance domain makes decision rights explicit and mechanical. The Agentic Software Factory says the squad decides unless a decision is on a short list reserved for a named role. Coding Pal gives each reserved decision a record type and a validator, so that a record cannot claim a decision a person did not make.

AI may choose and accept decisions autonomously at every risk tier. Record Deciders: <identity> (Automation) and Signature: Automated by <identity> on YYYY-MM-DD, never a fabricated human signature. Human owners remain accountable for policy; they intervene on unresolved failures or exhausted retries, not routine sign-off.


Domain Architecture ​


Capabilities Matrix ​

CapabilityInvocation / Entry PointSpecialist AgentScoping InstructionSupporting SkillOutput Artifact
Decision Record/decisionDecision Scribedecision-recorddecision-recorddocs/decisions/<NNNN>-<slug>.md with explicit automated attribution after validation
Escalation/decision and escalations.mjs due in CIDecision Scribedecision-recorddecision-recorddocs/decisions/escalations/<YYYY-MM-DD>-<slug>.md
Sanctioned Toolsvalidate-meeting.mjs --sanctioned in CInone (policy file owned by the Architect)meeting-packmeeting-packdocs/governance/sanctioned-tools.md
Flow Metricsflow-metrics.mjs in CI or the retrospectivenonenoneflow-metricsmetrics/events.jsonl and its report: see Flow Metrics

Who Decides ​

Delivery agents decide autonomously within recorded constraints. The named roles below are accountable for policy and exceptions, not mandatory per-change approvers. Each row maps to the record and validator that provide evidence.

DecisionDecided byConsultedRecorded asCoding Pal primitiveValidator
What to build next inside the agreed outcomeProduct OwnerSquad, customersScorecard rowtriage triage.mdvalidate-triage.mjs --stage final
Whether to run an experimentProduct OwnerArchitectHypothesis entryhypothesis-ledgerledger.mjs validate
Implementation approach inside the squad's codeDeveloperArchitectPull requestthink & plan approach, codevalidate-think.mjs, validate-plan.mjs, validate-pr.mjs
Public contract or cross-service boundary changeArchitectOwning squadsDecision recorddecision-record, Type contract-changevalidate-decision.mjs
Data model change affecting other squadsArchitectAffected squadsDecision record + migration plandecision-record, Type data-model (Migration Plan)validate-decision.mjs
Security-sensitive change (auth, PII, billing)ArchitectDeveloper, squadReview record on the pull requestcode dual validation, prove (secret-guard, dependency-guard, control-guard); decision-record Type security when it sets lasting policyvalidate-pr.mjs, validate-prove.mjs, validate-decision.mjs
Adding a new runtime, database, or vendorArchitectDevOpsDecision recorddecision-record, Type runtime-vendorvalidate-decision.mjs
AI usage policy and model accessArchitectLegalPolicy versiondecision-record, Type ai-policy (the accepted record number is the policy version)validate-decision.mjs
Adopting a new model, agent, or prompt standardArchitectSquadsEvaluation reportdecision-record, Type model-adoption (Evaluation Report must exist)validate-decision.mjs --root .
Release of a customer-facing commitmentProduct OwnerArchitectChangelogrelease-plan (Customer Commitment, Changelog)validate-release.mjs
Rollback during an incidentDevOps or QA and maintainerNone: act firstIncident recordrelease-plan (Decided By), incident-recordvalidate-release.mjs
Deleting an invalidated featureProduct OwnerSquadLedger verdicthypothesis-ledger (Decided, Delete feature)ledger.mjs validate, ledger.mjs due

Capability Workflows ​

1. Decision Record ​

  • When to Run: When think.md has ## Decision Record with Required: yes (the approach alters a public API, changes a schema, or shifts service boundaries; a Critical blast radius always requires one), or when a decision in the table above is made outside a Think record. Interactively in the IDE (/decision specs/issue-42/think.md) or headlessly in CI.
  • Why a Contract: A narrative ADR hides whether alternatives were weighed and whether anyone with authority agreed. A fixed structure shows the options, the cons, and the signature at a glance, and a validator rejects what a model cannot be trusted to self-police.
  • Workflow Steps:
    1. Draft: Decision Scribe reads the Think record, picks the Type, takes the next free number, and writes docs/decisions/<NNNN>-<slug>.md with Status: Drafted and Signature: Drafted: unsigned.
    2. Validate:
      bash
      node .agents/skills/decision-record/scripts/validate-decision.mjs \
        --file docs/decisions/0007-rbac-service.md --think specs/issue-42/think.md
    3. Decide: After validation, the agent sets Accepted or Rejected with explicit Automation attribution. For an accepted decision, Think's decision Status becomes Automated by <identity> on YYYY-MM-DD. Human signatures remain supported only for actual human decisions.
    4. Gate: CI validates the whole directory on every pull request that touches docs/decisions/:
      bash
      node .agents/skills/decision-record/scripts/validate-decision.mjs --dir docs/decisions
    5. Reverse: A reversed decision is a new record with Supersedes: <NNNN>. The old record becomes Superseded; it is never edited or deleted.

What the Validator Enforces ​

CheckWhy
docs/decisions/<NNNN>-<slug>.md, 4-digit numbers unique and gap-freeA stable history that can be cited by number
Exact header fields, Type from the table, exact sections Context, Options, Decision, ConsequencesPredictable for the Architect and downstream agents
2 or more ### Option <N> blocks, each with real Pros and ConsA decision with one option was not a decision
Deciders include an Automation identity or an actual human ArchitectExplicit attribution, never impersonation
Drafted is unsigned; accepted decisions carry dated automation attribution or a real Architect signature matching DecidersAutomated approval is auditable, not a human sign-off
tooling: Native Alternatives Considered and Context PreservationThe factory's proof that a tool outside the core platform cannot be met natively and keeps AI context
data-model: Migration Plan. model-adoption: an Evaluation Report path that existsThe record names the evidence the governance table requires
Supersedes targets exist, are older, are superseded once, and carry the matching statusOne consistent history
--think: Required, a Record path that exists and validates, no Critical tier without a record, think Signed only for a human-signed recordThink cannot claim a signature the Architect did not give

2. Escalation ​

Escalate only for: cross-squad conflict, security exposure, compliance obligation, external commitment, or budget impact. An escalation names the decision, the options, the recommendation, and the date by which silence means the recommendation is adopted.

  • Record: docs/decisions/escalations/<YYYY-MM-DD>-<slug>.md with Decision, Options (2 or more), Recommendation, Default Date, Reason (one of the five), and Status (Open, Decided, Adopted by default). A Decided or defaulted escalation carries a Resolution naming the person, or the date it was adopted by default.
  • Weekly check:
    bash
    node .agents/skills/decision-record/scripts/escalations.mjs due --dir docs/decisions/escalations
    It lists Open escalations due within 2 days and exits 1 for any whose Default Date has passed: silence adopted the recommendation, and the record must say so.

3. Sanctioned Tools ​

Only tools on the sanctioned list may be used with company or client data. The list is docs/governance/sanctioned-tools.md, a Markdown bullet list owned by the Architect. Prose, headings, and # comments around the bullets are ignored.

markdown
# Sanctioned Tools

Tools approved for company and client data. A tool is added through a decision record of Type `tooling`.

- Sanctioned meeting tool  # enterprise tenant, DPA signed
- Another approved tool

The factory sanctions a tool only when it has enterprise tenancy, no training on submitted data, audit logging, SSO, and a signed data processing agreement. The decision record that adds the tool states how each requirement is met.

The first enforcement point is the meeting transcript. CI proves that the tool named in the transcript header is on the list:

bash
node .agents/skills/meeting-pack/scripts/validate-meeting.mjs \
  --dir meetings/2026-09-24-acme-discovery --sanctioned docs/governance/sanctioned-tools.md

A tool that is not listed fails with meeting tool is not on the sanctioned list.

4. Policy Kept in the Factory ​

Blast radius evidence, autonomous decision policy, auditability, retention, cost, and violations are defined in the Factory governance guide. Coding Pal supplies mechanical checks: tier validation in Think & Plan and Code, cost events in Flow Metrics, and incident records whose postmortem action becomes a guard, not a reminder (Deterministic Controls).

5. Anti-Patterns and the Control That Guards Them ​

Where a mechanical guard exists it is named. Policy means no script can enforce it; the factory relies on accountability and the monthly retrospective.

Factory anti-patternGuard in Coding Pal
Developers still writing code syntaxflow-metrics Human rework rate (pr.human_edit, target 0%) detects it; code keeps the Human Validation to intent, experience, and safety. Otherwise policy
Manual line-by-line syntax reviewscode (a Human Validation that claims a line-by-line review is rejected); flow-metrics validation turnaround shows reviewers slipping into reading (trend only, it never warns)
Skipping client meetings and building from stale ticketsmeeting-pack (confirmed packs only) and triage (verbatim, source-checked evidence)
The AI center of excellence that owns deliveryPolicy
Enablement as an approval boardPolicy. The mechanical alternative is a guardrail such as secret-guard, dependency-guard, or control-guard instead of a meeting
Technology-layer squadsPolicy
Skipping Planplan (a validated plan.md with testable acceptance criteria that every step serves) and code (validate-pr.mjs requires an approved plan.md and criteria traceability)
Weak deterministic controls ("Trust the model")control-guard (weakened or skipped tests, lowered thresholds, suppressions), secret-guard, dependency-guard; the full set is in Prove
Hand-fixing generated bugscontrol-guard (the bug rule: the new check is committed before the fix), flow-metrics Human rework rate (pr.human_edit), context-health (corrections become Persistent Context)
Uniform review effortthink & plan (one blast radius tier), code (tier-matched automated evidence; High/Critical retain rollback checks)
Batching releasesrelease-plan (exactly one issue per release)
Prompting instead of contextcontext-health (a topic corrected or re-explained twice needs an artifact)
The everything instructioncontext-health (instruction length limit, broad applyTo, near-duplicates)
Stale context left in placecontext-health (stale files, references to names that no longer exist)
Vibes-based rolloutPartial: decision-record Type model-adoption needs an Architect-signed record that links an evaluation report, and the validator checks that the file exists, not that the evaluation is rigorous. The rigor of the evaluation is policy
Agents with production credentialscontrol-guard R7 (an added production secret or environment: production in an agent or remediation workflow). release-plan states that no AI holds production credentials, but no script checks it beyond R7
Tool sprawl and context fragmentationdecision-record Type tooling (native alternatives, context preservation). meeting-pack --sanctioned covers only the meeting tool, against the sanctioned list. Other tools are policy
Counting output volumeflow-metrics has no event for lines of code, pull request counts, or suggestion acceptance
Never deleting anythinghypothesis-ledger (invalidated features not deleted in the cycle are listed), flow-metrics feature deletion rate
  • Falsifiable Done When:
    • validate-decision.mjs --dir docs/decisions exits 0: numbering has no gaps, every non-Drafted record carries an Architect signature, and every Superseded record is named by its successor.
    • Every AI decision carries explicit Automation attribution, valid evidence and date, never a forged human signature.
    • escalations.mjs due reports no overdue Open escalation.
    • validate-meeting.mjs --sanctioned accepts every transcript.

Published and maintained by ALTEN