From f90d83292539bb8d807f3e3648b9b5d116f8fb96 Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Tue, 13 Oct 2026 08:36:23 -0400 Subject: [PATCH] feat: publish native benchmark pilots --- scripts/agent-benchmark/NATIVE.md | 19 ++ scripts/export-native-benchmarks.mjs | 188 ++++++++++++++++++ scripts/export-native-benchmarks.test.mjs | 140 +++++++++++++ .../NativeBenchmarkResults.module.css | 113 +++++++++++ .../components/NativeBenchmarkResults.test.ts | 19 ++ .../src/components/NativeBenchmarkResults.tsx | 106 ++++++++++ .../data/benchmarks/native-luna-1.20.2.json | 136 +++++++++++++ website/src/pages/benchmarks.tsx | 13 +- .../native-luna-1.20.2/ios-control.png | Bin 0 -> 91797 bytes .../native-luna-1.20.2/ios-stim.png | Bin 0 -> 16237 bytes .../native-luna-1.20.2/macos-control.png | Bin 0 -> 21411 bytes .../native-luna-1.20.2/macos-stim.png | Bin 0 -> 22171 bytes 12 files changed, 729 insertions(+), 5 deletions(-) create mode 100644 scripts/export-native-benchmarks.mjs create mode 100644 scripts/export-native-benchmarks.test.mjs create mode 100644 website/src/components/NativeBenchmarkResults.module.css create mode 100644 website/src/components/NativeBenchmarkResults.test.ts create mode 100644 website/src/components/NativeBenchmarkResults.tsx create mode 100644 website/src/data/benchmarks/native-luna-1.20.2.json create mode 100644 website/static/benchmarks/native-luna-1.20.2/ios-control.png create mode 100644 website/static/benchmarks/native-luna-1.20.2/ios-stim.png create mode 100644 website/static/benchmarks/native-luna-1.20.2/macos-control.png create mode 100644 website/static/benchmarks/native-luna-1.20.2/macos-stim.png diff --git a/scripts/agent-benchmark/NATIVE.md b/scripts/agent-benchmark/NATIVE.md index ba2444d3d..e7fbde360 100644 --- a/scripts/agent-benchmark/NATIVE.md +++ b/scripts/agent-benchmark/NATIVE.md @@ -64,3 +64,22 @@ comparison, not a broad performance claim. Native Xcode projects can benefit from Stim's reusable artifacts and compiler cache. Native Gradle and macOS SwiftPM do not have reusable Stim artifact caching; measure any benefit in workspace/device preparation, incremental compilation, launch, and verification. + +## Website publication + +Publish only paired runs with accepted independent audits and completed cleanup: + +```bash +node scripts/export-native-benchmarks.mjs "$STIM_BENCH_ROOT" website/src/data/benchmarks/native-luna-1.20.2.json website/static/benchmarks/native-luna-1.20.2 +``` + +Each platform's `comparison.json` selects its Stim and control run IDs. The +exporter verifies matching fixture, release, model, and environment metadata; +turn timestamps; required audit checks; and all retained evidence hashes. A +platform without a comparison is omitted. A selected rejected or incomplete +pair refuses publication before writing output. Review every exported proof +image for private content before committing it. + +The benchmark overview displays these pilots separately as total task time, +including retries and evidence capture. Keep the one-pair limitation visible. +Native Android joins that section only after an accepted comparison is exported. diff --git a/scripts/export-native-benchmarks.mjs b/scripts/export-native-benchmarks.mjs new file mode 100644 index 000000000..d10f20da0 --- /dev/null +++ b/scripts/export-native-benchmarks.mjs @@ -0,0 +1,188 @@ +import { createHash } from 'node:crypto'; +import { copyFileSync, existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs'; +import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const digest = (path) => createHash('sha256').update(readFileSync(path)).digest('hex'); +const readJson = (path) => JSON.parse(readFileSync(path, 'utf8')); +const platforms = ['ios', 'android', 'macos']; +const requiredChecks = [ + 'sourceExact', + 'runnerCompleted', + 'buildCompleted', + 'commandAudit', + 'processUnchanged', + 'revisionAndCountVisuallyVerified', +]; +const requiredEvidence = [ + 'events.jsonl', + 'commands.json', + 'source.diff', + 'proof/target.json', + 'proof/screen.png', + 'proof/coordinator-snapshot.txt', + 'proof/coordinator-process-before.json', + 'proof/coordinator-process-after.json', +]; + +function acceptedRun(directory, platform, arm) { + const meta = readJson(join(directory, 'meta.json')); + const record = readJson(join(directory, 'run.json')); + const audit = readJson(join(directory, 'audit.json')); + const cleanup = readJson(join(directory, 'cleanup.json')); + if ( + record.cohort !== 'standalone-native-v1' || + meta.cohort !== record.cohort || + record.runId !== meta.runId || + record.runId !== basename(directory) || + record.platform !== platform || + meta.platform !== platform || + record.arm !== arm || + meta.arm !== arm || + record.source !== true || + record.invalidReasons?.length !== 0 || + record.runnerResult?.code !== 0 || + record.runnerResult?.timedOut !== false || + meta.runnerResult?.code !== 0 || + meta.runnerResult?.timedOut !== false || + audit.status !== 'accepted' || + audit.valid !== true || + cleanup.status !== 'complete' || + requiredChecks.some((name) => audit.checks?.[name] !== true) + ) { + throw new Error(`Native ${platform} ${arm} needs an accepted audit and completed cleanup`); + } + const seconds = (Date.parse(meta.finishedAt) - Date.parse(meta.dispatchAt)) / 1000; + if ( + !Number.isFinite(seconds) || + seconds <= 0 || + Math.abs(record.elapsedSeconds - seconds) > 0.001 || + !Number.isFinite(record.elapsedSeconds) + ) + throw new Error(`Native ${platform} ${arm} timing does not match its recorded turn`); + if (requiredEvidence.some((name) => !audit.hashes?.[name])) throw new Error('Native audit evidence is incomplete'); + const root = realpathSync(directory); + for (const [name, expected] of Object.entries(audit.hashes)) { + const path = realpathSync(join(root, name)); + const rel = relative(root, path); + if ( + isAbsolute(name) || + rel === '..' || + rel.startsWith(`..${sep}`) || + isAbsolute(rel) || + !/^[a-f0-9]{64}$/.test(expected) || + digest(path) !== expected + ) + throw new Error(`Native audit evidence changed: ${name}`); + } + if ( + record.eventsSha256 !== audit.hashes['events.jsonl'] || + record.screenshotSha256 !== audit.hashes['proof/screen.png'] + ) + throw new Error('Native run evidence does not match its audit'); + return { directory, meta, record, audit, seconds }; +} + +export function exportNativeBenchmarks(campaignRoot, outputPath, proofDirectory) { + const pairs = []; + const copies = []; + for (const platform of platforms) { + const comparisonPath = join(campaignRoot, 'native', platform, 'comparison.json'); + if (!existsSync(comparisonPath)) continue; + const comparison = readJson(comparisonPath); + const runs = ['stim', 'control'].map((arm) => { + const id = comparison.results?.[arm]?.runId; + if (typeof id !== 'string' || !/^[a-zA-Z0-9_-]+$/.test(id)) + throw new Error(`Missing native ${platform} ${arm} run`); + return acceptedRun(join(campaignRoot, 'native', platform, 'results', id), platform, arm); + }); + const [stim, control] = runs; + for (const key of ['model', 'reasoningEffort', 'serviceTier']) { + if (typeof stim.meta[key] !== 'string' || stim.meta[key] !== control.meta[key]) + throw new Error(`Native pair differs in ${key}`); + } + for (const key of [ + 'fixtureCommit', + 'stimVersion', + 'stimCliSha256', + 'nodeVersion', + 'macosVersion', + 'macosBuild', + 'xcodeVersion', + 'xcodeBuild', + 'codexVersion', + ]) { + if ( + typeof stim.meta.provenance?.[key] !== 'string' || + stim.meta.provenance[key] !== control.meta.provenance?.[key] + ) + throw new Error(`Native pair differs in ${key}`); + } + if ( + stim.meta.fixture.framework !== control.meta.fixture.framework || + stim.meta.compatibility.manifestSha256 !== control.meta.compatibility.manifestSha256 + ) + throw new Error('Native pair uses different fixture or compatibility tools'); + pairs.push({ + platform, + backend: stim.meta.fixture.framework, + model: stim.meta.model, + reasoningEffort: stim.meta.reasoningEffort, + requestedServiceTier: stim.meta.serviceTier, + returnedServiceTier: 'unverified', + samplePairs: 1, + provenance: Object.fromEntries( + [ + 'stimVersion', + 'nodeVersion', + 'macosVersion', + 'macosBuild', + 'xcodeVersion', + 'xcodeBuild', + 'codexVersion', + 'fixtureCommit', + ].map((key) => [key, stim.meta.provenance[key]]), + ), + timeReductionPercent: 100 * (1 - stim.seconds / control.seconds), + runs: runs.map(({ directory, meta, record, audit, seconds }) => { + const imageName = `${platform}-${record.arm}.png`; + copies.push([join(directory, 'proof/screen.png'), join(proofDirectory, imageName)]); + return { + arm: record.arm, + recordedOn: meta.dispatchAt.slice(0, 10), + taskSeconds: seconds, + usage: record.usage ?? null, + proof: imageName, + evidence: { + recordSha256: digest(join(directory, 'run.json')), + metadataSha256: digest(join(directory, 'meta.json')), + auditSha256: digest(join(directory, 'audit.json')), + cleanupSha256: digest(join(directory, 'cleanup.json')), + eventsSha256: audit.hashes['events.jsonl'], + proofSha256: audit.hashes['proof/screen.png'], + }, + }; + }), + }); + } + if (!pairs.length) throw new Error('No accepted native benchmark pairs'); + const result = { + schemaVersion: 1, + cohort: 'standalone-native-v1', + metric: 'dispatch-to-completed-task', + machine: readJson(join(campaignRoot, 'targets.json')).machine, + pairs, + }; + mkdirSync(proofDirectory, { recursive: true }); + mkdirSync(dirname(outputPath), { recursive: true }); + for (const [source, target] of copies) copyFileSync(source, target); + writeFileSync(outputPath, `${JSON.stringify(result, null, 2)}\n`); + return result; +} + +if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + const [campaignRoot, outputPath, proofDirectory] = process.argv.slice(2); + if (!campaignRoot || !outputPath || !proofDirectory) + throw new Error('Usage: export-native-benchmarks.mjs '); + exportNativeBenchmarks(campaignRoot, outputPath, proofDirectory); +} diff --git a/scripts/export-native-benchmarks.test.mjs b/scripts/export-native-benchmarks.test.mjs new file mode 100644 index 000000000..9f719c992 --- /dev/null +++ b/scripts/export-native-benchmarks.test.mjs @@ -0,0 +1,140 @@ +import { createHash } from 'node:crypto'; +import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { dirname, join } from 'node:path'; +import { afterEach, beforeEach, expect, it } from 'vitest'; +import { exportNativeBenchmarks } from './export-native-benchmarks.mjs'; + +let root; +const write = (path, value) => { + mkdirSync(dirname(path), { recursive: true }); + writeFileSync(path, JSON.stringify(value)); +}; +const hash = (path) => createHash('sha256').update(readFileSync(path)).digest('hex'); +const files = [ + 'events.jsonl', + 'commands.json', + 'source.diff', + 'proof/target.json', + 'proof/screen.png', + 'proof/coordinator-snapshot.txt', + 'proof/coordinator-process-before.json', + 'proof/coordinator-process-after.json', +]; + +function pair(platform) { + for (const arm of ['stim', 'control']) { + const id = `${platform}-${arm}`; + const dir = join(root, 'native', platform, 'results', id); + for (const name of files) { + mkdirSync(dirname(join(dir, name)), { recursive: true }); + writeFileSync(join(dir, name), `${id}: ${name}`); + } + const runnerResult = { code: 0, timedOut: false }; + write(join(dir, 'meta.json'), { + cohort: 'standalone-native-v1', + runId: id, + platform, + arm, + model: 'gpt-5.6-luna', + reasoningEffort: 'high', + serviceTier: 'priority', + dispatchAt: '2026-10-13T00:00:00.000Z', + finishedAt: `2026-10-13T00:0${arm === 'stim' ? 1 : 2}:00.000Z`, + runnerResult, + fixture: { framework: `native-${platform}` }, + compatibility: { manifestSha256: 'compat' }, + provenance: Object.fromEntries( + [ + 'fixtureCommit', + 'stimVersion', + 'stimCliSha256', + 'nodeVersion', + 'macosVersion', + 'macosBuild', + 'xcodeVersion', + 'xcodeBuild', + 'codexVersion', + ].map((key) => [key, 'same']), + ), + }); + write(join(dir, 'run.json'), { + cohort: 'standalone-native-v1', + runId: id, + platform, + arm, + source: true, + invalidReasons: [], + runnerResult, + elapsedSeconds: arm === 'stim' ? 60 : 120, + eventsSha256: hash(join(dir, 'events.jsonl')), + screenshotSha256: hash(join(dir, 'proof/screen.png')), + }); + write(join(dir, 'audit.json'), { + status: 'accepted', + valid: true, + checks: Object.fromEntries( + [ + 'sourceExact', + 'runnerCompleted', + 'buildCompleted', + 'commandAudit', + 'processUnchanged', + 'revisionAndCountVisuallyVerified', + ].map((key) => [key, true]), + ), + hashes: Object.fromEntries(files.map((name) => [name, hash(join(dir, name))])), + }); + write(join(dir, 'cleanup.json'), { status: 'complete' }); + } + write(join(root, 'native', platform, 'comparison.json'), { + results: { stim: { runId: `${platform}-stim` }, control: { runId: `${platform}-control` } }, + }); +} + +beforeEach(() => { + root = mkdtempSync(join(tmpdir(), 'stim-native-export-')); + write(join(root, 'targets.json'), { machine: 'Test machine' }); + pair('ios'); +}); +afterEach(() => rmSync(root, { recursive: true, force: true })); +const publish = () => exportNativeBenchmarks(root, join(root, 'published/data.json'), join(root, 'published/proof')); + +it('publishes accepted native pairs without local paths and adds Android only when a pair exists', () => { + pair('macos'); + const first = publish(); + expect(first.pairs.map((entry) => entry.platform)).toEqual(['ios', 'macos']); + expect(first.pairs[0]).toMatchObject({ + timeReductionPercent: 50, + samplePairs: 1, + runs: [{ taskSeconds: 60 }, { taskSeconds: 120 }], + }); + expect(JSON.stringify(first)).not.toContain(root); + expect(hash(join(root, 'published/proof/ios-stim.png'))).toBe(first.pairs[0].runs[0].evidence.proofSha256); + pair('android'); + expect(publish().pairs.map((entry) => entry.platform)).toEqual(['ios', 'android', 'macos']); +}); + +it.each(['proof', 'missing evidence', 'audit', 'cleanup', 'timing', 'model', 'version', 'identity', 'timeout'])( + 'refuses %s problems before publishing any partial comparison', + (failure) => { + const dir = join(root, 'native/ios/results/ios-control'); + const update = (name, change) => { + const path = join(dir, name); + const value = JSON.parse(readFileSync(path)); + change(value); + write(path, value); + }; + if (failure === 'proof') writeFileSync(join(dir, 'proof/screen.png'), 'changed'); + if (failure === 'missing evidence') update('audit.json', (value) => delete value.hashes['source.diff']); + if (failure === 'audit') update('audit.json', (value) => (value.valid = false)); + if (failure === 'cleanup') update('cleanup.json', (value) => (value.status = 'failed')); + if (failure === 'timing') update('run.json', (value) => (value.elapsedSeconds = 1)); + if (failure === 'model') update('meta.json', (value) => (value.model = 'different')); + if (failure === 'version') update('meta.json', (value) => (value.provenance.stimVersion = 'different')); + if (failure === 'identity') update('audit.json', (value) => (value.checks.processUnchanged = false)); + if (failure === 'timeout') update('run.json', (value) => (value.runnerResult.timedOut = true)); + expect(publish).toThrow(/Native/); + expect(existsSync(join(root, 'published'))).toBe(false); + }, +); diff --git a/website/src/components/NativeBenchmarkResults.module.css b/website/src/components/NativeBenchmarkResults.module.css new file mode 100644 index 000000000..b22852a72 --- /dev/null +++ b/website/src/components/NativeBenchmarkResults.module.css @@ -0,0 +1,113 @@ +.section { + margin: 3rem 0; +} +.heading { + max-width: 58rem; +} +.eyebrow { + color: var(--ifm-color-primary); + font-size: 0.8rem; + font-weight: 700; +} +.heading h2 { + margin-top: 0.5rem; +} +.grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1rem; + margin: 1.5rem 0; +} +.card { + padding: 1.4rem; + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: 1rem; + background: var(--ifm-background-surface-color); + min-width: 0; +} +.cardHeading { + display: flex; + justify-content: space-between; + gap: 1rem; + align-items: flex-start; +} +.cardHeading h3 { + margin-bottom: 0.2rem; +} +.cardHeading > strong { + color: var(--ifm-color-primary); + white-space: nowrap; +} +.cardHeading span, +.caption, +.note { + color: var(--ifm-color-emphasis-700); +} +.caption { + font-size: 0.85rem; + margin: 1rem 0; +} +.row { + display: grid; + grid-template-columns: 3.6rem minmax(0, 1fr) 4.6rem; + gap: 0.7rem; + align-items: center; + margin: 0.7rem 0; + font-size: 0.9rem; +} +.row > strong { + text-align: right; +} +.track { + height: 0.8rem; + background: var(--ifm-color-emphasis-100); + border-radius: 1rem; + overflow: hidden; +} +.stim, +.control { + height: 100%; + border-radius: inherit; +} +.stim { + background: var(--ifm-color-primary); +} +.control { + background: var(--ifm-color-emphasis-500); +} +.card summary { + cursor: pointer; + color: var(--ifm-color-primary); + font-weight: 600; +} +.card details p { + font-size: 0.85rem; + margin-top: 1rem; +} +.proofs { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.7rem; +} +.proofs figure { + margin: 0; + min-width: 0; +} +.proofs img { + width: 100%; + height: 16rem; + object-fit: contain; + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: 0.5rem; + background: var(--ifm-color-emphasis-100); +} +.proofs figcaption { + font-size: 0.8rem; + text-align: center; + margin-top: 0.4rem; +} +@media (max-width: 760px) { + .grid { + grid-template-columns: 1fr; + } +} diff --git a/website/src/components/NativeBenchmarkResults.test.ts b/website/src/components/NativeBenchmarkResults.test.ts new file mode 100644 index 000000000..d688c9576 --- /dev/null +++ b/website/src/components/NativeBenchmarkResults.test.ts @@ -0,0 +1,19 @@ +import { createElement } from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { expect, it, vi } from 'vitest'; +import NativeBenchmarkResults from './NativeBenchmarkResults'; +import data from '../data/benchmarks/native-luna-1.20.2.json'; +vi.mock('@docusaurus/useBaseUrl', () => ({ default: (path: string) => path })); + +it('keeps native task time, pilot scope, and verified proof separate from readiness results', () => { + const html = renderToStaticMarkup(createElement(NativeBenchmarkResults)); + expect(html).toContain('Total task time'); + expect(html).toContain('One pair'); + for (const pair of data.pairs) { + for (const run of pair.runs) expect(html).toContain(`/benchmarks/native-luna-1.20.2/${run.proof}`); + } + expect(html).toContain('Native iOS'); + expect(html).toContain('Native macOS'); + expect(html).not.toContain('android-stim.png'); + expect(html).toContain('returned tier unverified'); +}); diff --git a/website/src/components/NativeBenchmarkResults.tsx b/website/src/components/NativeBenchmarkResults.tsx new file mode 100644 index 000000000..86be89f28 --- /dev/null +++ b/website/src/components/NativeBenchmarkResults.tsx @@ -0,0 +1,106 @@ +import type { ReactNode } from 'react'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import data from '../data/benchmarks/native-luna-1.20.2.json'; +import { formatSeconds } from './benchmarkData'; +import styles from './NativeBenchmarkResults.module.css'; + +const names: Record = { ios: 'Native iOS', android: 'Native Android', macos: 'Native macOS' }; +const backends: Record = { + 'native-xcode': 'SwiftUI / Xcode', + 'native-gradle': 'Kotlin / Gradle', + 'native-swiftpm': 'SwiftUI / SwiftPM', +}; + +export default function NativeBenchmarkResults(): ReactNode { + const proofRoot = useBaseUrl('/benchmarks/native-luna-1.20.2/'); + return ( +
+
+ Standalone native apps / Pilot results +

Beyond React Native

+

+ Change a native app's revision text, build and launch it, press Increment, and verify the new revision and + count. Each result below is one accepted Stim/control pair on {data.machine}. +

+

+ Total task time runs from dispatch to the completed agent turn, including reasoning, retries, + builds, and proof capture. It differs from the React Native Settings-ready metric above. These small pilots + show workflow results, not a general compile-speed claim. +

+
+
+ {data.pairs.map((pair) => { + const maximum = Math.max(...pair.runs.map((run) => run.taskSeconds)); + return ( +
+
+
+

{names[pair.platform] ?? pair.platform}

+ {backends[pair.backend] ?? pair.backend} +
+ + {Math.abs(pair.timeReductionPercent).toFixed(0)}%{' '} + {pair.timeReductionPercent >= 0 ? 'sooner' : 'longer'} + +
+

One pair / Total task time / Lower is better

+ {pair.runs.map((run) => ( +
+ {run.arm === 'stim' ? 'Stim' : 'Control'} + + ))} +

+ {pair.model} / {pair.reasoningEffort} reasoning / Stim {pair.provenance.stimVersion} +

+
+ Proof and environment +

+ Recorded {pair.runs[0].recordedOn}. macOS {pair.provenance.macosVersion}, Xcode{' '} + {pair.provenance.xcodeVersion}, Node {pair.provenance.nodeVersion}, Codex{' '} + {pair.provenance.codexVersion}. Requested service tier: {pair.requestedServiceTier}; returned tier + unverified. +

+

+ Both runs passed independent source, command, process-identity, and visual checks. Cleanup completed + before publication. Screenshots show the changed revision and Count: 1. +

+
+ {pair.runs.map((run) => ( +
+ + {`${names[pair.platform]} + +
+ {run.arm === 'stim' ? 'Stim' : 'Control'} / {run.taskSeconds.toFixed(3)} s +
+
+ ))} +
+
+
+ ); + })} +
+

+ Native Xcode builds can reuse Stim artifacts and compiler cache. Native Gradle and macOS SwiftPM do not use + Stim's artifact cache; their potential benefit is in workspace preparation, launch, and verification. + {!data.pairs.some((pair) => pair.platform === 'android') && + ' Native Android results will appear after an accepted paired comparison.'} +

+ + Read the native benchmark protocol + +
+ ); +} diff --git a/website/src/data/benchmarks/native-luna-1.20.2.json b/website/src/data/benchmarks/native-luna-1.20.2.json new file mode 100644 index 000000000..ea3b8cd59 --- /dev/null +++ b/website/src/data/benchmarks/native-luna-1.20.2.json @@ -0,0 +1,136 @@ +{ + "schemaVersion": 1, + "cohort": "standalone-native-v1", + "metric": "dispatch-to-completed-task", + "machine": "Mac mini, Apple M4, 16 GB", + "pairs": [ + { + "platform": "ios", + "backend": "native-xcode", + "model": "gpt-5.6-luna", + "reasoningEffort": "high", + "requestedServiceTier": "priority", + "returnedServiceTier": "unverified", + "samplePairs": 1, + "provenance": { + "stimVersion": "1.20.2", + "nodeVersion": "26.7.0", + "macosVersion": "27.0", + "macosBuild": "26A428", + "xcodeVersion": "27.0", + "xcodeBuild": "27A266a", + "codexVersion": "0.154.0", + "fixtureCommit": "cb1c4cae00fd77849242ec326585631da46ab462" + }, + "timeReductionPercent": 44.83326123653063, + "runs": [ + { + "arm": "stim", + "recordedOn": "2026-10-13", + "taskSeconds": 169.614, + "usage": { + "input_tokens": 1625913, + "cached_input_tokens": 1523200, + "cache_write_input_tokens": 0, + "output_tokens": 11057, + "reasoning_output_tokens": 3856 + }, + "proof": "ios-stim.png", + "evidence": { + "recordSha256": "0215ad002610f4de2b4e58d6bdbf4c5e575cd6e966c0884347534901b8d6a8f6", + "metadataSha256": "f52529a0dbbf18792edc6ac8a46164e9ebee98ff303ec46f058bacffc029fb29", + "auditSha256": "63514949091040a58df75ae160134bb058626cfb85933ab6ca073c0584516334", + "cleanupSha256": "a217922b9c82ac6d9bbc672540800fc0a8b9d2f185603a786e2bef1c7d20414e", + "eventsSha256": "7eb10be9c13802df0fa215565fe25cbfcd8c984c764ffe8327cb6978d6e702dd", + "proofSha256": "ed1a3625d806e7734865f38a927678218b80d20e13e3f41a8d0974eeacc93170" + } + }, + { + "arm": "control", + "recordedOn": "2026-10-13", + "taskSeconds": 307.457, + "usage": { + "input_tokens": 3303869, + "cached_input_tokens": 3137920, + "cache_write_input_tokens": 0, + "output_tokens": 18085, + "reasoning_output_tokens": 6031 + }, + "proof": "ios-control.png", + "evidence": { + "recordSha256": "f71aa61f8a9a92e69700182e68ab8023ddc7f033107f0c8f5df940889eead981", + "metadataSha256": "de667ab177fa36aedebe47fe0d9f5b0f9427a6c838bd238e5359b52c29f87bf5", + "auditSha256": "5c6c6bb6321859b9e8d647d46c9b4920eec8b7aff2660096ff0efdd918a73e41", + "cleanupSha256": "0ce547e287a1a40d928ddec1c6138e655e004d0793992db9f0a490b05f395146", + "eventsSha256": "6e9eb1481fb252939c0ef6820f8d1109a7cd287011b8bb602b7fd8b168c48622", + "proofSha256": "6f83706fff9d2638eaa9c4cc6bbf0c05490f10b95dcb67b912ac0481e5df8bfa" + } + } + ] + }, + { + "platform": "macos", + "backend": "native-swiftpm", + "model": "gpt-5.6-luna", + "reasoningEffort": "high", + "requestedServiceTier": "priority", + "returnedServiceTier": "unverified", + "samplePairs": 1, + "provenance": { + "stimVersion": "1.20.2", + "nodeVersion": "26.7.0", + "macosVersion": "27.0", + "macosBuild": "26A428", + "xcodeVersion": "27.0", + "xcodeBuild": "27A266a", + "codexVersion": "0.154.0", + "fixtureCommit": "4b3e8b17e84e2d597ca28b0ee0bcdfae038adabd" + }, + "timeReductionPercent": 51.31305341724391, + "runs": [ + { + "arm": "stim", + "recordedOn": "2026-10-13", + "taskSeconds": 70.71, + "usage": { + "input_tokens": 675950, + "cached_input_tokens": 637696, + "cache_write_input_tokens": 0, + "output_tokens": 7647, + "reasoning_output_tokens": 2912 + }, + "proof": "macos-stim.png", + "evidence": { + "recordSha256": "82261d94e9a01ff0b9a8aa3e365529acca8685e080d27ff896f359aa1b1ed1f6", + "metadataSha256": "fb7de9c67307423798dc9402c02127114b6f84a8499e53e4358cf276908006db", + "auditSha256": "6733da7f1c406cf3a34b6ded03881f4b976e2e6e4e5d95aea5e6e6bcaac5cc20", + "cleanupSha256": "3d2e3994a49fb3b414455f271e1a5832f3bd5f4ba73e2c5f2f64f82bf8fc97c4", + "eventsSha256": "6b7f93f5888ada1ed0f183b2a18d91238895f88f3c2b7626d92c26ef7ee46784", + "proofSha256": "67352593d49023a5d7768b358913f3a1da67f4c7d9fca68ca0fa9feb58182734" + } + }, + { + "arm": "control", + "recordedOn": "2026-10-13", + "taskSeconds": 145.234, + "usage": { + "input_tokens": 1132184, + "cached_input_tokens": 1072640, + "cache_write_input_tokens": 0, + "output_tokens": 14710, + "reasoning_output_tokens": 6750 + }, + "proof": "macos-control.png", + "evidence": { + "recordSha256": "bdd10ae3c8e094acb6ed0ccf7877ed1b07e7db5004ce65a340e3d381b3377cab", + "metadataSha256": "0caa486404af12a7e55343863a083781ae5f8ebb847e1e277eda10ce53668cc9", + "auditSha256": "a79c8585f7f9ab367b99c4b6a64755a28e51e9178ccfd3978e9e3ffaaea5b864", + "cleanupSha256": "18b97cdcd516a53000bb62e77e9553144416d220a91dddc78de464427f6bce1f", + "eventsSha256": "f3a58f61ac345b8dc3f164accd032b7d698c9c68063816f85b83e5863da1c5db", + "proofSha256": "0ed6265f17b9cdb02b92934a1a90faa594d447c4704d804674bc88a87703265f" + } + } + ] + } + ] +} diff --git a/website/src/pages/benchmarks.tsx b/website/src/pages/benchmarks.tsx index a433bc702..9d93d568e 100644 --- a/website/src/pages/benchmarks.tsx +++ b/website/src/pages/benchmarks.tsx @@ -4,6 +4,7 @@ import Layout from '@theme/Layout'; import Heading from '@theme/Heading'; import { benchmarks, displayVariant } from '@site/src/components/benchmarkCatalog'; import BenchmarkVideo from '@site/src/components/BenchmarkVideo'; +import NativeBenchmarkResults from '@site/src/components/NativeBenchmarkResults'; import { benchmarkModelLabel } from '@site/src/components/benchmarkSelection'; import { benchmarkDisplayTitle, @@ -94,7 +95,7 @@ export default function Benchmarks(): ReactNode { return (
@@ -102,9 +103,9 @@ export default function Benchmarks(): ReactNode {
Agent benchmark
Stim agent benchmarks

- Compare how coding agents launch the same React Native app with Stim and the local Expo/native toolchain. - Platforms and JavaScript/native tasks are measured separately, and every published time links to its - command-level audit and Settings-screen proof. + Compare coding agents using Stim and local platform tools. React Native results measure Settings-ready + time and link to command-level audits. Standalone native pilots below measure complete task time and + include verified screen proof. Platforms and tasks are measured separately.

@@ -155,11 +156,13 @@ export default function Benchmarks(): ReactNode { ) : null} + +
Methodology - How the comparisons work + How the React Native comparisons work

We compare Stim with standard Expo and native build tools on the same app. The goal is to measure how diff --git a/website/static/benchmarks/native-luna-1.20.2/ios-control.png b/website/static/benchmarks/native-luna-1.20.2/ios-control.png new file mode 100644 index 0000000000000000000000000000000000000000..154b4c6dbda306652b75fc2fa1b72679b71f0fcd GIT binary patch literal 91797 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

uqkR~x^TwsLvL{Y2CQ9JgrIV=m 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

kt2Vm!Hep1qw{NbX`yWe6Q^)9{9a8R*HoN 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 MW$kP5E4S|bFJZomQvd(} literal 0 HcmV?d00001 diff --git a/website/static/benchmarks/native-luna-1.20.2/ios-stim.png b/website/static/benchmarks/native-luna-1.20.2/ios-stim.png new file mode 100644 index 0000000000000000000000000000000000000000..d1acbf4d7c301e88f523cb56c483d27412594b77 GIT binary patch literal 16237 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 NnuZz$SMNRfzW}d>I@$mL literal 0 HcmV?d00001 diff --git a/website/static/benchmarks/native-luna-1.20.2/macos-stim.png b/website/static/benchmarks/native-luna-1.20.2/macos-stim.png new file mode 100644 index 0000000000000000000000000000000000000000..db77526c5fce47cc308eacb788ebd111065a57a1 GIT binary patch literal 22171 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 literal 0 HcmV?d00001