Files
openprose__prose/packages/std/composites/blind-review.md
irl-dan 63c8ce4b23 Migrate std and co into packages/ monorepo layout
Move the standard library (previously `github.com/openprose/std`) and
the company-as-prose library (previously local dir
`/Users/sl/code/openprose/company-as-prose`) into this repository
under `packages/std/` and `packages/co/` respectively.

Motivation: concentrate attention on one repository so stars,
discussions, and issues aggregate. `openprose/std` was a genuinely
useful asset nobody could find because ~50 stars on its own repo
told a much worse story than 1,106 stars on `openprose/prose`
would have. Same logic applies to co.

Layout choice: `packages/{std,co}/` rather than `std/` + `co/` at
the repo root. Root siblings accumulate over time, and a flat
top-level made future libraries (hub, kit, dev, etc.) compete with
spec infrastructure. `packages/` is bounded — new libraries land
there without cluttering root. Matches pnpm/Deno/monorepo tooling
conventions.

Changes:

- New: `packages/std/` (copied from openprose/std, `.git` excluded)
- New: `packages/co/` (copied from company-as-prose, README updated
  for new name and location)
- `packages/std/README.md`: updated shorthand expansion reference
- `packages/co/README.md`: renamed "company-as-prose" to "co" in
  self-references, added std-vs-co split heuristic, updated
  `prose run` examples to use `co/` shorthand
