ACF
acfstandard.io
Developer docs
FR
REASON

acf.assign-ddao-controls

ACF® control set scoped to an agent’s autonomy level and risk class, dual vocabulary (plain-English recommended_controls + canonical ddao_controls), estimated effort in days, and identified owners.

→Tip
The output deliberately splits recommended_controls (business language for sponsor and audit) from ddao_controls (canonical ACF® vocabulary for the DDAO). This duality is what makes the assignment legible internally AND defensible externally. requires_human_review stays constant, the DDAO validates the actual cadence before any commit.

When to use

Use this tool when an agent already has a delegated autonomy level (autonomy_level) and a criticality score (risk_level), and you now need the exact list of controls to enforce, what kill switches, what escalation thresholds, what logs, who owns each control, at what cadence it runs. This is the step that turns a qualification into an operational plan.

The board-level question the output answers: “How many DDAO-days does it cost, and who does what?” The estimated_total_effort_days gives a defensible order of magnitude for a financial sponsor; the recommended/ddao duality avoids vocabulary confusion between the business team and the DDAO.

Input parameters

Five fields, three required. The autonomy_level and risk_level must already be settled upstream (typically by acf.classify-agent or acf.assess-autonomy).

agent_descriptionstring (10-500)required
Short agent description. Used in the DDAO summary and rationale; does not drive the control selection (that is driven by level × risk).
autonomy_level"suggestive" | "co_decision" | "supervised_autonomous" | "autonomous"required
Delegated autonomy level for the decision: suggestive (the agent suggests, a human decides), co-decision (the agent proposes, a human validates), supervised autonomous (the agent decides under supervision), autonomous (the agent decides alone within its mandate). Drives the severity of the control set. Renamed from acf_level in 2.0.0.
risk_level"low" | "medium" | "high" | "critical"required
Risk class from the Criticality Matrix (ACF-03). Combined with autonomy_level, it determines the mapping cell.
budget_constraint"minimal" | "standard" | "comprehensive"
Budget constraint. minimal = keep the first two controls (kill switch + log); standard = full canonical set; comprehensive = full canonical set, no trim.
locale"en" | "fr"default: "en"
Language of the textual output (control titles, summary).

Output schema

The output is a structured object containing two parallel control lists, the total estimated effort, and a summary ready to paste into the mandate (ACF-13).

recommended_controlsRecommendedControl[]
Controls in business language, id, title, description, owner, frequency (one_time / monthly / quarterly / annual / on_event), evidence_storage. Trimmed to 2 if budget_constraint = minimal.
ddao_controlsstring[]
Same controls in canonical ACF® vocabulary, codes ACF-CTRL-XXX, each tied to its reference card. Ready to paste into the mandate (ACF-13).
total_countnumber
Total controls across both lists (recommended + ddao).
estimated_total_effort_daysnumber
Cumulative person-days based on each control’s frequency (one_time=5, monthly=1, quarterly=2, annual=4, on_event=1).
ddao_summarystring
Summary sentence ready to paste into the mandate (ACF-13) signed by the DDAO.
confidence"low" | "medium" | "high"
Global confidence level. High whenever (level, risk) is in the canonical matrix with no contradiction.
assumptionsstring[]
Explicit assumptions: V1.0 does not yet apply sector-specific overrides (a banking agent inherits the same controls as an e-commerce agent for the same level/risk pair).
gaps_to_validatestring[]
Gaps for the DDAO to validate, actual availability for the proposed cadence, evidence-storage location.
requires_human_reviewtrue
Constant. No call returns false.

Example call

A supervised autonomous procurement agent capped at 50k EUR, high criticality:

assign-controls.tstypescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";

const transport = new StdioClientTransport({
  command: "npx",
  args: ["-y", "acf-mcp"],
});
const client = new Client({ name: "demo", version: "1.0" }, {});
await client.connect(transport);

const result = await client.callTool({
  name: "acf.assign-ddao-controls",
  arguments: {
    agent_description:
      "Autonomous procurement agent that places purchase orders up to 50k EUR against pre-approved suppliers and writes the result to SAP.",
    autonomy_level: "supervised_autonomous",
    risk_level: "high",
    budget_constraint: "standard",
    locale: "en",
  },
});

