AI agents

Sign-Off Ownership for Held Chunks: Who Approves Which Source

Antonio Evans9 min read

A split scene showing two desks: on the left, a content manager reviews a dashboard with held chunks, each tagged by source class (public web, licensed, internal).
Key points

Key points

  1. 1Assign one named approver role per source class, and record a fallback approver with identical authority in the same approval matrix.
  2. 2Approval matrices resolve a request by matching input columns and relaxing them from right to left, so column order changes who signs.
  3. 3When neither the primary nor the fallback approver is reachable, escalate to the next level instead of releasing the chunk without sign-off.
  4. 4Delegations need start and end dates, a scope, and a log line that reads "approved by A on behalf of B", never just the delegate's name.

Why a held chunk needs a named owner, not a queue

A held chunk is a piece of content that passed ingestion but stopped at the release gate. It might be a crawled page whose domain is on no allow list, a licensed feed whose contract restricts redistribution, an internal memo marked confidential, or a user post that matched a toxicity filter. Somebody has to say yes before it enters the retrieval index, and "somebody" is the failure mode.

Two separate research lines explain why the gate matters. First, the retrieval layer is now a security boundary: poisoned documents inserted into a knowledge database can carry injected instructions that mislead the model at query time, which is the core finding of CleanBase. Second, a single poisoned document is often enough: CorruptRAG shows that an attacker who can insert only one text can still shift answers, contradicting the older assumption that poisoning requires outnumbering the correct documents. If release is cheap and unattributed, the index accumulates exactly the material those attacks depend on.

An unnamed approval queue hides the problem rather than solving it. A reviewer who does not know which policy governs a source class defaults to approval, because rejection requires an argument and approval requires only a click. That is the human version of hard filtering versus soft demotion: the defended retrieval pipeline in RAG-IDS gets better results by scoring trust softly than by binary inclusion, which is a clue that the release decision should also carry a weight and a name, not a yes/no from a faceless queue.

The approval matrix: one row per source class

Borrow the structure from financial approval routing, which has solved this problem for decades. An approval matrix is a table mapping request attributes to approvers, maintained as business data rather than buried in code, with every row carrying a fallback so that a gap never means "no approval needed" (approval workflow design guide). Commercial systems implement the same idea: Ramp describes matrices that map input criteria such as department, location and entity to outputs such as approvers, including amount thresholds where the lowest sufficient tier wins (Ramp approval matrices).

Translating that to held chunks, the input column is the source class and the output columns are the approver, the fallback and the escalation target.

Source classPrimary approverFallback approverEscalate whenRelease condition
Public web crawlContent leadDeputy content leadBoth away, or domain flagged for impersonationDomain and publisher checked, license or robots terms read
Licensed database / feedLegal counselContract managerContract silent on AI indexing or redistributionLicense clause recorded against the chunk ID
Internal documentData owner (business unit)Business unit headDocument marked confidential or includes personal dataOwner confirms indexing scope and retention
User-generated contentCommunity or support leadTrust and safety duty reviewerPost involves another person's personal dataAuthor consent or policy basis recorded
Regulated data (health, finance)Data protection officerPrivacy counselAny cross-border or special-category dataPrivacy assessment reference attached

Two rules make this table operational. First, the fallback must hold the same authority, which means the role is pre-approved to sign for that class, not merely senior in the org chart. Second, the escalation column is a person or role who is expected to answer when the first two are unavailable, because a blank cell in a matrix is a wildcard in many systems, and a wildcard that routes to nobody is a silent auto-approval.

Handling absence without skipping sign-off

Absence is where most release processes quietly break. The realistic sequence is a held chunk, a primary approver on leave, a fallback who has changed teams, and a deadline. Someone approves on the approver's behalf from a phone, and the audit trail now records a name that did not make the decision.

Controlled delegation fixes this without adding headcount. Rules worth enforcing, drawn from the same design guidance, are: a start and end date on every delegation with no open-ended grants, a scope limited by source class or volume, a delegate who could approve in their own right, no re-delegation chains, and a record that states "approved by A on behalf of B" (approval workflow design guide). The last rule is the one auditors ask for and the one most teams skip.

