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>
5.4 KiB
name, kind
| name | kind |
|---|---|
| assumption-miner | composite |
Assumption Miner
Heterogeneous agents independently list what the material assumes but does not state. Cross-tier disagreement on assumptions reveals hidden dependencies.
Description
Heterogeneous agents independently surface unstated assumptions; cross-tier disagreement reveals hidden dependencies.
Metadata
version: 0.1.0
Slots
miner(primary)- requires: material, context
- ensures: assumptions
comparator- requires: assumption_lists_by_tier
- ensures: classified_assumption_map
Config
tiers(object[], default: {'model': 'opus', 'count': 3}, {'model': 'sonnet', 'count': 2}): Miner configurations specifying model tier and count per tiermaterial(string, default: none): The corpus or artifact to examine for unstated assumptionscontext(string, default: none): Optional domain context to help miners distinguish assumptions from common knowledge
Invariants
- Each miner receives the same material and identical instructions
- Miners work independently — no miner sees another's output
Shape
self: fan out to miners across tiers, collect assumption lists, delegate comparisondelegates:miner: list unstated assumptions in the material — run across tierscomparator: classify assumptions by agreement pattern across tiers
prohibited: none
Requires
- &compositeState exists at __compositeState with: miner: string -- component name for each miner comparator: string -- component name for the comparator material: string -- the corpus or artifact to examine tiers: object[] -- miner configurations, e.g. [{ model: "opus", count: 3 }, { model: "sonnet", count: 2 }] context: string -- (optional) domain context to help miners distinguish assumptions from common knowledge
Ensures
- Each miner receives the same material and is asked: "What does this assume is true but not explicitly state?"
- Miners work independently — no miner sees another's output
- Comparator receives all assumption lists and classifies each assumption:
- Universal: surfaced by all tiers — a KNOWN implicit dependency (widely recognizable)
- Deep: surfaced only by higher tiers — a HIDDEN dependency (requires expertise to notice)
- Contested: agents disagree on whether it IS an assumption — may be a FALSE assumption or a point of genuine ambiguity about what the material presupposes
- Phantom: surfaced by lower tiers but not higher — likely a MISREADING, not an actual assumption
- &compositeState.result contains the comparator's classified assumption map
- &compositeState.raw_assumptions contains per-miner assumption lists
Delegation Loop
const { miner, comparator, material, tiers, context } = __compositeState;
// Build miner roster
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 });
}
}
// Each miner independently extracts assumptions
const rawAssumptions = {};
for (const agent of roster) {
const brief = `Examine the following material carefully. List every assumption it makes but does not explicitly state — things that must be true for the material to be correct or coherent, but which are not written down.
For each assumption, explain:
- What is assumed
- Where in the material this assumption is required
- What would break if the assumption were false
${context ? `Domain context: ${context}\n\n` : ""}Material:
${material}`;
const assumptions = await rlm(brief, null, { use: miner, model: agent.model });
rawAssumptions[agent.id] = { model: agent.model, assumptions };
}
// Comparator classifies
const comparatorBrief = `${roster.length} independent agents across ${tiers.length} capability tiers examined the same material and listed its unstated assumptions.
Classify each unique assumption that was surfaced:
- UNIVERSAL: surfaced by agents across all tiers — a widely recognizable implicit dependency
- DEEP: surfaced only by higher-tier agents — a hidden dependency requiring expertise to notice
- CONTESTED: agents disagree on whether this is actually an assumption — indicates ambiguity about what the material presupposes
- PHANTOM: surfaced by lower tiers but not higher — likely a misreading rather than a real assumption
For each assumption, note which agents surfaced it and at which tier.
Assumption lists 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${rawAssumptions[a.id].assumptions}`
).join("\n\n")}`;
}).join("\n")}`;
const analysis = await rlm(comparatorBrief, null, { use: comparator });
__compositeState.result = analysis;
__compositeState.raw_assumptions = rawAssumptions;
return(analysis);
Notes
This is a seed pattern. Miners do not know other miners exist. The comparator does not know it is part of an assumption miner composite. The key distinction from blind-review: blind-review asks "what does this say?" and measures comprehension. Assumption miner asks "what does this NOT say?" and measures implicit dependencies. A document can score perfectly clear on blind-review while harboring deep unstated assumptions that only the assumption miner surfaces. The most dangerous assumptions are the DEEP ones — dependencies that are real, load-bearing, and invisible to most readers.