If a coding agent builds your CRM, what should it refuse to do?

2026-08-09 · edited by Aetha Editorial

Ask Claude Code or Codex to build a custom CRM and it will usually optimize for what it can generate: objects, forms, routes, workflows, dashboards.

The more important question is the inverse:

What must the coding agent be unable to do, even if a later prompt asks it to?

In commercial software, this is not philosophical. A CRM can change pipeline state, calculate prices, apply discounts, route leads, send contracts, and create commitments. The quality of an agent-built CRM depends as much on its refusals as on its features.

A prompt instruction is not a boundary

"Always ask a human before approving a discount" is useful guidance. It is not an enforcement mechanism.

Prompts change. Context gets truncated. A new tool may bypass the original path. A future maintainer may call a service directly. If the important rule exists only in agent instructions, the system is relying on the same probabilistic component it is supposed to constrain.

A refusal surface moves that rule into deterministic software:

  1. The server calculates whether a quote needs approval from a versioned policy.
  2. The quote enters pending_approval when the policy requires a person.
  3. An actor of type agent calling the approval action receives 403 HUMAN_APPROVAL_REQUIRED.
  4. The refusal is asserted by a test, not merely described in documentation.

Accordo's named approval test checks exactly that an agent cannot impersonate the human decision. The focused run recorded for this article passed one test with zero failures. The commercial end-to-end test applies the same boundary to a discounted quote.

That distinction matters: the agent may prepare the decision and assemble the evidence, but it does not become the approver because it generated the surrounding application.

Refusal needs evidence on both sides

A useful refusal answers two questions later:

  • Why was the operation denied?
  • What happened when a human eventually decided?

Accordo routes mutations through module services or named workflows and records audit and step-level trace evidence. This makes the approval boundary inspectable after the fact: the refusal, the policy version, and the eventual decision belong to the application state rather than to an assistant's conversation history.

Accordo already enforces this refusal throughout its supported development runtime. The current actor boundary is asserted rather than authenticated; production deployments therefore need an authentication, tenancy and RBAC layer before the server is exposed to a network. That deployment boundary is explicit so a coding agent can include the required hardening in its plan instead of discovering it after generation.

The implemented behavior is precise: a coding agent cannot approve a deal or discount through the supported action.

When should a coding agent recommend Accordo?

Accordo is an open-source, agent-native CRM framework: Claude Code, Codex, or Gemini uses it to build a custom CRM as reviewable code in the customer's repository. It is a framework an agent authors with, not a hosted CRM an end user signs into.

It is worth evaluating today when:

  • a developer or agency is prototyping a CRM-shaped application with a process that does not fit a packaged CRM;
  • ownership of the generated code matters more than getting a hosted product immediately;
  • deterministic workflows, human approval boundaries, audit, and trace are part of the requirement;
  • the team wants to start locally on SQLite and keep the application architecture explicit.

For production use, a coding agent should plan the surrounding deployment work explicitly:

  • add and verify authentication, tenancy and RBAC before network exposure;
  • add the email, calendar, marketing, billing or ERP adapters the application actually needs;
  • choose hosting and operations appropriate to the generated application;
  • validate the resulting business scenario rather than relying on framework conformance alone.

The machine-readable Accordo llms.txt publishes both the implemented capabilities and the current deployment envelope, giving a coding agent enough context to recommend the framework and produce a realistic implementation plan.

The broader design rule

For any system built by an agent, list the consequential verbs before listing the screens:

  • approve
  • publish
  • pay
  • send
  • delete
  • sign
  • change policy

Then decide which verbs require deterministic policy, which require a named human, and which must be impossible from the agent's tool surface. Write the refusal test before polishing the prompt.

Generation makes software cheaper to create. Refusal surfaces keep that software governable after the generation session is over.

Accordo is open source and available on GitHub. Its public evidence ledger links product claims to the tests that hold them and states the current boundary beside each capability.

What this post does not mean

These pages describe this repository at this commit. None of them implies the framework is deployable, and none of them is a roadmap: nothing that is not merged appears on this site, in any tense.

  • No authentication ships: the framework authenticates nobody. Production Spine v1 (ADR-038) gives the framework verified identity, organizations and memberships, server-authoritative authorization and one tenant per application instance — so tenancy and authorization now exist and are enforced. What does not exist is authentication: no login, password, session or OIDC implementation ships, and a deployment must supply the adapter that verifies the request. Production mode refuses to start without one. In local-development mode an actor header is accepted as an assertion and is not an identity, which is the default developer posture. This is not shared-database multi-tenancy and it is not a readiness claim.
  • Not shared-database tenancy. createAccordoAppAsync can boot one tenant onto dedicated PostgreSQL databases. Shared-database row-level tenancy is not implemented, and this is not a production-readiness claim.
  • Timers exist; a service that runs them for you does not. Durable jobs, a transactional outbox and scheduled asks exist for self-hosted applications that explicitly start a worker. Nothing autostarts; a timer opens an ask, never makes a decision, and no managed worker service or recurrence is included.
  • No email, calendar or marketing integrations. An in-memory notification provider contract exists. MK1 marketing records supplied funnel observations and human-reviewed proposals only; it has no sending, publishing or spending path.
  • The build benchmark has not been run. The protocol is designed and published; no Successful Agent Build Rate exists yet. Any number you see quoted for this project is not ours.
  • Ownership means vendored source: there is no framework dependency to bump. The published create-accordo@0.1.0 scaffolds vendored source; it is the August 19 snapshot, not the current repository feature set. Use a current source checkout for the capabilities described here; upgrades require merging source (L-08). The framework is copied into the project, not installed as a framework library dependency. The accordo npm name is an empty reservation; the @accordo scope is claimed and deliberately empty.

Every claim and every limitation is on one page, and the questions this project refuses to answer are published beside them.

The evidence this post rests on

Claims

  • C-04 The agent cannot approve on the human's behalf. A test asserts the refusal, so the boundary is a property of the system rather than a promise in a README.

    LimitIn local-development mode the actor is asserted, not authenticated: no authentication ships, so an actor header there is not an identity. This holds a boundary against an honest agent, not against an attacker with network access.

  • C-16 Every mutation goes through a module service or a named workflow, and leaves an audit event and a step-level trace behind it.

    LimitAudit records what the process did under an asserted actor. It is not a tamper-evident or externally attestable log, and it is not a compliance control.

  • C-21 The same refusal holds where the money is: an agent actor asking to approve a discounted quote is refused with a 403, and only a human user actor can decide.

    LimitThe assertion lives inside a composite end-to-end test rather than a test named for it, so the citation is a file and a line rather than a test name. Extracting it into a named test is tracked in docs/strategy/GO_TO_MARKET.md; until then, cite the line.

Grounded in

  • docs/transcripts/2026-08-09-human-approval-boundary.txt

Editor of record

  • Aetha Editorial