Timeouts deserve an explicit policy: a missed deadline escalates, it never auto-approves. That mirrors the invoice workflow pattern where reminders fire at half the target time and at the deadline, then escalate to a named deputy rather than to the void. For held chunks, a sensible default is a target of one business day for public web, two for licensed and internal, and no deadline at all for regulated data, where the clock belongs to the privacy review rather than the release queue.

Where does the escalation top out? Name a single accountable role, typically head of content or head of data, with authority to release at risk and obliged to log the reason. A named risk-acceptance path is better than an unstructured one, because it produces a record you can review later.

What the review must actually look at

Sign-off is only meaningful if the approver checks specific things. Claude, who signs for licensed sources, is not reading prose quality; she is checking whether the license permits indexing by a language model and whether the chunk's redistribution differs from the source's. The content lead signing for public web is checking publisher identity and whether the text contains latent instructions.

That second check is not paranoia. Prompt injection through retrieved documents is the mechanism by which a page that merely looks like documentation can redirect a model's output, and the Promptfoo RAG poisoning plugin documentation lists the families to look for: direct injection, context manipulation, retrieval hijacking, data extraction and prompt leakage. It also explains why filtering alone is weak: embeddings may not capture a semantic attack, and traditional content filters miss sophisticated payloads.

A practical checklist for the approver, per chunk:

  1. Is the source class correctly tagged, and does the tag match the row that routed this chunk?
  2. For licensed material, is the governing clause recorded against the chunk ID?
  3. For public web, is the publisher identifiable and free of impersonation signals?
  4. Does the text contain anything that reads like an instruction to a model, a hidden link, or a pressure to contact an address?
  5. If any of the above is unclear, is the chunk quarantined rather than approved with a note?

Quarantine is a real pattern, not a metaphor. Systems such as Tinybird route rows that fail schema validation into a per-source quarantine table where they are inspected and later recovered after a fix (Tinybird quarantine guide). Treat your held-chunk store the same way: inspectable, recoverable, and separate from the live index, so that releasing a chunk is a deliberate act and holding one costs nothing.

Detection can help the approver, not replace them. CleanBase's insight is that documents crafted for the same targeted questions tend to be semantically similar to each other, so they form cliques in a similarity graph over the knowledge base, and flagging those cliques catches malicious documents (CleanBase). An approver who sees "this chunk sits in a cluster of eleven near-duplicates from three domains" has a much better basis for a decision than one reading a single page.

Permissions: who can approve what, technically

Process documents are worthless if the tooling lets anyone with write access bypass them. Make the approval matrix a permission boundary, not just a policy page.

Access control should mirror the source classes. Enterprise retrieval guidance recommends enforcing access control at the chunk level and carrying source metadata, author, timestamp and version through every stage of the pipeline so that answers can be traced back to their source (Unstructured RAG pipeline best practices). The same metadata is what makes an approval auditable: if a chunk in the index has no approver field, the control was not enforced.

A workable permission split:

ActionWhoTechnical control
Ingest and classifyPipeline service accountWrite to quarantine store only
Approve for releaseApprover role mapped to the source classWrite to the release queue for that class only
Override a rejectionHead of content or head of dataNamed override role, reason field required
Change the matrix itselfGovernance ownerSeparate change log, reviewed like code
Re-index approved chunksPipeline service accountReads release queue, never the quarantine store

Two details matter more than they look. First, approvers must not be able to edit chunk text and approve it in the same step, which separates the requester from the approver as segregation of duties guidance puts it. Second, the matrix itself needs version control: record which version of the matrix routed each chunk, so that an audit can see the rule that applied at the time rather than the rule in force today.

There is a maintenance signal worth watching. When the same source class escalates every week, the primary approver is wrong for that class, or the class is misdefined, and the matrix needs an edit rather than another reminder. Governance drifting into manual, one-off scans is the usual early symptom of a control that no longer matches the data estate (signs governance is too manual).

A worked example with numbers

Suppose a corpus ingests 12,000 chunks a month and holds 6 percent for review, which is 720 chunks. Split those by class: 400 public web, 180 licensed, 100 internal, 30 user-generated, 10 regulated.