- `skills/open-prose/deps.md`:
  - `std/` shorthand now expands to
    `github.com/openprose/prose/packages/std/`
  - `co/` shorthand added, expands to
    `github.com/openprose/prose/packages/co/`
  - Both shorthands resolve into the same clone of
    `openprose/prose` under `.deps/github.com/openprose/prose/`;
    `packages/std/` and `packages/co/` are sibling subdirectories
  - `prose.lock` format row updated to `host/owner/repo sha`
    (matches the explicit-host resolution that landed in #35)
  - `.deps/` directory structure example redrawn to show the
    `{host}/{owner}/{repo}/packages/{std,co}/...` shape
  - Error message and Interaction tables refreshed accordingly
  - Resolution Algorithm step 1 now documents both shorthands
- `skills/open-prose/forme.md`: Step 2 resolution list updated to
  include co/ shorthand and the host-keyed `.deps/` layout
- `skills/open-prose/help.md`: Q&A "How do dependencies work?"
  rewritten to name both shorthands and the new explicit-host model
- `skills/open-prose/state/filesystem.md`: `.deps/` directory
  tree re-drawn to include the `{host}/` layer with std/co as
  sibling packages inside the clone
- `skills/open-prose/guidance/patterns.md`,
  `skills/open-prose/guidance/antipatterns.md`: examples now use
  the `std/` shorthand or explicit `github.com/...` rather than
  the deprecated bare `openprose/std/` form
- `skills/open-prose/examples/registry-import/index.md`: sample
  service reference switched to `std/evals/inspector`
- `README.md`: Stdlib badge replaced with internal `packages/std/`
  link plus new `packages/co/` link; "Standard Library" section
  rewritten as "Libraries" with both packages described

Out of scope for this PR (deliberately):
- Tooling changes to `prose install` and Forme's `.deps/` writer
  to adopt the `{host}/{owner}/{repo}/` layout in practice — this
  PR is spec-only. Existing tooling continues to work against
  whatever layout it currently implements; the spec now describes
  the target.
- Retiring the `openprose/std` GitHub repo. Delete that repo
  separately after this merges.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 14:14:31 -07:00

6.6 KiB

name, kind
name kind
blind-review composite

Blind Review

Heterogeneous reviewers build understanding progressively. Disagreement across capability tiers reveals ambiguity; agreement reveals clarity.

Description

Heterogeneous reviewers build understanding progressively; cross-tier divergence diagnoses clarity, complexity, and ambiguity.

Metadata

  • version: 0.1.0

Slots

  • reviewer (primary)
    • requires: task_brief, material
    • ensures: report
  • comparator
    • requires: staged_reports_by_tier
    • ensures: analysis

Config

  • tiers (object[], default: {'model': 'opus', 'count': 3}, {'model': 'sonnet', 'count': 3}, {'model': 'haiku', 'count': 3}): Reviewer configurations specifying model tier and count per tier
  • materials (string[], default: none): Ordered list of materials to disclose progressively
  • task_brief (string, default: none): What reviewers should focus on when examining materials
  • output_dir (string, default: none): Optional directory for reviewer reports

Invariants

  • Reviewers are independent — no reviewer sees another's output
  • Materials are disclosed one at a time, in order, to each reviewer
  • Reviewers across different tiers receive identical materials and briefs

Shape

  • self: fan out to reviewers across tiers, feed material progressively, collect staged reports, delegate comparison
  • delegates:
    • reviewer: examine material and report understanding — run once per tier per reviewer
    • comparator: compare reports across tiers and stages, identify divergence
  • prohibited: none

Requires

  • &compositeState exists at __compositeState with: reviewer: string -- component name for each reviewer comparator: string -- component name for the comparator tiers: object[] -- reviewer configurations, e.g. [{ model: "opus", count: 3 }, { model: "sonnet", count: 3 }, { model: "haiku", count: 3 }] materials: string[] -- ordered list of materials to disclose progressively (file paths, briefs, etc.) task_brief: string -- what reviewers should focus on (e.g. "describe what this system is and intends to do") output_dir: string -- (optional) directory for reviewer reports

Ensures

  • Reviewers are independent — no reviewer sees another's output
  • Materials are disclosed one at a time, in order — each reviewer reports understanding after each disclosure
  • Reviewers across different tiers receive identical materials and briefs
  • Comparator receives all staged reports grouped by material and by tier
  • Comparator identifies: agreement (clarity), disagreement (ambiguity), and tier-correlated divergence (complexity)
  • &compositeState.result contains the comparator's analysis
  • &compositeState.reviews contains the structured per-reviewer, per-stage reports
  • &compositeState.divergences contains points of disagreement with tier and stage metadata

Delegation Loop

const { reviewer, comparator, tiers, materials, task_brief, output_dir } = __compositeState;

// Build reviewer roster from tier specs
const roster = [];
for (const tier of tiers) {
  for (let i = 0; i < (tier.count || 1); i++) {
    roster.push({ id: `${tier.model}-${i + 1}`, model: tier.model });
  }
}

// Progressive disclosure: each reviewer sees materials one at a time
const reviews = {}; // reviews[reviewerId][stageIndex] = report

for (const agent of roster) {
  reviews[agent.id] = [];
  let priorUnderstanding = "";

  for (let stage = 0; stage < materials.length; stage++) {
    const material = materials[stage];
    const brief = stage === 0
      ? `${task_brief}\n\nExamine ONLY the following material. Report your understanding as specifically as possible.\n\n${material}`
      : `${task_brief}\n\nYour understanding so far:\n${priorUnderstanding}\n\nNow also examine this additional material. Report how your understanding has changed or deepened.\n\n${material}`;

    const report = await rlm(brief, null, { use: reviewer, model: agent.model });
    reviews[agent.id].push({ stage, material_ref: material, report });
    priorUnderstanding = report;
  }
}

// Comparator analyzes across tiers and stages
const comparatorBrief = `${roster.length} independent reviewers across ${tiers.length} capability tiers examined the same materials progressively. Compare their reports.

Identify:
1. Points of AGREEMENT across all tiers (high clarity — the material communicates unambiguously)
2. Points of DISAGREEMENT within a tier (noise — individual variation)
3. Points of DISAGREEMENT across tiers (ambiguity or complexity — the material may be unclear)
4. Understanding that only emerges at higher tiers (complexity that rewards capability)

Task context: ${task_brief}

Reviews by tier:
${tiers.map(tier => {
  const tierAgents = roster.filter(a => a.model === tier.model);
  return `\n=== ${tier.model.toUpperCase()} TIER ===\n${tierAgents.map(a =>
    `--- ${a.id} ---\n${reviews[a.id].map((r, i) =>
      `[After material ${i + 1}]: ${r.report}`
    ).join("\n")}`
  ).join("\n\n")}`;
}).join("\n")}`;

const analysis = await rlm(comparatorBrief, null, { use: comparator });

// Extract divergences
__compositeState.result = analysis;
__compositeState.reviews = reviews;
return(analysis);

Notes

This is a seed pattern. Reviewers do not know other reviewers exist. The comparator does not know it is part of a blind review composite. The two structural innovations over a standard ensemble are:

Heterogeneous tiers. The tier variation is not a cost-saving measure — it is the diagnostic instrument. Cross-tier response patterns produce three distinct diagnoses:

  • Clear: All tiers agree (including haiku). The material communicates unambiguously regardless of capability.
  • Complex but unambiguous: Higher tiers agree, lower tiers struggle or diverge. The material rewards capability but is not unclear — it is genuinely difficult.
  • Ambiguous: Agents within the same tier disagree with each other (especially at higher tiers). The material itself is unclear — more capability does not resolve the disagreement because the source of divergence is in the material, not the reader.

Progressive disclosure. By feeding material incrementally and collecting reports at each stage, the orchestrator can identify exactly which piece of material introduces divergence. This turns a binary "agree/disagree" into a localized ambiguity map.

The combination produces a diagnostic tool: run a blind review on your documentation, specification, or design, and the divergence pattern tells you where your communication is unclear, where it is merely complex, and where it is genuinely ambiguous.