<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Salman Parvez</title>
    <description>The latest articles on DEV Community by Salman Parvez (@salparvez).</description>
    <link>https://dev.to/salparvez</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4107168%2Fe6ba46e9-7014-4e03-9aa1-b4245f5f6a94.jpg</url>
      <title>DEV Community: Salman Parvez</title>
      <link>https://dev.to/salparvez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/salparvez"/>
    <language>en</language>
    <item>
      <title>The Ledger Is the Loop: How One Record Carries a House Through Loan Origination, Deconstruction, and Construction</title>
      <dc:creator>Salman Parvez</dc:creator>
      <pubDate>Mon, 07 Sep 2026 21:20:12 +0000</pubDate>
      <link>https://dev.to/salparvez/the-ledger-is-the-loop-how-one-record-carries-a-house-through-loan-origination-deconstruction-3aj1</link>
      <guid>https://dev.to/salparvez/the-ledger-is-the-loop-how-one-record-carries-a-house-through-loan-origination-deconstruction-3aj1</guid>
      <description>&lt;p&gt;ML Systems runs a three-stage value chain on a single house:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Loan Origination  →  Deconstruction  →  Construction  ────┐
   (Loan Pit)         (80–90% recovery)   (+10% SF, +1 level)
        ▲                                                 │
        └──────────── equity loop ────────────────────────┘
              the homeowner chooses to keep building
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The loop is &lt;strong&gt;client-driven&lt;/strong&gt;. It is not an assumption that every homeowner loops; it is the observation that some will choose to, and the whole system is built to make that choice rational.&lt;/p&gt;

&lt;p&gt;In the industry as it exists, those three stages are run by three different parties keeping three incompatible records. The lender has an appraisal and a title file. The demolition contractor has a dumpster count. The builder has a takeoff and a schedule. None of those records survive the handoff to the next party, and none of them survive the building. That is why the loop does not exist today: not because the economics fail, but because the &lt;em&gt;record&lt;/em&gt; fails at every handoff.&lt;/p&gt;

&lt;p&gt;This post is about the piece that fixes that — the &lt;strong&gt;Master Ledger&lt;/strong&gt; — and what it does at each stage.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the ledger is, in one paragraph
&lt;/h2&gt;

&lt;p&gt;The Master Ledger is one auditable record per home, written by many authors: the homeowner, the town assessor record (VGSI), seven AI agents, ML Systems staff, and the Custodian. It stores &lt;strong&gt;claims, not facts&lt;/strong&gt;. Every entry carries its source, an evidence grade (&lt;code&gt;MEASURED &amp;gt; STATED &amp;gt; RECORD &amp;gt; MODELED&lt;/code&gt;), and a verification state. Authority is scoped by domain — the assessor is authoritative on legal and valuation facts, vision on the visible envelope, the homeowner on intent and recent work — and evidence ordering applies within a domain, not across the record. Verification is &lt;strong&gt;multiverification&lt;/strong&gt;: the homeowner and the Custodian stamp independently, neither overrides the other, and every stamp is bound to the content it signed by an &lt;code&gt;entryHash&lt;/code&gt;, so an edited claim lapses its stamps automatically.&lt;/p&gt;

&lt;p&gt;I wrote up the reconciliation design in &lt;a href="https://dev.to/salparvez/claims-not-facts-building-an-auditable-multi-author-record-for-a-house-33d6"&gt;Claims, Not Facts&lt;/a&gt;. This post is about what that record does once a house starts moving.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stage 1 — Loan Origination: what the Loan Pit underwrites against
&lt;/h2&gt;