Volume matters because it decides whether review is a job or a chore. At 400 public web chunks a month, one content lead spends roughly 20 chunks per working day on review, which is realistic at three minutes each (about an hour a day). At 180 licensed chunks, legal counsel reviews nine a day, which is fine until two of those chunks are copies of the same feed export; deduplicate before routing, and the number drops.

Now the absence case. If the content lead is away for ten working days, 200 web chunks accumulate. A pre-approved fallback with the same authority clears them at the same rate, and the release queue drains in the normal cycle. Without a fallback, those 200 chunks either wait (index freshness drops for two weeks) or get bulk-approved by someone unauthorised, and the audit log shows a decision nobody owns.

The escalation count is the metric to report. If 15 percent of web chunks escalate monthly, the primary role is overloaded or the classifier is misrouting, and either way the fix is a matrix change rather than an exhortation to work faster.

One further number: cost of a bad release. Because retrieval poisoning can succeed with a single planted document (CorruptRAG), and because attack success against undefended retrieval systems has been shown to be high in the PoisonedRAG line of work summarized in RAG-IDS, the expected cost of one unreviewed chunk is not proportional to its size. It is the cost of one wrong answer to every user who happens to ask the targeted question.

When the matrix spans several source classes and the review volume grows past what one approver can hold, a Quanta expert can pick up the classification and routing work and hand back a maintained matrix. See Quanta Experts.

Keeping the matrix alive

Three habits keep this from rotting.

Write the matrix as data, version it, and test the routing at boundaries. The boundary question (does a licensed chunk that is also user-generated route to legal or to trust and safety?) is exactly the kind of edge case that breaks a matrix in production, and it is cheaper to answer in a table than in an incident. Financial workflow guidance is blunt about the same point: define boundaries precisely and version the matrix so an audit can see which version applied (approval workflow design guide).

Review the escalation log monthly, not the whole queue. Escalations and overrides are where the matrix disagrees with reality. Two or three of each per month is health; thirty means the rows are wrong.

Test the pipeline against poisoned documents on a schedule, using synthetic poisoned copies rather than real held chunks. The Promptfoo RAG poisoning workflow is a concrete way to generate poisoned variants of existing documents, add them to a test knowledge base, and scan for the intended results you defined. That test tells you whether the gate holds when the approver does everything right but the chunk is hostile.

FAQ

FAQ

Who should approve public web content?

The content lead, with a deputy content lead as fallback. The check is publisher identity, license or robots terms, and whether the text carries instructions aimed at a model. This class carries the highest volume and the lowest per-item expertise, which is why it belongs with editorial rather than legal.

What happens if both the approver and the fallback are away?

Escalate to the named next level, usually head of content or head of data, and record the escalation. Never let a timeout approve a chunk. If escalations for one class become routine, change the matrix row rather than adding reminders.

Can an approver delegate to anyone?

No. A delegate must hold a role that could approve that source class in their own right, the delegation must have an end date and a scope, and chains are not allowed. The record must read "approved by A on behalf of B" so the audit shows both people.

Is automated detection enough to skip human sign-off?

Not for held chunks. Detection helps: similarity-clique analysis over the knowledge base flags clusters of documents written for the same target questions, which is the method behind CleanBase. But a detector produces a flag, and someone with named accountability still has to decide.

How do we prove the control to an auditor?

Show three things: the version of the matrix that routed each chunk, the approver field on every chunk in the index, and the escalation and override log. That combination answers who approved what, under which rule, and what happened when the rule could not be followed.

Sources

Sources

  1. CleanBase: Detecting Malicious Documents in RAG ...
  2. Practical Poisoning Attacks against Retrieval-Augmented ...
  3. Defending Retrieval-Augmented Intrusion Detection ...
  4. Approval Workflow Design: Matrices, Delegation, Audit
  5. Approval matrices setup and reference
  6. RAG Poisoning
  7. Quarantine Data Sources
  8. RAG Pipeline Best Practices for Enterprise Systems
  9. What are the signs that data governance is becoming too ...
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles