Back to portfolio
Sven Manzanarez · applying for the design engineer role Not affiliated with Regbase · not legal advice

Two minutes for this screen · ten for the rest

The same rule, read by two of your customers

Your trackers already carry the commercial consequence of every change: the money, the deadline, who it lands on. It sits inside the summary paragraph. This proposes holding it as structure instead.

What it buys you

  • Analysis pieces stop being hand-built. The header comes off the record; your writer keeps the argument.
  • “Does this apply to me” becomes a filter instead of a reading exercise.
  • One corpus serves your compliance readers and your government-vendor readers, without a second product.

What it costs

A schema and a set of rendering rules. A first version is a week of design and a week of extraction work — not a quarter, and not a rewrite of what you have.

A vocabulary, not a redesign, built against a law you publish. Every term is up for correction.

Three kinds of content, marked wherever they appear

Quoted

Yours, reproduced as written, source and verified date given.

Proposed

The vocabulary. This is what I am proposing.

Mock-up

Dashed frames. Not your screens, and no attempt to match your interface.

Start here: the vocabulary

Proposed This is the deliverable. Everything after it is the same vocabulary applied to one of your laws. The full spec has ten fact types, nine event types and six derivations; this is the short version.

Facts — on the item

instrumentstageforceobligation typeamountclockaffected partyjurisdictionrelationsource
Stage and force are separate
SB 253 is final and in force. SB 261 is final and suspended by a court. One status column cannot hold both.
Amounts carry a kind and a route
A threshold, a fee, a penalty ceiling and an allocation behave nothing alike. Route says how the reader reaches the money, or that they cannot.
Clocks carry a mode
Fixed, conditional, relative to an event, or not yet set. Your PFAS window needs three of those four.

Readings — derived, never stored

standingmarket exposuredirectionrouteurgencyconfidence
Standing is tested twice
Once against the reader, once against the parties the reader sells to. The second pass is what turns "doesn't apply to you" into something worth sending.
Direction is a function, not a field
The same money is a cost to one reader and an opportunity to another. Store it on the item and it is wrong for half your audience.
Confidence separates direct from downstream
A second-order inference never gets to look like a direct finding.

Admission test

CitableA model can assign it and point at the text it came from.
CompressibleIt survives in a one-line email alert.
QueryableYou can filter on it.
Quiet in proseIt can sit above an article without turning the article into a form.

A priority or importance score fails the first test, which is why nothing like it is in here.

The second pass

Affected-partyconditions, from the item Pass 1 — the readerrevenue · nexus · what you make Applies? Pass 2 — your marketthe parties you sell to In scope? Standing: applies direct finding · citable to the text Market exposure downstream · labelled wherever it appears applied to no yes yes no Nothing to send a decision with a reason, not an empty inbox
The test runs twice. First against the reader. If the answer is no, again against the people that reader sells to. Every regulatory product does the top path. The bottom path is the shape of the school-safety grants result you describe publicly. A finding that arrives that way is an inference, not something found in the text, so it should say so wherever it appears.
Every term is a closed set — all 41 values ▾
Instrumentstatuteregulationguidanceenforcement actioncourt order
Stageproposedopen for commentadoptedfinalwithdrawn
Forcein forcenot yet in forcesuspended by court
Obligation typeobligationprohibitionallocationexposureeligibility changeprocedure change
Amount kindthresholdfeepenalty ceilingallocationcost estimate
Amount routegrant applicationprocurementsubcontractcommercialnone
Clock typeeffectivecomment closeapplication closereporting duefee duephase-inexpiry
Clock modefixedconditionalrelative to eventnot yet set
Confidencedirectdownstreamestimated

Closed sets are what make the query work, and what stops the vocabulary drifting one tracker at a time. Every value came out of your published pages. None were invented to fill a row.

The test, applied — including what it rejects

Candidate termCitableCompressibleQueryableQuiet in proseVerdict
Obligation type✓✓✓✓in
Amount — kind and route✓✓✓✓in
Clock — type and mode✓✓✓✓in
Affected party — direct or downstream✓✓✓✓in
Summary paragraph✓✗✗✓out
Priority score✗✓✓✓out
Business impact: high / medium / low✗✓✓✓out
Regulator's posture or tone✗✓✗✗out

The rejections are the useful part. Summary paragraph is what you hold today. It cites cleanly and fails the two tests that would let a machine use it. Priority score is what several competitors ship. It cannot be traced to a line of text, so I left it out — though you may have a reason to carry one that I cannot see.

Now apply it. Pick a reader.

Everything below changes when you switch. The facts do not. Proposed — both are composites built from customer types you name publicly, not real companies.

Position first, then the reasoning, then the source

The order is part of the proposal. Today a reader works out their own standing from the tracker.

Why — the readings Proposed

Recomputed for whoever is looking, never written onto the item. Nothing in the facts changed between the two readers — only the profile did. Cannot determine is a result, not a blank, and it names what would settle it.

The evidence — 12 facts ▾
Facts QuotedIdentical for both readers

SB 253 — Climate Corporate Data Accountability Act

California · Health & Safety Code §§ 38532–38533, as your tracker cites them

Eleven values are yours, quoted from the tracker. The twelfth is inferred, and marked. Every field name is mine — your tracker holds all of it as prose.

Source: Regbase, SB 253 & SB 261: California Climate Disclosure Law Tracker, verified 2 September 2026.

Three surfaces, one record

Every surface gets a budget: how many terms it can carry and stay readable. The vocabulary stays the same, the budget changes. Dropping is the design work — a surface that carries everything carries nothing. The standing block above is a fourth. Two more are not mocked: a tracker page carries every term, because it is where someone goes to check; an analysis piece carries the facts as a header and leaves the prose exactly as your writer wrote it.

