ship-or-theater 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,27 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.0.0] - 2026-11-07
9
+
10
+ ### Added
11
+ - Styled terminal scorecard (`src/terminal.ts`) as the default output when `stdout` is a TTY: verdict badge (`SHIPS` green, `MIXED` amber, `THEATER` red, `INCONCLUSIVE` grey), reality score bar, per-dimension bars and confidence, steelman, strongest debunk, and footer.
12
+ - `--format pretty|markdown|json` CLI flag and `--no-color` / `NO_COLOR` support (non-TTY output defaults to `markdown` for backward compatibility).
13
+ - Live TTY progress indicator on `stderr` while pipeline stages run (`extractor → 6 skeptics → steelman → judge`).
14
+ - Zero-setup `ship-or-theater rubric` subcommand and `--rubric` flag to print the fixed reality rubric and verdict bands with no model or API key, plus `--version` (`-V`).
15
+ - Shared provider resolution (`SOT_PROVIDER=auto|api|claude-cli`) across both the CLI and MCP server (`ship-or-theater-mcp`), allowing MCP clients to evaluate claims via the local `claude` CLI without `ANTHROPIC_API_KEY`.
16
+ - Claim gallery runner (`gallery/gallery.mjs`) with `--only <slug>`, `--concurrency <n>`, and `--force` options.
17
+ - Cross-platform GitHub Actions CI matrix (`ubuntu-latest`, `windows-latest`, `macos-latest` × Node 20/22) and GitHub Pages deployment workflow.
18
+
19
+ ### Changed
20
+ - Updated the default Anthropic API model from `claude-sonnet-4-6` to `claude-sonnet-5-5` (still overrideable via `SOT_MODEL` or `--model`).
21
+
22
+ ### Fixed
23
+ - Fixed Windows `spawn claude ENOENT` failure in `--provider claude-cli` by resolving `claude.cmd` / `claude.exe` on `PATH` and invoking `.cmd` shims safely with stdin prompt piping.
24
+ - Missing `claude` binary now fails immediately without retrying and prints an actionable install/key message.
25
+
26
+ ### Removed
27
+ - Removed hand-authored `examples/` directory in favor of real pipeline runs in `gallery/`.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kelly Seale
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,208 @@
1
- # Temporary Holding Version
1
+ <div align="center">
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ <img src="assets/logo.svg" alt="ship or theater" width="360">
4
+
5
+ **Is it shipping, or is it theater?** Six skeptics, a steelman and a judge score any AI claim from 0 to 100 on a fixed, public rubric, and say *inconclusive* when the evidence can't support a number.
6
+
7
+ [![CI](https://github.com/jordnlvr/ship-or-theater/actions/workflows/ci.yml/badge.svg)](https://github.com/jordnlvr/ship-or-theater/actions/workflows/ci.yml)
8
+ [![npm](https://img.shields.io/npm/v/ship-or-theater.svg)](https://www.npmjs.com/package/ship-or-theater)
9
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
10
+ [![Node ≥ 20](https://img.shields.io/badge/node-%E2%89%A520-brightgreen.svg)](package.json)
11
+
12
+ [**Website**](https://jordnlvr.github.io/ship-or-theater/) · [**Gallery of real runs**](gallery/README.md) · [Quickstart](#quickstart) · [MCP](#mcp-server) · [Library](#library)
13
+
14
+ <!-- HERO SLOT: assets/hero.svg is generated by `node scripts/build-site.mjs` from the featured gallery run
15
+ (gallery/*.json with "featured": true, else the highest score). Until a real run is published it shows the
16
+ scorecard layout with weights only and no scores. Never hand-edit it. -->
17
+ <img src="assets/hero.svg" alt="A real ship-or-theater scorecard from the gallery: verdict, 0 to 100 reality score and the six weighted dimensions" width="880">
18
+
19
+ </div>
20
+
21
+ ## Quickstart
22
+
23
+ Node 20 or newer. Nothing to install.
24
+
25
+ ```bash
26
+ # 1. See the rubric. No key, no login, no setup.
27
+ npx ship-or-theater rubric
28
+
29
+ # 2. Score a claim. Uses your Claude Code login, or ANTHROPIC_API_KEY if it is set.
30
+ npx ship-or-theater "Our 7B model beats GPT-4 on internal benchmarks." \
31
+ --context "Launch post; no weights or eval suite released."
32
+ ```
33
+
34
+ No API key? If [Claude Code](https://claude.com/claude-code) is installed and signed in, every agent call runs through your local `claude` CLI on your subscription. No key, no extra bill.
35
+
36
+ ## Why
37
+
38
+ AI announcements are easy to make and hard to check. A polished demo, one cherry-picked benchmark or a rebranded wrapper can look exactly like shipped capability. ship-or-theater does the checking the same way every time: it argues both sides, scores six fixed dimensions, and shows its work.
39
+
40
+ The tool is built to the bar it judges: schema-validated structured output, adversarial verification, graceful degradation and no invented confidence.
41
+
42
+ ## How it works
43
+
44
+ ```mermaid
45
+ flowchart LR
46
+ A["Claim + context + URL"] --> B["Extractor<br/>testable assertions"]
47
+ B --> C1["Skeptic: Reproducibility"]
48
+ B --> C2["Skeptic: Evidence quality"]
49
+ B --> C3["Skeptic: Scope honesty"]
50
+ B --> C4["Skeptic: Production-readiness"]
51
+ B --> C5["Skeptic: Novelty"]
52
+ B --> C6["Skeptic: Hidden caveats"]
53
+ B --> D["Steelman<br/>best honest case FOR"]
54
+ C1 & C2 & C3 & C4 & C5 & C6 & D --> E["Judge<br/>score or inconclusive, per dimension"]
55
+ E --> F["Scorecard<br/>verdict · 0-100 · both sides"]
56
+ ```
57
+
58
+ 1. The **extractor** pulls the discrete, testable assertions out of the claim.
59
+ 2. Six **skeptics**, one per dimension, run in parallel and hunt for theater.
60
+ 3. The **steelman** argues the strongest *defensible* case for the claim, without inventing evidence.
61
+ 4. The **judge** weighs skeptics against the steelman and gives each dimension a score, a confidence and its reasoning, or marks it `inconclusive`.
62
+ 5. The **scorecard** takes the weighted mean of the usable dimensions and maps it to a verdict.
63
+
64
+ The skeptic panel runs under `Promise.allSettled`: if one fails, its dimension is `inconclusive` and drops out of the mean. The run never crashes and never fills the gap with a guess.
65
+
66
+ ## The rubric
67
+
68
+ The rubric is the tool's point of view: fixed, weighted and published. Print it any time with `npx ship-or-theater rubric`.
69
+
70
+ | # | Dimension | Weight | The question |
71
+ |---|-----------|-------:|--------------|
72
+ | 1 | Reproducibility | 20% | Could an independent party reproduce it, or is it a cherry-picked demo? |
73
+ | 2 | Evidence quality | 20% | Real benchmarks and data, or screenshots and vibes? |
74
+ | 3 | Scope honesty | 20% | Does it generalize, or is narrow work dressed up as general? |
75
+ | 4 | Production-readiness | 15% | Demo or deployable: latency, cost, reliability, governance? |
76
+ | 5 | Novelty | 10% | Genuine new capability, or a wrapper and a rebrand? |
77
+ | 6 | Hidden caveats | 15% | What is not said: failure modes, constraints, cost? |
78
+
79
+ Each dimension scores 0 (pure theater) to 100 (real).
80
+
81
+ | Verdict | Reality score |
82
+ |---------|---------------|
83
+ | **SHIPS** | 70 and up |
84
+ | **MIXED** | 40 to 69 |
85
+ | **THEATER** | under 40 |
86
+ | **INCONCLUSIVE** | no usable dimension, so no score |
87
+
88
+ **Scoring.** Inconclusive dimensions are dropped and the remaining weights are renormalized, so the score stays on a 0-100 scale. If every dimension is inconclusive, the score is `null` and the verdict is `INCONCLUSIVE`. The tool refuses to assert a verdict it cannot support.
89
+
90
+ ## CLI
91
+
92
+ ```bash
93
+ npx ship-or-theater "<claim>" [options]
94
+ npx ship-or-theater rubric
95
+ npx ship-or-theater --version
96
+ ```
97
+
98
+ | Flag | What it does |
99
+ |------|--------------|
100
+ | `-c, --context <text>` | Context around the claim (what was released, what wasn't) |
101
+ | `-u, --url <url>` | Source URL for the claim |
102
+ | `-f, --format <f>` | `pretty` (terminal view, the default on a TTY), `markdown` or `json` |
103
+ | `-j, --json` | Shorthand for `--format json` |
104
+ | `--no-color` | Plain output; `NO_COLOR=1` does the same |
105
+ | `-o, --out <file>` | Write the scorecard to a file instead of stdout |
106
+ | `-m, --model <model>` | Model override. Default `claude-sonnet-5-5`, or set `SOT_MODEL` |
107
+ | `--provider <p>` | `auto` (default: the API when `ANTHROPIC_API_KEY` is set, else Claude Code), `api` or `claude-cli` |
108
+ | `-V, --version` | Print the version |
109
+
110
+ ```bash
111
+ # JSON for a pipeline
112
+ npx ship-or-theater "<claim>" --format json --out scorecard.json
113
+
114
+ # Markdown for a doc or a PR comment
115
+ npx ship-or-theater "<claim>" --format markdown > scorecard.md
116
+ ```
117
+
118
+ ## MCP server
119
+
120
+ `ship-or-theater-mcp` is a stdio MCP server with two tools:
121
+
122
+ - **`evaluate_claim`** runs the full pipeline and returns the scorecard (Markdown or JSON, plus structured content).
123
+ - **`get_rubric`** returns the rubric and verdict bands. Needs no model.
124
+
125
+ Add it to Claude Desktop or any MCP client:
126
+
127
+ ```json
128
+ {
129
+ "mcpServers": {
130
+ "ship-or-theater": {
131
+ "command": "npx",
132
+ "args": ["-y", "--package", "ship-or-theater", "ship-or-theater-mcp"],
133
+ "env": { "SOT_PROVIDER": "auto" }
134
+ }
135
+ }
136
+ }
137
+ ```
138
+
139
+ `SOT_PROVIDER` is `auto` (default), `api` or `claude-cli`. With Claude Code installed no key is needed; for `api`, add `"ANTHROPIC_API_KEY": "sk-ant-..."` to `env`.
140
+
141
+ ## Library
142
+
143
+ The pipeline takes an injected `llm` function, so it embeds anywhere and tests run against a fake with no network.
144
+
145
+ ```ts
146
+ import { evaluate, createLLM, renderMarkdown } from "ship-or-theater";
147
+
148
+ const llm = createLLM({ apiKey: process.env.ANTHROPIC_API_KEY });
149
+ const scorecard = await evaluate(llm, {
150
+ claim: "Our 7B model beats GPT-4 on internal benchmarks.",
151
+ context: "Launch post; no eval suite released.",
152
+ });
153
+
154
+ console.log(scorecard.verdict, scorecard.overallScore);
155
+ console.log(renderMarkdown(scorecard));
156
+ ```
157
+
158
+ ## Gallery
159
+
160
+ [`gallery/`](gallery/README.md) holds saved runs of the tool on famous public AI claims, each dated and signed with the model that judged it. Nobody edits the scores. The [website](https://jordnlvr.github.io/ship-or-theater/) renders the same files.
161
+
162
+ <!-- sot:readme-gallery:start -->
163
+ | Claim | Claimant | Verdict | Score |
164
+ | --- | --- | --- | ---: |
165
+ | [AlphaFold 2 at CASP14](gallery/alphafold2-casp14.md) | Google DeepMind | MIXED | 65.8 |
166
+ | [Segment Anything's zero-shot transfer](gallery/segment-anything-zero-shot.md) | Meta | MIXED | 60.6 |
167
+ | [Whisper's speech recognition release](gallery/whisper-open-speech-recognition.md) | OpenAI | MIXED | 53 |
168
+ | [GPT-4's top-decile bar exam claim](gallery/gpt4-bar-exam-percentile.md) | OpenAI | MIXED | 46.1 |
169
+ | [Galactica's scientific knowledge claim](gallery/galactica-scientific-knowledge.md) | Meta | THEATER | 38.6 |
170
+ | [Devin's SWE-bench launch result](gallery/devin-swe-bench-launch.md) | Cognition | THEATER | 33.6 |
171
+ | [Gemini's 2023 multimodal demo](gallery/gemini-2023-multimodal-demo.md) | Google | THEATER | 30.9 |
172
+ | [Recall's launch privacy promise](gallery/recall-launch-privacy.md) | Microsoft | THEATER | 29.8 |
173
+
174
+ All 8 runs were made on Nov 7, 2026 with the `claude-cli` provider (the local `claude` CLI) and the model alias `sonnet`. None reached SHIPS, which takes 70 or more.
175
+ <!-- sot:readme-gallery:end -->
176
+
177
+ ## Design principles: honest by construction
178
+
179
+ - **Inconclusive beats invented.** A dimension with no usable evidence gets no score. Nothing usable at all means no verdict.
180
+ - **The LLM layer is isolated.** Only the provider modules talk to a model. Every agent depends on an injected `llm`, so the whole system runs deterministically against a fake in tests.
181
+ - **Structured output, validated.** Each agent must return one tool call whose schema comes from zod, then passes `zod.parse`. One retry on a schema failure, then it throws; unvalidated data never moves on.
182
+ - **Prompt caching.** The shared rubric and persona block is sent with `cache_control: ephemeral`, so repeated agent calls in a run hit the cache.
183
+ - **Graceful degradation.** A failed skeptic makes its dimension inconclusive, not a crash and not a guess.
184
+ - **Pure, tested core.** Rubric math and rendering are pure functions with tests that assert computed numbers and band boundaries.
185
+
186
+ ## Roadmap
187
+
188
+ - Source-URL fetching and citation extraction feeding the extractor.
189
+ - Calibration against a labelled corpus of past claims (known ships, known theater).
190
+ - Re-run history: re-evaluate a claim as new evidence lands.
191
+ - More model providers behind the `llm` interface.
192
+
193
+ ## Development
194
+
195
+ ```bash
196
+ npm install
197
+ npm run typecheck # tsc --noEmit
198
+ npm test # vitest, no API key needed
199
+ npm run build # tsup -> dist/
200
+ ```
201
+
202
+ Live smoke test against the real API: `npm run build && ANTHROPIC_API_KEY=... npm run smoke`. It runs one real evaluation and prints the scorecard.
203
+
204
+ The website lives in `site/`. After adding a run to `gallery/`, rebuild its data, the README hero image and the README gallery table with `node scripts/build-site.mjs`.
205
+
206
+ ## License
207
+
208
+ MIT © [Kelly Seale](https://github.com/jordnlvr)
package/dist/cli.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import { L as LLM } from './llm-gKw2aSfQ.js';
2
+ import '@anthropic-ai/sdk';
3
+ import 'zod';
4
+
5
+ interface CliStream {
6
+ isTTY?: boolean;
7
+ columns?: number;
8
+ write: (chunk: string) => boolean;
9
+ }
10
+ interface CliIO {
11
+ stdout?: CliStream;
12
+ stderr?: CliStream;
13
+ env?: NodeJS.ProcessEnv;
14
+ llmOverride?: LLM;
15
+ }
16
+ declare function runCli(argv: string[], io?: CliIO): Promise<number>;
17
+
18
+ export { type CliIO, type CliStream, runCli };