console.log(JSON.stringify(result.content, null, 2));

Response

response.jsonjson
{
  "recommended_controls": [
    {
      "title": "Formal agent mandate",
      "description": "Mandate document signed by DDAO defining decision perimeter, escalation thresholds and kill switch.",
      "owner_role": "ddao",
      "frequency": "quarterly",
      "evidence_artifact": "agent-mandate.pdf"
    },
    {
      "title": "Kill switch quarterly drill",
      "description": "Test the agent freeze/redirect/revoke path on a non-production replay every quarter.",
      "owner_role": "ciso",
      "frequency": "quarterly",
      "evidence_artifact": "drill-report.pdf"
    },
    {
      "title": "Decision register",
      "description": "Immutable timestamped log of every decision with structured inputs, output, doctrine version.",
      "owner_role": "ddao",
      "frequency": "on_event",
      "evidence_artifact": "decision-register.jsonl"
    },
    {
      "title": "Quarterly risk review",
      "description": "Review of risk profile, drift metrics and incidents over the quarter.",
      "owner_role": "ddao",
      "frequency": "quarterly",
      "evidence_artifact": "risk-review-minutes.pdf"
    }
  ],
  "ddao_controls": [
    {
      "control_id": "ACF-CTRL-101",
      "control_type": "preventive",
      "fiche_reference": "ACF-13",
      "implementation_note": "Mandate templates calibrated by sector; review frequency tied to criticality."
    },
    {
      "control_id": "ACF-CTRL-102",
      "control_type": "corrective",
      "fiche_reference": "ACF-07",
      "implementation_note": "Kill switch with 3 levels: freeze (instant), redirect (≤5min), revoke (≤1h)."
    },
    {
      "control_id": "ACF-CTRL-103",
      "control_type": "detective",
      "fiche_reference": "ACF-09",
      "implementation_note": "Decision register format aligned with Article 49 register for high-risk systems."
    }
  ],
  "total_count": 7,
  "estimated_total_effort_days": 7,
  "ddao_summary": "Control set scoped to ACF® supervised_autonomous / risk=high (4 recommended controls, 3 ACF-canonical controls).",
  "confidence": "medium",
  "assumptions": [
    "Controls are derived from the canonical level × risk mapping; sector-specific overrides not applied in V1.0."
  ],
  "gaps_to_validate": [
    "Confirm DDAO availability for the proposed escalation cadence.",
    "Confirm evidence-storage location for each control before go-live."
  ],
  "requires_human_review": true,
  "rationale_per_rule": [
    {
      "rule_id": "ddao-controls-mapping.supervised_autonomous-high",
      "rule_version": "2026-06",
      "fired": true,
      "evidence": "level=supervised_autonomous, risk=high"
    }
  ],
  "doctrine_version": "ACF framework v1.0 / rules 2026-06",
  "doctrine_hash": "sha256:119819463363cde0649504ab8ed5a96982fdb8506441f2c5e76e7e3c3feb77f1",
  "doctrine_signature": "ed25519:3R0oIiqL3Kgd…",
  "doctrine_archive_url": "https://acfstandard.io/archive/doctrine/v1.0/doctrine-v1.0.json",
  "regulatory_snapshot": "EU AI Act (Reg. 2024/1689, incl. Digital Omnibus deferral) + GDPR (Reg. 2016/679) + DORA (Reg. 2022/2554) + NIS2 (Dir. 2022/2555) + ISO 42001:2023: as of 2026-06-07",
  "generated_at": "2026-11-01T12:06:31.046Z",
  "disclaimer": "Preliminary qualification produced by the ACF® deterministic engine. Not legal advice. Human review required. Do not use for autonomous regulatory decision-making. See doctrine_archive_url for the version of the doctrine used."
}

Common errors

  • Invalid parameters: autonomy_level outside the 4 levels (suggestive, co_decision, supervised_autonomous, autonomous), including the former acf_level N0..N3, or risk_level outside low / medium / high / critical. The call fails with a JSON-RPC error whose message lists the offending fields.
  • Low confidence: when few context fields are provided, confidence is low and assumptions states what was assumed. Complete the input before relying on the result.