One brief got built, broke on a section that said the same thing five times, and the fix turned into committed law: two new grammar gates, a zero-cost linter shipped to production, and a clean public brief live behind the gate. This is the full ledger of that session.
The work started as a brand analysis of IES Holdings for a transaction-prep context. A first internal version was framed around that context, which raised a legal and NDA concern: profiling a counterparty implies knowledge of it. The response was to rebuild the brief from public sources only, decoupled from any other engagement in both content and file location, so it reads as a standard analysis of a public company and is safe to send to anyone.
The finding stands on public filings alone: IES is a $3.37B debt-free infrastructure compounder riding the data-center construction boom that almost no one can name. Its brand power lives in the capital markets and in its operating companies, with a nearly empty master brand between them. Brand Power: 58.5 / 100 (Average) — financially strong, brand-structurally average. The editorial carries a network map, the five brand openings, a brand-power scorecard, a segments-and-roll-up view, and a command dashboard.
The internal, context-framed version was preserved separately, and a reusable two-tier report protocol now governs the split: build and seal the public Tier 1 first, verify the served markup is clean, and never let the privileged Tier 2 touch it.
The brief's "Where It Breaks" section listed five openings that were really one idea — the hollow master brand — restated from five angles, sitting after two prose sections that had already made the point. One card's headline even duplicated a section heading word for word. Each unit read well on its own; together they were a broken record.
The most valuable version of a thought is sometimes the one that says something the others did not.
The repair was a single move: read the whole sequence as a reader and, for each unit, name the one thing it adds that no prior unit added. The five cards were rebuilt as five genuinely distinct openings, each at a different altitude and domain — the name itself, the unclaimed category, the audience IES wants to acquire, the unexplained segment, the recruiting magnet. Each now earns its place.
A five-agent team audited the chain of thought that produced the redundancy and the process that repaired it. The honest root cause was structural, not a lapse of attention: a per-item schema with no set-level distinctness test, a template with multiple slots that shared one job, and a linter family that ledgers numbers but never ideas. The house style even pushed the strongest claim into every slot.
The failure class is faceted-thesis redundancy: one strong insight split across many slots, each individually well-written, collectively saying one thing. It recurs whenever there is one strong idea and a multi-slot container. The audit produced grammar v0.7:
Canonical spec: projects/shur/report-grammar/v4-argument-progression/SPEC.md (one source of truth; the other systems transclude it, never paraphrase).
A rule only matters where reports are actually produced, so the spec went into three places at two enforcement layers — a deterministic hard gate in the app, and the rules I follow in a session.
The keystone R-LINT.4 headline-collision linter (a generalization of the existing number-ledger to section and card titles) now runs server-side in validateSectionsAggregate and would have caught the original failure at zero cost. New distinctness.ts and progression.ts judges, two publish gates, and migration 0008 (applied to remote D1) shipped. Typecheck clean. The semantic progression judge runs in the managed-agent path only, to keep the inline path cheap.
The /intelligence-brief skill now carries the distinctness gate (analysis), the section-job roles (editorial), the progression read (quality gate), and a house-style counter-edit that requires each tab's hard truth to be a different truth. Two regression evals use this session's failure as the fixture.
rlint4.py is a zero-dependency port of the app's linter, so a Claude Code session — slash command or a plain "make me a report" — gets the same deterministic catch instead of relying on discipline. Validated: clean on the fixed brief, catches both verbatim and near-duplicate headings.
The agent pipeline now runs research → verify → sbpi → distinct → synthesis → progress → build, with the two new gates cleared by status writes and the deterministic linter underneath. The live cutover (re-provision + endpoint) is left as a deliberate human step.
The IES brief got a persistent viz-hub button in the header, a pronounced hero button, and an always-visible bottom section, plus the full June 4, 2026 dateline. It was shared to #shur-ai with the team tagged and a clean explanation, posted as the ShurIQ bot because the channel is Slack Connect. The brief sits behind the email gate.
projects/shur/report-grammar/v4-argument-progression/SPEC.md…/v4-argument-progression/00–06 (self-audit, failure, repair, rules, ontology, rubric, integration)…/v4-argument-progression/rlint4.pyprojects/shur/methodology/two-tier-report-protocol.mdprojects/shur/shuriq-report-studio/app/functions/lib/ (linters · distinctness · progression · grammar)projects/shur/shuriq-report-studio/managed-agent/system.md