Files
openprose__prose/packages/std/patterns/dialectic.prose.md
irl-dan 4bc41a93bb launch readiness: green CI publish path, front-door, taxonomy migration
Get the Reactor packages mergeable + publishable and the launch surfaces coherent.

CI / publish (ci-reactor-package.yml):
- Drop the deleted reactor-cradle from the workflow and remove the obsolete .mjs
  release-gate suite (.github/scripts/*reactor*.mjs + tests) entirely.
- Add per-package pack + publish jobs for @openprose/reactor, @openprose/reactor-cli,
  and @openprose/reactor-devtools (idempotent, version-from-package.json,
  reactor-v* tag-gated, provenance). The two CLI packages now have a release path.
- Fix the dangling cradle reference in tools/cli build-release-tarball.mjs;
  regenerate pnpm-lock.yaml.

Install / first-run:
- reactor-cli: @openprose/reactor moved peer -> dependency (a global install now
  pulls the SDK); @openai/agents + zod become optional peers (keyless install stays light).
- SDK README: replace non-existent *V0 imports with the real exports
  (verifyReceipt / LedgerReceipt / inspectReceiptProof / projectReceiptProof).
- CLI README + http-server comment: correct the trigger route to POST /trigger/<node>.

Front-door + taxonomy:
- Promote the Reactor-forward launch README; add the technical report at
  docs/reactor/v0.1/report.md (replacing the stale v0.1).
- Migrate SKILL.md and all packages/std + packages/co contracts off the retired
  taxonomy (kind: service -> function, kind: system deleted, ### Ensures -> ### Maintains,
  ### Criteria/### Services folded) onto the Reactor model.

Prune the dead cradle-importing examples: drop flat-tokens and
release-readiness/reactor-package-example (keeping release-readiness/src, which is tested).

Gates: build, test:reactor:offline, test:examples (10/0), test:skill (252/252) all green offline.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 18:45:39 -07:00

2.5 KiB

name, kind
name kind
dialectic pattern

Dialectic

Thesis and antithesis argue positions. Disagreement IS the output.

Description

Thesis and antithesis argue opposing positions; the unresolved tension is the output.

Metadata

  • version: 0.1.0

Slots

  • thesis
    • requires: task_brief, prior antithesis argument (if not first round)
    • ensures: argument for the position
  • antithesis
    • requires: task_brief, prior thesis argument
    • ensures: argument against the position

Config

  • rounds (integer, default: 2): Number of exchange rounds

Invariants

  • Neither service knows it is part of a dialectic
  • The full exchange is the output — the pattern never resolves the tension
  • Each service sees only the other's prior argument, not its reasoning

Shape

  • self: manage argument rounds, pass each service the other's prior argument
  • delegates:
    • thesis: argue for a position
    • antithesis: argue against it
  • prohibited: none

Parameters

  • Pattern instance receives: thesis: string -- function or responsibility name for thesis service antithesis: string -- function or responsibility name for antithesis service task_brief: string -- the question or proposition to argue rounds: number -- (optional, default 2)

Returns

  • Round 1: thesis argues first, antithesis responds
  • Subsequent rounds: each service sees the other's prior argument
  • This pattern does NOT resolve the tension — the full exchange is the output
  • The instantiating system extracts insight from the tension
  • result: the full exchange
  • exchange: structured round-by-round arguments

Delegation

let exchange = []
let last_thesis = null
let last_antithesis = null

repeat rounds as round:
  let last_thesis = call thesis
    task_brief: task_brief
    prior_antithesis: last_antithesis
    prompt: "Argue for the position, responding to the prior counterargument if present."

  let last_antithesis = call antithesis
    task_brief: task_brief
    prior_thesis: last_thesis
    prompt: "Argue against the position, directly countering the thesis argument."

  record { round: round, thesis: last_thesis, antithesis: last_antithesis } in exchange

return {
  result: exchange,
  exchange: exchange
}

Notes

This is a seed pattern. Neither service knows it is part of a dialectic. Each receives a brief asking it to argue a position. The structural value is in the tension between positions — premature consensus is more dangerous than unresolved disagreement.