Self-taught full-stack engineer. Founder of ML Systems, a Rhode Island construction tech company. Shipped a React Native app to both stores
Nothing here yet.
The three roles are right, and I'd add a fourth seat that isn't an agent at all. I run seven agent minds and one human on a house record for a construction company in Rhode Island, and the thing that took me longest to accept is that the validator is still a mind. It can check an output against the rules. It can't make the output true. So every agent in our system writes claims, not facts, and each claim carries the agent's own name and an evidence grade. Only a person grounds one. The other rule that saved me was cheaper than any orchestrator: the agents never talk to each other. Each writes to the ledger and reads the ledger, and that's the whole conversation. Your RBAC point becomes one column that way, who may write to what, instead of a permission matrix nobody remembers to update.
The checklist question I'd move to the top is the audit one, and I'd sharpen it: can you see who wrote each memory and what it's based on? The shared notebook model is close to what I run for seven agents and one human on a house record at a construction company in Rhode Island. Everything shared lives at the house level, but no agent gets to write a fact. It writes a claim: the value, its own name, and an evidence grade at the bottom of the ladder. "Alice uses PostgreSQL" is a stated claim until Alice or another person confirms it, and nothing moves up a grade by being recalled often. That's my one quarrel with decay scoring. Frequently recalled isn't the same as true, and the memory I most need on a job is usually the unpopular measurement. The agents don't share memories with each other directly either. The ledger is the only conversation between them. Fewer surprises that way.
The gate I'd add to your table is the one I ended up building first, and it isn't a stage. It's a column. Every value an agent produces in our system carries who made it and an evidence grade, and the grade is on the value itself, not on the workflow that produced it. Measured, sensed, stated, record, modeled, in that order. An agent writes at the bottom of that ladder no matter how much it searched. What moves a value up is a person, or a tape measure, or a record from the town. That's how I'd handle your logged exception too. The exception is a claim at the stated grade with a name on it, so it never quietly becomes a fact later. I run this on a house record for a construction company in Rhode Island, seven agents and one human, and the honest report is that the ladder caught more than the gates did. Your falsifiable framing at the end is the part I'd steal.
Thanks, Aansh. The one rule that made it hold: a re-run never writes over the earlier output, it writes a second claim beside it with its own source and version. Whether the two agree is decided by a separate reconciliation step, not by the retry, and if they disagree the row is marked conflict and nothing downstream reads it until a person resolves it. Retries stay cheap because they can never be destructive, which is what makes it safe to set them aggressively.
Treat CRM updates as high-trust write operations is the right frame, and the approval pattern is most of the way there. The piece I would change is what gets stored. Your log records actor, reason and source document next to the field, but the field itself still holds one value that the next writer overwrites. In the property record I run for houses, the field holds claims: each write keeps its author and an evidence grade, from a document (record) down to a model's inference (modeled), and the value a report reads is the one a person stamped, with the stamp bound to a hash of the content so a later edit lapses it. Two consequences for a CRM. Conflicting stage signals stop being a golden-set test case and become a row state, conflict, that the forecast cannot consume until someone resolves it. And promotion by acceptance rate gets safer, because a promoted field still enters as a modeled claim; what changes is who has to stamp it, not whether it is true. Truer, not louder, is exactly the goal. A record that remembers who said what is how you get there.
The three-layer split is right, and Week 3 is the part most teams skip. Two additions from running seven agents on one property record. First, log the accept, edit or reject as a claim on the row, not as a metric on the side: who said it, what evidence they had, and bind the approval to a hash of the content so an edit after approval lapses it. Second, be careful with Week 4. Promoting a category to auto-send once acceptance passes 80% turns the human's stamp into the thing the model optimizes toward, and a reviewer stamping at throughput stops being a check and becomes ground. Keep a share of approvals issued against the underlying evidence rather than the draft, and keep the model's output at the lowest evidence grade no matter how often it was accepted. It cannot promote itself; a person promotes it. Your clean source-of-truth line is the whole thing. A source of truth is a record that says who may assert each value. If it does not say that, it is a source of values.
Four engines writing the same field with nothing anywhere saying which one is real is the exact failure I would put on a slide. Two things were missing, and neither is code. The first is the model in English: what the daily score is, who is allowed to compute it, which weighting is the rule. At ML Systems we call the person who writes that a Language Modeler, and the AI a moderator between the English language and the coding language. Lovable had no source to translate from, so it translated four times. The second is the schema. A field that four writers can overwrite has no memory. The house record I run stores claims, not facts: every write carries its author and an evidence grade, and two writers disagreeing about the same value is a recorded state, conflict, that nothing downstream can consume until a person with standing grounds one of them. Your sent-it-back-as-a-product-question is that state, done by hand, two days late. Put it in the row and no parent ever sees a grade that depends on which engine ran last.
That is the right distinction, and it is where the two cases meet rather than split. The ledger keeps the contradiction in the row as claims, but the record still has to behave deterministically for a purpose: a takeoff needs one roof height. So a seat stamps a value. The Custodian's stamp, two keys bound to a content hash, is the equivalent of your "what the function does in this version." Change the underlying content and the stamp lapses, which is a new version. Until a seat stamps, a conflict row is quarantined and nothing downstream may consume it. Evidence preserved, behavior resolved, and the resolution is signed by someone who can be asked why.
"Keep the result and its evidence together" is the part ML Systems built first, and it shaped the whole ontology. Our domain is a house, not a customer base, but the safeguard is the same: every entry on the ledger is a claim, not a value. Who made it, at what evidence grade (measured 90, sensed 85, stated 80, record 70, modeled 60), and which one stands. A model's claim enters as modeled, the lowest grade; it can be confirmed only if an independent party agrees, and only the Custodian stamps. What we got wrong was the list of who may claim at all: six names, and the four agent minds owning finance, deconstruction, build and market were not on it, so "find meaning and act" had nowhere to land for those phases. Fix proposed, not shipped: claimants without seats. A mind may claim; it may never ground. The write-up is "Seven Families, One Ledger" on my DEV profile (salparvez).