Mock-up A dashed frame means I invented the rendering. These are not your screens. The law inside them is still yours.

Email alert Mock-upTwo budgets: the subject line carries 2 slots · the body carries the standing block as sentences

In the inbox — subject line, 2 slots: standing and nearest clock

Regbase tracking 08:12

Opened — the standing block rendered as prose, in the same order

Two budgets. The subject line gets two terms, standing and the nearest clock, because that decides whether it gets opened. The body runs the standing block in the same order: what changed, where you stand, what it costs. Both come off the record. Neither is written by hand.

Table row Mock-upBudget: 4 slots · standing · obligation · next clock · amount
Name · stage · forceStandingObligationNext clockAmount

Standing is a reading, so it gets its own column. Stage and force stay with the instrument — an injunction is a fact about the law, not about the reader. SB 261 shows two things: "not yet set" as a value rather than an empty cell, and one suspended statute reading differently for each reader.

Query Mock-upThe reader is part of the query — same question, same corpus, different answer
?
How it resolves

Invented syntax, standing in for whatever you would actually build. The point is not how it gets typed. The point is that the reader is an argument to every query, so "nothing applies to you" can run a second pass instead of returning nothing.

How this would sit behind your product

I have not seen your stack. This is how I would build it, not a description of what you have.

Where each piece runs

Your agentssources · languages Extractionno locator, no fact Event logappend-only · state is a fold Reader profilefive attributes · versioned Derivation pure · at request time Projections standing · alert · row · tracker · analysis · query emits writes reads with renders cache key (item_version, profile_version) · invalidate on either
One choice carries the rest: derivation runs at request time. Standing, direction and market exposure are never written to the item.
What a record looks like — the full JSON ▾
{
  "item": "ca-sb-253",
  "instrument": "statute",
  "stage": "final",
  "force": "in_force",
  "jurisdiction": { "level": "state", "name": "California" },
  "obligation_type": ["obligation", "exposure"],
  "amounts": [
    { "kind": "threshold", "value": 1000000000, "currency": "USD",
      "party": "reporting_entity", "route": "none", "basis": "stated",
      "source": { "doc": "hsc-38532", "locator": "§ 38532(b)" } },
    { "kind": "penalty_ceiling", "value": 500000, "currency": "USD",
      "party": "reporting_entity", "route": "none", "basis": "stated",
      "source": { "doc": "hsc-38532", "locator": "§ 38532(e)" } },
    { "kind": "fee", "value": 3106, "currency": "USD",
      "party": "reporting_entity", "route": "none", "basis": "proposed",
      "source": null, "status": "held_for_review" }        // ← no locator, so it does not ship
  ],
  "clocks": [
    { "type": "reporting_due", "mode": "fixed", "value": "2026-11-10",
      "granularity": "day", "basis": "proposed", "revisions": 0,
      "source": { "doc": "carb-96076", "locator": "§ 96076(c)" } },
    { "type": "fee_due", "mode": "relative", "offset_days": 60,
      "anchor_event": "fee_determination_notice", "value": null,
      "source": null, "status": "held_for_review" },
    { "type": "phase_in", "mode": "fixed", "value": "2027",
      "granularity": "year", "basis": "stated",
      "source": { "doc": "hsc-38532", "locator": "§ 38532(c)(2)" } }
  ],
  "affected": [
    { "party": "p_over_threshold", "degree": "direct",
      "condition": "us_organized AND ca_nexus AND revenue > amount:threshold",
      "source": { "doc": "hsc-38532", "locator": "§ 38532(b)" } },
    { "party": "p_assurance_providers", "degree": "downstream",
      "condition": "sells_to(p_over_threshold)",
      "source": null, "basis": "inferred" }
  ],
  "relations": [
    { "type": "parallel_to",    "item": "ca-sb-261" },
    { "type": "implemented_by", "item": "carb-96076" }
  ]
}

Two things. No standing, no direction, no urgency anywhere in the record — keeping them out is what lets one record serve every reader. And two facts carry "source": null, so they sit at held_for_review instead of rendering. I could not find a locator for the fee schedule or the fee clock. That is the case the rule exists for.

Six consequences worth arguing about

A fact without a locator does not get written.Your traceability claim stops being a claim and becomes something the pipeline enforces. Whatever fails the check is your review queue.
Events are the log; item state is a fold over it.Your changelog, your tracker's current state and an analysis header all read the same log. Your BHT piece is five dated events, retyped as prose today.
Derivation is pure, but a query surface still needs an index.You cannot filter on a column you have said does not exist. Either materialise standing per (item, profile), or narrow on facts first and derive over what is left. I would start with the second and measure — the first turns every profile edit into a write across the corpus. Either way the record is unchanged.
Closed sets are enums, so the query surface is just predicates.Every term is an indexed column. Natural language on the front end resolves to predicates instead of searching prose.
Confidence is computed, never self-reported.It falls out of the basis of the facts used and the degree of the affected party. A model scoring its own certainty is the one thing your buyers cannot check.
Adding a term is additive; surfaces declare what they carry.A new fact type does not leak into every view, because each surface names its budget.

What I would most want to be wrong about: whether extraction can assign obligation type and affected-party conditions reliably at your coverage. If it cannot, the vocabulary still holds, but the write path needs a person in it and the economics change.

If this is worth anything to you

What I would do first

Take one tracker end to end — facts with locators, the standing block, one alert — and find out whether extraction holds at your coverage. That answers the only question that decides whether the rest is worth building.

What I would want from you

Twenty minutes, or one sentence telling me which term is wrong. Either one is useful, and the second is faster.