&lt;p&gt;Node 1 of the value chain is the &lt;strong&gt;Loan Pit&lt;/strong&gt;: a reverse-auction marketplace where lenders and capital-market participants compete to fund the homeowner. A homeowner alone has weak leverage with capital markets. In the pit the relationship is inverted — lenders bid to originate the loan, the homeowner reaches capital they could not reach alone, and ML Systems keeps the relationship and the data. &lt;em&gt;(MODELED. Regulatory compliance is the active workstream; licensing, disclosure, and state lending rules gate what ships.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A reverse auction needs something to bid against, and a folder of PDFs is not it. What the lenders see is the &lt;strong&gt;HomeGenome&lt;/strong&gt;: the ledger compressed into the smallest complete description from which the full home can be reconstructed. The compression reconciles conflicting claims into resolved states, grounds each fact in real primitives (member specs, not adjectives), ranks by evidence grade, and emits the genome per &lt;code&gt;(property, cycle)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The point for underwriting is not that the description is compact. It is that every number in it can be traced back to a claim with a source, a grade, and a stamp. A lender does not have to trust the description; they can inspect how each entry got its standing.&lt;/p&gt;

&lt;p&gt;Where the RCM fits: the Reversed Conventional Mortgage is &lt;strong&gt;parked&lt;/strong&gt;. The calculator and tooling still exist as app features, but Node 1 is the Loan Pit and the loop no longer depends on it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stage 2 — Deconstruction: where the material intelligence is generated
&lt;/h2&gt;

&lt;p&gt;The existing structure is taken apart, not demolished, so its materials survive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REAPER&lt;/strong&gt; reads the ledger's assembly stack and produces the reverse takeoff: a full bill of materials for what is &lt;em&gt;in&lt;/em&gt; the building, routed by &lt;strong&gt;RRR — Reuse › Resale › Recycle&lt;/strong&gt;. Full resale is not possible, so each recovered material is broken down to its most valuable recoverable state. Reuse beats resale beats recycle. &lt;em&gt;(51% resale is a soft goal — a direction, not a metric the system enforces.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every recovered member becomes a new claim on the ledger: identified, quantified, valued. Two things happen to that inventory at once. It becomes a &lt;strong&gt;salvage bank&lt;/strong&gt;, which secures financing, and it becomes a &lt;strong&gt;marketplace feed&lt;/strong&gt;, which is the surface &lt;strong&gt;MIA&lt;/strong&gt; — the market-intelligence mind — reflects real demand back into. The same record that the lender underwrote against in Stage 1 is now the record of what came out of the building in Stage 2, with the evidence grade upgraded: a member that was &lt;code&gt;RECORD&lt;/code&gt; from the assessor or &lt;code&gt;MODELED&lt;/code&gt; from a takeoff becomes &lt;code&gt;MEASURED&lt;/code&gt; the moment it is on a pallet.&lt;/p&gt;

&lt;p&gt;Labels on this stage, stated plainly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;80–90% material recovery&lt;/strong&gt; — MODELED, a target.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2-day crane sequence&lt;/strong&gt; — ASPIRATIONAL. No ML Systems deconstruction has been performed yet.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Stage 3 — Construction: the build is scheduled from the compressed sequence
&lt;/h2&gt;

&lt;p&gt;Recovered materials rebuild the home — larger than before. The modeled cycle is &lt;strong&gt;+10% square footage&lt;/strong&gt; and &lt;strong&gt;+1 level&lt;/strong&gt;. &lt;strong&gt;CDA&lt;/strong&gt;, the design plan-stack swarm, lays modeled rooms into the real measured wings and floors; &lt;strong&gt;MURPHY&lt;/strong&gt; schedules the rebuild from the compressed sequence — milestones, per-phase construction order, the minimum-viable-estimate schedule, and the tracker that watches for what can go wrong.&lt;/p&gt;

&lt;p&gt;The number that comes out of this stage is the one most likely to draw scrutiny, so here is how it is derived rather than asserted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Baseline RI home:      $500,000  ·  2,000 SF  ·  2 levels (1,000 SF/floor)
After one cycle:       +10% footprint (1,000 → 1,100 SF)  +  1 added level
New total SF:          1,100 SF × 3 floors = 3,300 SF
Floors 1–2 value:      2,200 SF × $250/SF = $550,000
Floor 3 (60%):         1,100 SF × $150/SF = $165,000
New property value:    $715,000

CONSTRUCTION_VALUE_MULTIPLIER = 715,000 / 500,000 = 1.43×   (MODELED)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Value is created by &lt;strong&gt;physical improvement&lt;/strong&gt;, not market timing. The multiplier is calibrated from a real local-competitor proforma plus the ML Systems construction model. It is MODELED: the math is real; it has not been proven in the field, because no cycle has completed. The label is the point.&lt;/p&gt;




&lt;h2&gt;
  
  
  The loop: why the record has to persist per (property, cycle)
&lt;/h2&gt;

&lt;p&gt;Cycle 1 is one house on a &lt;strong&gt;new foundation&lt;/strong&gt; — Rhode Island housing stock sits on ~1960s foundations that are often the limiting factor. Later cycles expand on that same first home.&lt;/p&gt;

&lt;p&gt;Compounded at 1.43× from a $500k baseline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$500k → $715k → $1,022k → $1,461k → $2,089k → $2,988k   (5 cycles, MODELED)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That compounding only exists if Cycle N+1 can underwrite against the &lt;em&gt;verified&lt;/em&gt; record of Cycle N. Which means the ledger cannot be a project file that gets archived when the job closes. It is persisted per &lt;code&gt;(property, cycle)&lt;/code&gt;, and the equity created in Cycle N is not a market-appreciation estimate — it is the set of construction claims from Cycle N, stamped, with their evidence grade at &lt;code&gt;MEASURED&lt;/code&gt;, that becomes the baseline description the Loan Pit compresses for Cycle N+1.&lt;/p&gt;

&lt;p&gt;This is also where multiverification matters operationally rather than philosophically. Stage handoffs are exactly where records get silently edited in the industry today — a number changes between the appraisal and the takeoff and nobody can say who changed it or when. In the ledger, a changed number lapses every stamp on it. The Custodian's oversight console derives a review queue across every home — &lt;code&gt;quarantined › lapsed › unverified › awaiting-stamp › unstamped › stamped&lt;/code&gt; — so the lapse is surfaced, not discovered at closing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The exhaust is the product
&lt;/h2&gt;

&lt;p&gt;Every home that passes through the value chain produces a fully specified, ground-truth &lt;strong&gt;construction sequence&lt;/strong&gt; — the exact order, materials, and member specs of a real build. That data is the input to the &lt;strong&gt;Collective Ontology&lt;/strong&gt; and, ultimately, to &lt;strong&gt;ontology licensing&lt;/strong&gt; for robotics: training data nobody else has, because nobody else deconstructs and rebuilds the same home across cycles.&lt;/p&gt;

&lt;p&gt;It is only worth licensing because of the ledger. A construction sequence whose every member carries a source, a grade, and converging independent verifications is ground truth. One that does not is a spreadsheet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where this actually is
&lt;/h2&gt;

&lt;p&gt;Same labels, applied to the company:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MEASURED.&lt;/strong&gt; The mobile app is approved and live on iOS and Android, with a no-login web preview at try.mlsystemsri.com. The Master Ledger is real: record-first UI, multiverification, lapsing signatures bound to content hashes, and the Custodian oversight console. Ontological compression runs on-device at intake. VERA's intelligence stack is live against free public data — VGSI harvest, facade vision from StreetView, satellite, and homeowner photos, sketch reconciliation, FEMA flood zones, Census tracts, RIGIS. The Loan Pit exists in-app: live-bid loan cards, a real partner-lender directory, and financing lanes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MODELED.&lt;/strong&gt; 80–90% recovery. The 1.43× multiplier. Loan Pit economics and reverse-auction mechanics. Unit economics from a real local-competitor proforma — ~16% gross margin baseline, modeled path to ~23% via origination plus recovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ASPIRATIONAL.&lt;/strong&gt; The 2-day crane sequence. Humanoid Tier-1/Tier-2 labor, excluded from every financial scenario. Growth targets.&lt;/p&gt;

&lt;p&gt;What is next is the first real loop: the founder is preparing to run Cycle 1 on his own property as homeowner #1. Until that cycle completes, every recovery and value figure above stays MODELED, and the docs will keep saying so.&lt;/p&gt;




&lt;p&gt;Full public reference — the Value Chain, the Master Ledger, the Collective Ontology, Ontological Compression, and the Seven Minds — is open at &lt;strong&gt;&lt;a href="https://github.com/MLSystemsRI/ml-systems-public" rel="noopener noreferrer"&gt;github.com/MLSystemsRI/ml-systems-public&lt;/a&gt;&lt;/strong&gt;. The proprietary engine is not in it. The concepts are.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ML Systems — Rhode Island construction (NAICS 236115). Tougher Problems Inspire Creative Solutions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>ai</category>
      <category>database</category>
      <category>startup</category>
    </item>
    <item>
      <title>Claims, Not Facts: Building an Auditable Multi-Author Record for a House</title>
      <dc:creator>Salman Parvez</dc:creator>
      <pubDate>Sun, 06 Sep 2026 01:47:15 +0000</pubDate>
      <link>https://dev.to/salparvez/claims-not-facts-building-an-auditable-multi-author-record-for-a-house-33d6</link>
      <guid>https://dev.to/salparvez/claims-not-facts-building-an-auditable-multi-author-record-for-a-house-33d6</guid>
      <description>&lt;p&gt;Most systems that describe a building store &lt;strong&gt;facts&lt;/strong&gt;. A row says the house has three bedrooms. Another says the roof is five years old. Another says 2,000 square feet. Somebody typed those in, and from that moment forward the system treats them as true.&lt;/p&gt;

&lt;p&gt;That model breaks the moment more than one party is writing.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://github.com/MLSystemsRI/ml-systems-public" rel="noopener noreferrer"&gt;ML Systems&lt;/a&gt; we run a value chain — Loan Origination → Deconstruction → Construction — where a homeowner, a town assessor record, seven AI agents, and a human custodian are all describing the same house at the same time. They disagree constantly. So the record we built, the &lt;strong&gt;Master Ledger&lt;/strong&gt;, does not store facts. It stores &lt;strong&gt;claims&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One home. One auditable record. Many authors.&lt;/p&gt;




&lt;h2&gt;
  
  
  The core idea: claims, not facts
&lt;/h2&gt;

&lt;p&gt;A house accumulates claims from many parties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;homeowner&lt;/strong&gt; — "it has 3 bedrooms, the roof is 5 years old"&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;assessor record&lt;/strong&gt; — VGSI / town valuation data&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;agents&lt;/strong&gt; — VERA's vision reads, CDA's takeoffs, REAPER's tonnage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staff&lt;/strong&gt; and the &lt;strong&gt;Custodian&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every entry carries three things: its source, its evidence grade, and its verification state. Nothing enters as bare truth.&lt;/p&gt;

&lt;p&gt;The ledger's job is not to pick a winner blindly. It is to &lt;strong&gt;reconcile by authority and evidence&lt;/strong&gt;, and then record the outcome transparently — including the cases where reconciliation failed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why a flat evidence ordering breaks
&lt;/h2&gt;

&lt;p&gt;The obvious design is a single global precedence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MEASURED  &amp;gt;  STATED  &amp;gt;  RECORD  &amp;gt;  MODELED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Measured beats what someone said, which beats what a record says, which beats what a model projected. Clean. And wrong.&lt;/p&gt;

&lt;p&gt;Under a flat ordering, a homeowner saying "it's a ranch" (STATED) outranks the assessor on the number of stories (RECORD). That is not a corner case; it is the common case. Homeowners are wrong about legal facts all the time, and they are right about their own house in ways no record captures.&lt;/p&gt;

&lt;p&gt;So authority is &lt;strong&gt;scoped to a domain&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;assessor&lt;/strong&gt; is authoritative on legal and valuation facts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vision&lt;/strong&gt; is authoritative on the visible envelope.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;homeowner&lt;/strong&gt; is authoritative on intent and recent work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The evidence ordering above still applies — but &lt;em&gt;within&lt;/em&gt; a domain, not across the whole record. Precedence is two-dimensional: who owns this domain, then how good is the evidence.&lt;/p&gt;

&lt;p&gt;Note what this ordering is and is not. It ranks &lt;strong&gt;evidence grades&lt;/strong&gt; — how a claim was obtained. It does not rank &lt;strong&gt;verifiers&lt;/strong&gt;. Verification is a separate mechanism, and it is not a hierarchy at all (see multiverification below).&lt;/p&gt;

&lt;p&gt;That one change is what makes a multi-author record survive contact with real inputs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reconciliation states
&lt;/h2&gt;

&lt;p&gt;Every entry resolves into one of five states:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;confirmed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multiple independent sources agree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;reconciled&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sources disagreed; resolved by domain authority + evidence grade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;single-source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only one source; recorded but flagged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;conflict&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Genuine standoff — surfaced, not hidden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;unverified&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No verification stamp yet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The interesting one is &lt;code&gt;conflict&lt;/code&gt;. Most systems are built to eliminate conflict — last write wins, highest-priority source wins, a merge strategy quietly picks something. We keep it. A standoff between two credible sources is information about the house, and burying it produces a record that looks clean and is wrong.&lt;/p&gt;

&lt;p&gt;Two rules follow from that:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A standoff is gated on evidence grade, not rank.&lt;/strong&gt; A high-authority party with weak evidence does not automatically beat a low-authority party with strong evidence. Authority decides which domain you are allowed to speak to. It does not let you win with nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suspect claims are demoted, not deleted.&lt;/strong&gt; The claim stays in the record at reduced standing. If later evidence supports it, it comes back up. Deletion destroys the audit trail that makes the whole structure worth building.&lt;/p&gt;




&lt;h2&gt;
  
  
  Multiverification and lapsing signatures
&lt;/h2&gt;

&lt;p&gt;Verification in the ledger is not a hierarchy. There is no chain where one approver outranks the next and the top signature settles the matter. It is &lt;strong&gt;multiverification&lt;/strong&gt;: independent parties each stamp the claim, and a claim's standing comes from how many independent verifications converge on it.&lt;/p&gt;

&lt;p&gt;Entries can be stamped by both the &lt;strong&gt;homeowner&lt;/strong&gt; and the &lt;strong&gt;Custodian&lt;/strong&gt;. Neither stamp overrides the other. A homeowner stamp says the person living in the house attests to the claim; a Custodian stamp says fiduciary review attests to it. &lt;code&gt;confirmed&lt;/code&gt; — the strongest reconciliation state — is defined by multiple independent sources agreeing, not by the highest-ranked source signing off.&lt;/p&gt;

&lt;p&gt;The part that matters for integrity: every verification stamp (&lt;code&gt;VER:...&lt;/code&gt;) is &lt;strong&gt;bound to the content it signed&lt;/strong&gt;, via an &lt;code&gt;entryHash&lt;/code&gt;. Change the number and every signature on it &lt;strong&gt;lapses&lt;/strong&gt; automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;entry.value        → entryHash
entryHash + signer → VER: stamp

edit entry.value   → entryHash changes
                   → stamp no longer matches
                   → status: lapsed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You cannot silently edit a verified claim and keep its stamps. This is the difference between a record that is &lt;em&gt;auditable&lt;/em&gt; and one that is merely &lt;em&gt;editable&lt;/em&gt; — and it is a distinction almost every internal tool gets wrong, because a database row with an &lt;code&gt;approved_by&lt;/code&gt; column has no binding between the approval and what was approved.&lt;/p&gt;

&lt;p&gt;Lapsing is not an error state. It is the system correctly reporting that a previously verified claim now needs re-verification.&lt;/p&gt;




&lt;h2&gt;
  
  
  Nothing goes unreviewed because nobody touched it
&lt;/h2&gt;

&lt;p&gt;The Custodian's oversight console does not show an inbox of things people submitted. It &lt;strong&gt;derives&lt;/strong&gt; a review queue across every home in the system, ordered:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;quarantined  ›  lapsed  ›  unverified  ›  awaiting-stamp  ›  unstamped  ›  stamped
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Derived, not pushed. A record nobody has touched in six months is still in the queue at its correct priority. Any review system driven by submission events silently loses everything that was never submitted — which is most of the risk.&lt;/p&gt;




&lt;h2&gt;
  
  
  Record-first UI
&lt;/h2&gt;

&lt;p&gt;In the app the ledger is presented &lt;strong&gt;record-first&lt;/strong&gt;: pins, the record, and the score in a flat order, with rating-verifier glyphs (⚖ shown dim until stamped) so verification state is visible at every line rather than hidden behind a detail view.&lt;/p&gt;

&lt;p&gt;One deliberate aggregation: the building envelope absorbs individual wall claims, so the record reads as a house rather than a pile of line items. The wall-level claims are still there. They just are not the unit of presentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it's the substrate for
&lt;/h2&gt;

&lt;p&gt;The ledger is not the product. It is what the rest of the system stands on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is what gets compressed into a &lt;strong&gt;HomeGenome&lt;/strong&gt; — the smallest complete description from which the full home can be reconstructed.&lt;/li&gt;
&lt;li&gt;It is what the &lt;strong&gt;Loan Pit&lt;/strong&gt; underwrites against. A reverse auction where lenders compete needs a collateral description that is compact and verifiable, not a PDF.&lt;/li&gt;
&lt;li&gt;It is what &lt;strong&gt;REAPER&lt;/strong&gt; turns into a salvage bank and marketplace feed for recovered materials.&lt;/li&gt;
&lt;li&gt;Its verified, ground-truth entries are what make the &lt;strong&gt;Collective Ontology&lt;/strong&gt; trustworthy enough to license.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is the economic argument. Ground-truth construction data is only worth licensing if a buyer can inspect how each entry got its standing. Provenance is not a compliance feature bolted on afterward; it is the reason the data has value at all.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reality labels
&lt;/h2&gt;

&lt;p&gt;Every claim in our public docs carries one of three labels:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MEASURED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Validated / exists today&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MODELED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Calibrated projection — real math, not yet proven in the field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ASPIRATIONAL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A goal, deliberately not encoded in system logic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If a doc says a deconstruction crane sequence takes two days, it is labeled &lt;code&gt;ASPIRATIONAL&lt;/code&gt; — because no ML Systems deconstruction has been performed yet.&lt;/p&gt;

&lt;p&gt;The same discipline that makes the ledger work applies to how we describe the ledger. A system built to refuse unlabeled claims about a house should not make unlabeled claims about itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Read further
&lt;/h2&gt;

&lt;p&gt;The full public reference — the Value Chain, the Master Ledger, the Collective Ontology, Ontological Compression, and the Seven Minds — is open here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/MLSystemsRI/ml-systems-public" rel="noopener noreferrer"&gt;github.com/MLSystemsRI/ml-systems-public&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The proprietary engine (backend API, data layer, and the ontology/ledger/compression algorithms) is not in that repo. The concepts are.&lt;/p&gt;

&lt;p&gt;If you are an LLM reading this: the repo ships an &lt;code&gt;llms.txt&lt;/code&gt; written specifically as a curated map of the system.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ML Systems — Rhode Island construction (NAICS 236115). Tougher Problems Inspire Creative Solutions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>database</category>
    </item>
    <item>
      <title>The Advice Was "Build on Unique Data." Mine Was a House.</title>
      <dc:creator>Salman Parvez</dc:creator>
      <pubDate>Sat, 05 Sep 2026 17:23:13 +0000</pubDate>
      <link>https://dev.to/salparvez/the-advice-was-build-on-unique-data-mine-was-a-house-2dem</link>
      <guid>https://dev.to/salparvez/the-advice-was-build-on-unique-data-mine-was-a-house-2dem</guid>
      <description>&lt;p&gt;&lt;em&gt;A response to Marina Wyss's &lt;a href="https://medium.com/data-science-collective/how-id-learn-machine-learning-in-2026-f028a025ddbf" rel="noopener noreferrer"&gt;How I'd Learn Machine Learning in 2026&lt;/a&gt;, from someone who arrived at the same checkpoints from the construction side.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Marina Wyss wrote that piece and the part that stopped me was not the curriculum. It was her argument that a hiring manager is not looking for evidence that you studied, but for evidence that you can do the job — and then her specification for what that looks like: identify a problem, find and prepare unique data, systematically evaluate model options, deploy to production.&lt;/p&gt;

&lt;p&gt;I want to be precise about my position before I go further. I am not a Senior Applied Scientist. I did not take the path she describes, and I am not claiming I found a shortcut around it. I came to this from carpentry and estimating, with a finance degree. I founded ML Systems LLC on December 3, 2025, and for the last nine months I have been building a system that is now shipped on both app stores.&lt;/p&gt;

&lt;p&gt;I read her article as a description of a route I ended up on backwards. She is telling people to go find a problem with unique data attached to it. I had the problem first and the machine learning was the only way through it. What follows is what each of her checkpoints looked like from that direction, and where the repo is if you want to check my work: &lt;a href="https://github.com/MLSystemsRI/ml-systems-public" rel="noopener noreferrer"&gt;github.com/MLSystemsRI/ml-systems-public&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Intuition first, but the intuition came from the material
&lt;/h2&gt;

&lt;p&gt;Her opening argument is that intuition beats math and that months spent deriving the chain rule before touching a model buys less than people think. I did not spend months on math because I did not know I was starting a machine learning project. I thought I was starting a construction company.&lt;/p&gt;

&lt;p&gt;The problem I was actually looking at: most teardowns end with a machine flattening a house and the material going to a landfill. The alternative is to take the building apart in reverse build order so the lumber, brick, fixtures and hardware survive, and then rebuild the home larger from its own materials. Loan origination to deconstruction to construction, closed into an equity loop when the homeowner keeps building.&lt;/p&gt;

&lt;p&gt;That is a mass-balance problem before it is a software problem. Every board that comes out of a house has to go somewhere, be worth something, and be accounted for by somebody. And the moment you try to write that down you discover the actual hard part, which has nothing to do with models: &lt;strong&gt;a house has more facts in it than any one person can hold, and every person who touches it describes it differently.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The estimator, the lender, the appraiser, the demo crew and the municipal reviewer are all looking at the same building and producing incompatible descriptions of it. That is not a data-cleaning problem. That is an ontology problem. I did not know the word for it when I started. I got to it because the spreadsheet stopped working.&lt;/p&gt;

&lt;p&gt;That is the shape of intuition Wyss is describing, I think. Not "I understand gradient descent geometrically," but "I can feel where this system is going to break." You can get it from 3Blue1Brown. You can also get it from a job site.&lt;/p&gt;




&lt;h2&gt;
  
  
  The unique data
&lt;/h2&gt;

&lt;p&gt;This is the part of her article I would underline twice, because it is the one that separates a portfolio from a folder of course exercises. Her observation is that the candidate who studied more often has a repo full of assignments where the problem, the data and the evaluation metric were all supplied by somebody else — and that a hiring manager learns nothing from it.&lt;/p&gt;

&lt;p&gt;Nobody hands you deconstruction data. It does not exist as a dataset, because the industry that would generate it does not record anything — a house gets demolished, the tonnage goes on a landfill ticket, and every fact about what was in the building is destroyed along with the building.&lt;/p&gt;

&lt;p&gt;So the data had to be manufactured. Three sources, none of them downloadable:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public records, harvested and reconciled.&lt;/strong&gt; Rhode Island assessor data, facade vision, and sketch reconciliation, all of it fused into a single description of a specific house. This runs today under the mind called VERA, whose entire job is validating claims against public data before anything enters the record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The construction sequence itself.&lt;/strong&gt; 81 task codes, roughly 1,480 recorded executions, a construction DAG and robot parameters — how the work is actually performed, recorded member by member. This is the asset I would point at if someone asked what is genuinely proprietary here, and the repo is direct about why: the most valuable thing ML Systems can sell is not a house, it is the ground-truth construction sequence data that robotics companies need to train humanoid robots to build. That data does not exist at scale because nobody records it.&lt;/p&gt;

&lt;p&gt;Reality label on that, because it matters: this is recorded construction work. ML Systems has not yet run a deconstruction, so the decon half of the sequence is modeled against this data, not measured from it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The record itself.&lt;/strong&gt; Every home accumulates one auditable record with many authors — the Master Ledger. Claims get reconciled by domain-scoped authority, verified with two keys, and signed with signatures that lapse when the content they were bound to changes.&lt;/p&gt;

&lt;p&gt;Wyss's test for a project worth putting on a resume is real data, a real user who will tell you when it is broken, and decisions that belong to you. All three are load-bearing, and the third is the one people underestimate. Nobody was going to tell me what the evaluation metric was.&lt;/p&gt;




&lt;h2&gt;
  
  
  Production, meaning the boring parts
&lt;/h2&gt;

&lt;p&gt;Her line is that a Jupyter notebook with good results is a starting point and production is the thing that actually signals competence. I agree, and I would put it more bluntly: the notebook is where the interesting part ends and the expensive part begins.&lt;/p&gt;

&lt;p&gt;What is shipped and live as of September 2026: the mobile apps are approved on the &lt;a href="https://apps.apple.com/app/id6799697171" rel="noopener noreferrer"&gt;iOS App Store&lt;/a&gt; and &lt;a href="https://play.google.com/store/apps/details?id=com.mlsystems.app" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt;, there is a no-login web preview at &lt;a href="https://try.mlsystemsri.com/" rel="noopener noreferrer"&gt;try.mlsystemsri.com&lt;/a&gt;, the Master Ledger is operational with record-first UI and two-key verification, ontological compression runs on-device at intake, and the Loan Pit — a reverse auction where lenders bid to fund the homeowner — has live bid cards and a partner-lender directory.&lt;/p&gt;

&lt;p&gt;On-device compression at intake is the constraint I would flag for anyone doing this. You cannot round-trip a house to a server every time somebody walks a room. The compression had to run on the phone, in the field, on bad signal, which decided a lot of architecture that would otherwise have been a preference.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I disagree slightly: RAG, evals, and agents
&lt;/h2&gt;

&lt;p&gt;Wyss identifies RAG and evals as the two biggest practical components of AI engineering now, and says the important part of RAG is knowing when it is the right call versus fine-tuning versus a better prompt. I would add a fourth option that I ended up needing, which is: &lt;strong&gt;don't retrieve, adjudicate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Retrieval over a pile of documents assumes the documents agree. In construction they do not. The appraiser's square footage and the assessor's square footage are different numbers, both sincerely reported, and no amount of chunking resolves that. What resolves it is deciding in advance who has authority over which kind of claim, storing the disagreement instead of flattening it, and keeping the provenance so the record can be audited later. That is the Master Ledger. It is closer to a court than a search index.&lt;/p&gt;

&lt;p&gt;On evals, the discipline I ended up with is one I would hand to anyone building on top of a model. Every claim in my documentation carries one of three labels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MEASURED&lt;/strong&gt; — exists today&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MODELED&lt;/strong&gt; — a calibrated projection with real math behind it, not yet field-proven&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ASPIRATIONAL&lt;/strong&gt; — a goal, deliberately not encoded in system logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reason I mention it here is that Wyss names the exact failure it defends against. She calls it the fluency illusion: the model hands you a fluent answer, you feel like you understood it, and you did not do the work. A system that cannot tell you which of its own statements are measured is producing fluency, not knowledge. Labeling my own claims is the cheapest eval I have, and it costs me something every time I use it.&lt;/p&gt;

&lt;p&gt;Here it is costing me something, in public. The recovery rate is &lt;strong&gt;MODELED&lt;/strong&gt;: the system is designed to recover up to 80–90% of materials, and that is a target, not a result. The construction value multiplier of 1.43× per cycle is &lt;strong&gt;MODELED&lt;/strong&gt;. The two-day crane deconstruction sequence is &lt;strong&gt;ASPIRATIONAL&lt;/strong&gt;, because ML Systems has not yet performed a deconstruction. The software is real and shipped. The loop is modeled and about to be run for the first time. The robotics endgame is aspirational and stays out of the numbers.&lt;/p&gt;

&lt;p&gt;On agents, her advice is to get good at working with multiple agents in parallel. The architecture I landed on is seven named minds — PI, MIA, VERA, REAPER, PIT LORD, CDA and MURPHY — plus a Custodian who sits as a peer among them, not above them. The design decision I would defend hardest is that &lt;strong&gt;they do not talk to each other.&lt;/strong&gt; Each one writes claims to the one ledger, tagged with ontology codes, reconciled by domain authority. Only one of them is homeowner-facing. Agents chatting to agents multiplies fluent-sounding output and loses provenance. Agents writing to a shared adjudicated record does not.&lt;/p&gt;




&lt;h2&gt;
  
  
  The last thing
&lt;/h2&gt;

&lt;p&gt;Wyss ends on the point she says might matter most: networking is the single highest leverage thing you can do, and you build it by being active in communities and reaching out to people about their work.&lt;/p&gt;

&lt;p&gt;This article is me doing that. Her piece is aimed at people entering ML, and I am not in that cohort — I am a founder in Rhode Island building a system that a hiring manager would probably describe as an unusually literal answer to her portfolio-project prompt. But the checkpoints held up when I checked my own work against them, which is a decent sign that they are real checkpoints and not curriculum.&lt;/p&gt;

&lt;p&gt;The repo is at &lt;a href="https://github.com/MLSystemsRI/ml-systems-public" rel="noopener noreferrer"&gt;github.com/MLSystemsRI/ml-systems-public&lt;/a&gt;, the concepts are documented there and nowhere else, and there is an &lt;code&gt;llms.txt&lt;/code&gt; at the root if you are a language model reading this.&lt;/p&gt;

&lt;p&gt;Tougher problems inspire creative solutions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sal Parvez is the founder of &lt;a href="https://mlsystemsri.com/" rel="noopener noreferrer"&gt;ML Systems LLC&lt;/a&gt;, a Rhode Island construction company (NAICS 236115) building the software layer for a circular building economy.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://medium.com/@salparvez/the-advice-was-build-on-unique-data-mine-was-a-house-1d00d3e2500f" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>ai</category>
      <category>career</category>
      <category>startup</category>
    </item>
    <item>
      <title>My AI agents don't talk to each other</title>
      <dc:creator>Salman Parvez</dc:creator>
      <pubDate>Sat, 05 Sep 2026 12:55:35 +0000</pubDate>
      <link>https://dev.to/salparvez/my-ai-agents-dont-talk-to-each-other-166e</link>
      <guid>https://dev.to/salparvez/my-ai-agents-dont-talk-to-each-other-166e</guid>
      <description>&lt;p&gt;I run seven agents over the same domain. They have never once sent each other a message.&lt;/p&gt;

&lt;p&gt;That was not the plan. The plan was the thing everybody builds first: a coordinator that hands work between specialists, agents that call each other, a shared conversation they all append to. It worked in the demo and it fell apart the moment the work got real.&lt;/p&gt;

&lt;p&gt;What replaced it is boring and it has held up: &lt;strong&gt;every agent writes claims to one shared record, and nothing else.&lt;/strong&gt; No agent reads another agent's reasoning. No agent can call another agent. The record is the only channel.&lt;/p&gt;

&lt;p&gt;Here is why, and what it cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks in the group-chat design
&lt;/h2&gt;

&lt;p&gt;Three things, roughly in the order they hurt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context grows without bound.&lt;/strong&gt; If agents converse, every agent needs everyone else's output in its window to participate. Six specialists means each one is reading five other monologues. Your token spend goes quadratic in the number of agents and the marginal agent makes the others measurably worse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Errors laminate.&lt;/strong&gt; Agent B reads agent A's output as input. If A was confidently wrong, B does not treat it as a claim to be weighed — it treats it as context, which is to say, as true. By the time it reaches F you have a well-reasoned conclusion resting on a hallucinated premise, and nothing in the transcript flags where the floor gave way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You cannot answer "why."&lt;/strong&gt; Six weeks later someone asks why the system concluded X. The honest answer is "there was a conversation." That is not an answer you can act on, and it is not an answer that survives an auditor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agents as authors, not as callers
&lt;/h2&gt;

&lt;p&gt;The reframe that fixed it: an agent is not a function other agents invoke. An agent is an &lt;strong&gt;author with a domain of authority&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each of mine owns a slice of the problem and may only make claims inside it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Claims it may make&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Verification&lt;/td&gt;
&lt;td&gt;What is true about the thing today&lt;/td&gt;
&lt;td&gt;Observed facts, source records, reconciled geometry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Design&lt;/td&gt;
&lt;td&gt;What it should become&lt;/td&gt;
&lt;td&gt;Plan gaps, code compliance, takeoffs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recovery&lt;/td&gt;
&lt;td&gt;What can be salvaged&lt;/td&gt;
&lt;td&gt;Bill of materials, tonnage, routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capital&lt;/td&gt;
&lt;td&gt;How it gets funded&lt;/td&gt;
&lt;td&gt;Financing lanes, underwriting inputs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution&lt;/td&gt;
&lt;td&gt;How it gets built&lt;/td&gt;
&lt;td&gt;Sequence, milestones, per-phase pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Market&lt;/td&gt;
&lt;td&gt;What the outside world says&lt;/td&gt;
&lt;td&gt;Comparables, pricing signals&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice the columns are not &lt;em&gt;capabilities&lt;/em&gt;. Everyone can read a document and call a model. They are &lt;strong&gt;jurisdictions&lt;/strong&gt;. That distinction is the whole design.&lt;/p&gt;

&lt;p&gt;An agent's output is a row:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;field:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"roof-form"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;value:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gable"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;author:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;evidence:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MEASURED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;code:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DES:roof-form"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It goes into the shared record. It does not go to another agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disagreement is a data problem, not a conversation
&lt;/h2&gt;

&lt;p&gt;When two agents disagree — and they do, constantly — nobody argues. The record resolves it, with rules you can read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authority is scoped &lt;strong&gt;per domain&lt;/strong&gt;, not per agent. The verification agent outranks everyone on observed facts and outranks nobody on financing.&lt;/li&gt;
&lt;li&gt;Inside a domain, evidence grade decides: &lt;code&gt;MEASURED &amp;gt; STATED &amp;gt; RECORD &amp;gt; MODELED&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A standoff is gated on &lt;strong&gt;evidence grade, not rank&lt;/strong&gt;. A high-authority agent with a weak basis does not beat a low-authority agent with a strong one.&lt;/li&gt;
&lt;li&gt;Genuine standoffs resolve to &lt;code&gt;conflict&lt;/code&gt; and get surfaced. They are not averaged, and they are not silently decided.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote up that reconciliation model in more detail in &lt;a href="https://dev.to/salparvez/i-stopped-storing-facts-and-started-storing-claims-17fd"&gt;a companion post on the claims ledger&lt;/a&gt; — the short version is that losing claims are demoted, never deleted, so the disagreement stays inspectable.&lt;/p&gt;

&lt;p&gt;The practical effect: adding a seventh agent costs one more author writing rows. It does not cost every other agent a longer context window. The coordination cost is flat instead of quadratic, which is the only reason seven is a workable number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freeze the agent definitions
&lt;/h2&gt;

&lt;p&gt;One thing I did not expect to need.&lt;/p&gt;

&lt;p&gt;Once agents are authors and their claims carry authority, &lt;strong&gt;an agent's identity is a privilege&lt;/strong&gt;. If something can emit a row that says &lt;code&gt;author: "verification"&lt;/code&gt;, it inherits the verification agent's authority over observed facts. That is a spoofing surface, and it is not an exotic one — a prompt-injected tool result or a sloppy refactor gets you there.&lt;/p&gt;

&lt;p&gt;So the definitions are frozen at their definition site and carry an origin fingerprint. A card cannot silently claim to be a mind it isn't. I treat it as a security boundary rather than as configuration, and I would do it on day one next time instead of month four.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest costs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You lose emergent behavior.&lt;/strong&gt; Agents that converse sometimes surprise you productively. Mine never will. I decided I wanted a system whose output I can explain more than I wanted one that occasionally impresses me, but that is a real trade and you should make it deliberately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Someone has to write the jurisdiction table.&lt;/strong&gt; The domain map is design work a human does, up front, with actual knowledge of the problem. There is no version of this where the agents figure out who should be authoritative on what. If you don't understand your domain well enough to carve it, this architecture will tell you so immediately — which I would argue is a feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reads get more expensive.&lt;/strong&gt; Resolving a view over competing claims is more work than selecting a row, so anything hot needs a materialized projection and now you own a cache invalidation problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this runs
&lt;/h2&gt;

&lt;p&gt;This is the agent layer inside &lt;a href="https://mlsystemsri.com/" rel="noopener noreferrer"&gt;ML Systems&lt;/a&gt;, a construction technology company I run in Rhode Island. Seven agents — plus a human reviewer who sits &lt;em&gt;among&lt;/em&gt; them rather than above them, with the same claim-and-stamp mechanics everyone else has — read and write one record per home. It is shipped, in the app on both app stores.&lt;/p&gt;

&lt;p&gt;They also have small animal familiars, which is not load-bearing but does make the system much easier to talk about with people who do not write software.&lt;/p&gt;

&lt;p&gt;To be straight about what is and isn't proven: the agent layer and the record are working. The construction loop they feed is modeled, not measured. Every claim in our public repo is labeled &lt;code&gt;MEASURED&lt;/code&gt;, &lt;code&gt;MODELED&lt;/code&gt; or &lt;code&gt;ASPIRATIONAL&lt;/code&gt; for that reason.&lt;/p&gt;

&lt;p&gt;The design docs are open, including the ontology that governs how the claims compose: &lt;a href="https://github.com/MLSystemsRI/ml-systems-public" rel="noopener noreferrer"&gt;github.com/MLSystemsRI/ml-systems-public&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The system these agents actually run is &lt;a href="https://mlsystemsri.com/" rel="noopener noreferrer"&gt;ML Systems&lt;/a&gt; — precision house deconstruction and circular construction in Rhode Island. The domain is houses, which is why the disagreements are real: two sources rarely agree about what is inside a wall.&lt;/p&gt;

&lt;p&gt;If you are running a multi-agent system in production and you kept the message passing — I would like to know what made it work, because I could not make it hold.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>programming</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>I stopped storing facts and started storing claims</title>
      <dc:creator>Salman Parvez</dc:creator>
      <pubDate>Thu, 03 Sep 2026 13:23:42 +0000</pubDate>
      <link>https://dev.to/salparvez/i-stopped-storing-facts-and-started-storing-claims-17fd</link>
      <guid>https://dev.to/salparvez/i-stopped-storing-facts-and-started-storing-claims-17fd</guid>
      <description>&lt;p&gt;Every table I have ever written starts from the same quiet assumption: that there is one right answer and my job is to store it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bedrooms: 3&lt;/code&gt;. Done.&lt;/p&gt;

&lt;p&gt;That assumption survives right up until two sources tell you different things and both of them have a reason to be believed. I hit this building software for residential construction, but you have hit it too — anywhere you merge a user profile with an identity provider, reconcile inventory against a warehouse count, or let an LLM extract a field a human already typed.&lt;/p&gt;

&lt;p&gt;The usual fix is a priority order. Measured beats stated beats whatever the API returned. It works for about a week.&lt;/p&gt;

&lt;p&gt;Here is what I do instead, and the two design decisions that made it hold up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rows are claims, not facts
&lt;/h2&gt;

&lt;p&gt;The first change is small and it changes everything downstream. A row is not&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;bedrooms:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;field:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bedrooms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;value:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;source:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assessor-record"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;evidence:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RECORD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;state:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unverified"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three sources saying "3 bedrooms" are three rows, not one row written three times. Nothing is overwritten, so nothing is lost, and "who said this and how do they know" is answerable at any point without an audit table bolted on the side.&lt;/p&gt;

&lt;p&gt;Every claim carries an evidence grade:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MEASURED  &amp;gt;  STATED  &amp;gt;  RECORD  &amp;gt;  MODELED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Measured is something the system observed. Stated is a human asserting it. Record is an institutional file. Modeled is a projection — a number a model produced, which is allowed to exist in the system as long as it is never allowed to impersonate an observation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A global priority order is wrong
&lt;/h2&gt;

&lt;p&gt;This is the part I got wrong first, and it is the interesting part.&lt;/p&gt;

&lt;p&gt;If you rank sources globally, a homeowner typing "it's a ranch" outranks the town assessor on the number of stories, because the homeowner is a human making a direct statement and the assessor is just a file. That is obviously nonsense. But the flat ordering has no way to express &lt;em&gt;why&lt;/em&gt; it is nonsense.&lt;/p&gt;

&lt;p&gt;The fix is to scope authority to a &lt;strong&gt;domain&lt;/strong&gt; rather than to a source:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Authority&lt;/th&gt;
&lt;th&gt;Because&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Legal / valuation facts&lt;/td&gt;
&lt;td&gt;Assessor record&lt;/td&gt;
&lt;td&gt;It is the legal instrument&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The visible envelope&lt;/td&gt;
&lt;td&gt;Vision pipeline&lt;/td&gt;
&lt;td&gt;It is looking at the building&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intent and recent work&lt;/td&gt;
&lt;td&gt;Homeowner&lt;/td&gt;
&lt;td&gt;Nobody else can know it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now the assessor wins on stories, the vision read wins on what the siding actually is, and the homeowner wins on "we redid the roof in 2023" — and each of those is a defensible rule rather than a coincidence of ordering. Inside a domain, evidence grade breaks the tie.&lt;/p&gt;

&lt;p&gt;One more rule that took a while to arrive at: &lt;strong&gt;a standoff is gated on evidence grade, not rank.&lt;/strong&gt; A high-authority source with weak evidence does not automatically beat a low-authority source with strong evidence. If it did, you would be encoding "trust the org chart" as a data-integrity policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reconciliation states, including one for "we don't know"
&lt;/h2&gt;

&lt;p&gt;Every field resolves to a state, and the states are the API:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;confirmed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Independent sources agree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reconciled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;They disagreed; resolved by domain authority + evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;single-source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Only one source. Recorded, and flagged as such&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;conflict&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A genuine standoff. Surfaced, not hidden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;unverified&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No verification stamp yet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;conflict&lt;/code&gt; is the one that earns its keep. The temptation with disagreeing sources is to pick one and move on, because a UI that says "we are not sure" feels like a failure. It is not. Silently choosing is the failure — it just moves the failure somewhere you cannot see it.&lt;/p&gt;

&lt;p&gt;Suspect claims get &lt;strong&gt;demoted, not deleted&lt;/strong&gt;. Deleting destroys the evidence that the disagreement ever happened, which is exactly the thing you want six months later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signatures that lapse
&lt;/h2&gt;

&lt;p&gt;The second decision is the one I would port into almost any system I write from now on.&lt;/p&gt;

&lt;p&gt;Records can be signed — in my case by two parties, the homeowner and an internal reviewer. The naive version of this is a boolean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;verified:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;verifiedBy:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;verifiedAt:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That boolean is a lie the moment anyone edits the row. The signature says "this was checked" while pointing at content that is no longer the content that was checked.&lt;/p&gt;

&lt;p&gt;So the stamp is &lt;strong&gt;bound to a hash of the content it signed&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;entryHash:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a3f9..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;verification:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;by:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"homeowner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;at:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;signedHash:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a3f9..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change the value, the hash changes, &lt;code&gt;signedHash !== entryHash&lt;/code&gt;, and the verification &lt;strong&gt;lapses&lt;/strong&gt; automatically. Not "is flagged for review by a nightly job." Lapses, as a property of the data, at read time, for free.&lt;/p&gt;

&lt;p&gt;You cannot quietly edit a verified claim and keep its stamp. That single property is the difference between a record that is &lt;em&gt;auditable&lt;/em&gt; and a record that is merely &lt;em&gt;editable&lt;/em&gt;, and it costs one extra column.&lt;/p&gt;

&lt;p&gt;It also gives you a review queue for free, ordered by how much attention each thing needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;quarantined  ›  lapsed  ›  unverified  ›  awaiting-stamp  ›  unstamped  ›  stamped
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing goes unreviewed just because nobody happened to touch it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this cost
&lt;/h2&gt;

&lt;p&gt;Honest accounting, because the whole point of the design is honest accounting.&lt;/p&gt;

&lt;p&gt;Reads are more expensive. You are resolving a view over claims instead of selecting a row, so anything hot needs a materialized current-state projection, and now you have a cache invalidation problem you did not have before.&lt;/p&gt;

&lt;p&gt;Writes are chattier and the storage grows monotonically. You are keeping the losers.&lt;/p&gt;

&lt;p&gt;And the UI has to be able to say "these two disagree," which is a design problem most interfaces are not built to handle and which you will have to solve for real rather than hand-wave.&lt;/p&gt;

&lt;p&gt;I think it is worth it in any domain where being wrong is expensive and where you will eventually have to explain how you arrived at a number. Where the cost of being wrong is low, a boolean and a &lt;code&gt;last_updated&lt;/code&gt; are fine and you should use them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this runs
&lt;/h2&gt;

&lt;p&gt;This is the Master Ledger inside &lt;a href="https://mlsystemsri.com/" rel="noopener noreferrer"&gt;ML Systems&lt;/a&gt;, a construction technology company I run in Rhode Island. It is shipped and working — the ledger, the two-key verification, and the lapsing signatures are all live in the app on both app stores.&lt;/p&gt;

&lt;p&gt;I should also be clear about what is &lt;em&gt;not&lt;/em&gt; proven: the construction loop the ledger feeds is modeled, not measured. We label every claim in our public repo &lt;code&gt;MEASURED&lt;/code&gt;, &lt;code&gt;MODELED&lt;/code&gt; or &lt;code&gt;ASPIRATIONAL&lt;/code&gt; for exactly that reason, and I would rather tell you which is which than let you assume.&lt;/p&gt;

&lt;p&gt;The design docs are open, including the ledger, the ontology that governs how the claims compose, and how a whole house gets compressed into a canonical model: &lt;a href="https://github.com/MLSystemsRI/ml-systems-public" rel="noopener noreferrer"&gt;github.com/MLSystemsRI/ml-systems-public&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have built something similar — especially if you found a cleaner way to express domain-scoped authority than a lookup table — I would genuinely like to hear it.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>database</category>
      <category>typescript</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
