Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
5155932
feat: extract shared chart-core compact-time-scale math and adopt in …
apresmoi Jul 18, 2026
56bd32d
feat: extract shared ProgressDonut and SectionHeader oven components …
apresmoi Jul 18, 2026
44c4ae2
feat: extract shared LogTable oven component (DT-superset markup) and…
apresmoi Jul 18, 2026
425f507
feat: extract shared KpiItem and KpiStrip oven components and adopt i…
apresmoi Jul 18, 2026
bf761df
feat: add shared useOvenLiveData hook (poll/sse/props) and port Visua…
apresmoi Jul 18, 2026
e76c056
chore: add @oven alias and barrel; route oven imports through it
apresmoi Jul 18, 2026
60ec221
feat: relocate Streaming Diff FeedList/DiffCard/FileDiff blocks under…
apresmoi Jul 18, 2026
3286206
feat: lift Visual Parity blocks (VerdictHeader/DomainTabs/MetricTiles…
apresmoi Jul 18, 2026
edbaf99
feat: add OvenView declarative composition engine (JSON-pointer bind …
apresmoi Jul 18, 2026
a4d8ab8
refactor: add esbuild oven-test harness; convert oven-kit utils + che…
apresmoi Jul 18, 2026
2bfda2b
refactor: convert oven-kit component tests to TypeScript via the shar…
apresmoi Jul 18, 2026
6bab6cb
test: capture deterministic DT+PT DOM goldens across render states (p…
apresmoi Jul 18, 2026
c641cf2
test: characterize DT poll/ETag transport (ETag/304, generation stale…
apresmoi Jul 18, 2026
60a60ae
test: close DT golden oracle gaps (comparable telemetry, visible pagi…
apresmoi Jul 18, 2026
cf59220
refactor: extract stateless DT render string-builders into differenti…
apresmoi Jul 18, 2026
648002b
refactor: extract state-dependent DT render builders (chart/hybrid/fi…
apresmoi Jul 18, 2026
7c289c2
refactor: split DT render() into pure buildDashboardHtml() assembly +…
apresmoi Jul 18, 2026
5bf27d6
refactor: extract DT static templateHtml (incl. driving-parity-page b…
apresmoi Jul 18, 2026
2663f3a
refactor: relocate per-oven CSS into the dashboard kit; drop dashboar…
apresmoi Jul 18, 2026
97e1607
test: add zero-dep DOM-normalized comparator to gate DT React regions…
apresmoi Jul 18, 2026
20d9eda
feat: React DT KPI strip components + entity-faithful DOM comparator …
apresmoi Jul 18, 2026
d2e901b
feat: adopt kit LogTable for the DT activity log (differential-testin…
apresmoi Jul 18, 2026
204bcef
feat: React ToggleGroup + FieldToolbar for the DT field controls (dif…
apresmoi Jul 18, 2026
546b7bb
feat: React FieldMiniChart port of the DT per-field value/delta chart…
apresmoi Jul 18, 2026
b2b6e79
feat: React HybridField/HybridMetric/HybridFieldList for the DT field…
apresmoi Jul 18, 2026
33ae930
feat: React PaginationBar for the DT field-list pager (differential-t…
apresmoi Jul 18, 2026
b46833a
feat: React RefreshStatusChip for the DT refresh indicator (different…
apresmoi Jul 18, 2026
efa2e20
feat: SVG-DOM oracle harness + frozen goldens for DT progress/frame-d…
apresmoi Jul 18, 2026
6e1e711
feat: React DifferentialFrameDeltaChart ported to oracle goldens (dif…
apresmoi Jul 18, 2026
6f1fa0a
feat: React DifferentialProgressChart (progress/failed/delta) ported …
apresmoi Jul 18, 2026
ddb89f1
feat: WaffleCanvas DPR-aware paint layer for the DT waffle KPI (diffe…
apresmoi Jul 18, 2026
0574b15
feat: .oven compiler front-end (XML scanner, grammar, validation, fro…
apresmoi Jul 19, 2026
79bc726
feat: static .oven IR -> OvenViewDef lowering + pure format registry …
apresmoi Jul 19, 2026
bc393ba
feat: generic .oven reducer + collection pipeline + selectors (1.3 core)
apresmoi Jul 19, 2026
901490d
feat: .oven interactive runtime (OvenRuntime/OvenNode/adapters/poll) …
apresmoi Jul 19, 2026
990ae9d
feat: .oven log-table runtime adapter (row iteration + @item columns)
apresmoi Jul 19, 2026
c63854f
feat: freeze checklist DOM golden + adapter, export interactive sub-c…
apresmoi Jul 19, 2026
ea16150
feat: checklist .oven vocabulary + leaf widgets (box, kpi/ledger/burn…
apresmoi Jul 19, 2026
0e87550
feat: render Checklist detail via the .oven engine at byte-parity (1.…
apresmoi Jul 19, 2026
31a0638
refactor: clean semantic checklist.oven via theme chrome + component …
apresmoi Jul 19, 2026
3208a82
feat: extract Streaming Diff selected-feed widgets + frozen DOM golde…
apresmoi Jul 19, 2026
f9f6027
feat: render Differential Testing detail via clean .oven at dom-golde…
apresmoi Jul 19, 2026
11b632b
feat: render Streaming Diff selected-feed via the .oven engine at byt…
apresmoi Jul 19, 2026
4356b84
feat: extend Differential Testing .oven dom-golden gate to control + …
apresmoi Jul 19, 2026
bcf4e24
feat: complete Differential Testing .oven dom-golden gate with server…
apresmoi Jul 19, 2026
f9c0ce0
docs: document Differential Testing .oven rendering in instructions.md
apresmoi Jul 19, 2026
2d25a45
feat: differential-testing .oven at byte-parity
apresmoi Jul 19, 2026
62602f5
test: freeze Visual Parity dom-golden from the real React render
apresmoi Jul 19, 2026
589a2e8
feat: render Visual Parity through the .oven engine at identical DOM
apresmoi Jul 19, 2026
5f88cb9
feat: render Performance Tracing via its clean .oven at byte-for-byte…
apresmoi Jul 19, 2026
7de7c96
feat: render the live Visual Parity dashboard view through OvenRuntime
apresmoi Jul 19, 2026
db46c29
feat: performance-tracing .oven at byte-parity
apresmoi Jul 19, 2026
6b2b28a
fix: repoint oven-compile golden test at committed fixtures (fresh-cl…
apresmoi Jul 19, 2026
9365072
feat: render the live Streaming Diff selected-feed through OvenRuntime
apresmoi Jul 19, 2026
bb157e5
feat: render the full load-error text in the DT oven .empty panel
apresmoi Jul 19, 2026
5813740
feat: toggle DT oven field-row expansion via click and Enter/Space
apresmoi Jul 19, 2026
d3f6309
feat: re-fetch the DT oven on scenario-selector change
apresmoi Jul 19, 2026
436c65c
feat: render live Differential Testing and Performance Tracing throug…
apresmoi Jul 19, 2026
ab41d47
docs: add creating-ovens authoring guide for the .oven DSL
apresmoi Jul 19, 2026
083a76f
chore: remove orphaned DifferentialTestingPage wrapper left by .oven …
apresmoi Jul 19, 2026
0e3b8c3
docs: document the .oven declarative system on the website
apresmoi Jul 19, 2026
0d4da1f
docs: add creating-ovens skill reference
apresmoi Jul 19, 2026
c1b467c
docs: document the .oven system on the website
apresmoi Jul 19, 2026
b831d0c
chore: exclude gitignored .claude/ and research/ from the leak scan
apresmoi Jul 19, 2026
738adc7
refactor: generate oven IR at build instead of committing .ir.json
apresmoi Jul 19, 2026
bb8737d
refactor: relocate differential-testing renderer into the dashboard kit
apresmoi Jul 19, 2026
bae6925
refactor: flatten differential-testing oven data-layer folders
apresmoi Jul 19, 2026
c637172
refactor: flatten performance-tracing oven data-layer folder
apresmoi Jul 19, 2026
35e0aba
refactor: flatten visual-parity oven data-layer folder
apresmoi Jul 19, 2026
ea24648
refactor: decouple differential renderer from detail templates
apresmoi Jul 19, 2026
9c8cbeb
refactor: eliminate detail.json via schema-v5 oven migration
apresmoi Jul 20, 2026
1576cca
docs: align oven docs to post-detail.json minimal model
apresmoi Jul 20, 2026
be6a7b2
feat: render generic custom Ovens in the dashboard via runtime IR+data
apresmoi Jul 20, 2026
c106f93
feat: list bound custom Ovens in the dashboard index
apresmoi Jul 20, 2026
c82f18c
fix: drop undocumented oven view cell flags and lock init exit 0
apresmoi Jul 20, 2026
ca7e5ff
docs: document oven create->bind->view flow and close consumer gaps
apresmoi Jul 20, 2026
e02777a
docs: add Start Here onboarding and oven-design guide to the skill
apresmoi Jul 20, 2026
72341c5
docs: lead skill.md with concepts + oven-honesty guide, add website p…
apresmoi Jul 20, 2026
61643f9
docs: show the oven adapter and item-to-oven proof link
apresmoi Jul 20, 2026
970537e
refactor: nest differential-testing engine into engine/ subfolder
apresmoi Jul 20, 2026
6433c0a
refactor: nest differential-testing data layer under engine/ (match s…
apresmoi Jul 20, 2026
4478130
fix: pin UTC time in oven DOM goldens so CI is timezone-independent
apresmoi Jul 20, 2026
1b1783b
fix: merge compact fieldPage, server paging, and frame metrics into t…
apresmoi Jul 20, 2026
57ff2f8
fix: treat a 304 Not Modified poll as a successful no-op instead of a…
apresmoi Jul 20, 2026
e64df38
fix: rewrite the forked oven root id and enforce root id matches the …
apresmoi Jul 20, 2026
8d99a87
fix: render the switch default case by matching the compiled default …
apresmoi Jul 20, 2026
41500c5
fix: guard pagination page-sizes so malformed values yield a diagnost…
apresmoi Jul 20, 2026
881a8f5
fix: carry DT server-paged control state into the live poll query so …
apresmoi Jul 20, 2026
0045088
fix: preserve monotonic poll generation across poller re-creation so …
apresmoi Jul 20, 2026
d5c72b0
fix: coalesce oven poller in-flight retries into one reducer request
apresmoi Jul 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ notes/burnlists/
dist/
dashboard/dist/
node_modules/
.oven-test-*/
.playwright-cli/
output/
build/
*.zip
*.tgz
*.log
ovens/**/*.ir.json
8 changes: 4 additions & 4 deletions bin/burnlist.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ if (args[0] === "install" || args[0] === "uninstall") {
}

if (args[0] === "differential-testing" && args[1] === "schema") {
console.log(resolve(packageRoot, "ovens", "differential-testing", "schema", "differential-testing-data.schema.json"));
console.log(resolve(packageRoot, "ovens", "differential-testing", "engine", "data.schema.json"));
return;
}

if (args[0] === "differential-testing" && args[1] === "sdk") {
console.log(resolve(packageRoot, "ovens", "differential-testing", "engine", "differential-testing-adapter-sdk.mjs"));
console.log(resolve(packageRoot, "ovens", "differential-testing", "engine", "adapter-sdk.mjs"));
return;
}

Expand All @@ -62,11 +62,11 @@ if (args[0] === "differential-testing" && ["validate", "validate-bundle"].includ
const path = resolve(process.cwd(), args[2]);
const document = JSON.parse(readFileSync(path, "utf8"));
if (document?.schema === "burnlist-differential-testing-bundle@1") {
const { assertDifferentialTestingBundle } = await import("../ovens/differential-testing/engine/differential-testing-transport.mjs");
const { assertDifferentialTestingBundle } = await import("../ovens/differential-testing/engine/transport.mjs");
const bundle = assertDifferentialTestingBundle(path);
console.log(`Valid Differential Testing bundle: ${bundle.scenarios.length} scenarios; selected ${bundle.selectedScenarioId ?? "none"}.`);
} else {
const { assertDifferentialTestingData } = await import("../ovens/differential-testing/engine/differential-testing-data-contract.mjs");
const { assertDifferentialTestingData } = await import("../ovens/differential-testing/engine/data-contract.mjs");
assertDifferentialTestingData(document);
const sampleCount = document.fields.reduce((total, field) => total + field.sampleCount, 0);
console.log(`Valid Differential Testing data: ${document.fields.length} fields, ${sampleCount} samples, ${document.summary.frames.uniqueTicks} aligned ticks.`);
Expand Down
21 changes: 21 additions & 0 deletions dashboard/oven-ir-compile.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { readFileSync } from "node:fs";
import { relative, resolve, sep } from "node:path";
import { fileURLToPath } from "node:url";
import { compileOven } from "../src/ovens/dsl/oven-compile.mjs";

const dashboardDir = fileURLToPath(new URL(".", import.meta.url));
const repoRoot = resolve(dashboardDir, "..");

export function compileOvenIrForJsonPath(irJsonAbsPath) {
if (!irJsonAbsPath.endsWith(".ir.json")) {
throw new Error(`Expected an .ir.json path, got ${irJsonAbsPath}`);
}

const ovenPath = `${irJsonAbsPath.slice(0, -".ir.json".length)}.oven`;
const file = relative(repoRoot, ovenPath).split(sep).join("/");
const compiled = compileOven(readFileSync(ovenPath, "utf8"), { file });
if (!compiled.ok) {
throw new Error(`Failed to compile ${file}: ${JSON.stringify(compiled.diagnostics)}`);
}
return compiled.ir;
}
8 changes: 4 additions & 4 deletions dashboard/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useMemo, useState } from "react";
import { Clock3, ListChecks } from "lucide-react";
import { AppHeader, ChecklistDashboard, DashboardError, DifferentialTestingPage, EmptyState, FILTERS, Filters, NewOvenPage, ProjectGroup, RunBurnPage, StreamingDiff, VisualParityPage } from "@components";
import { AppHeader, ChecklistOvenView, CustomOvenView, DashboardError, DifferentialTestingOvenPage, EmptyState, FILTERS, Filters, NewOvenPage, PerformanceTracingOvenPage, ProjectGroup, RunBurnPage, StreamingDiff, VisualParityPage } from "@components";
import { useDashboardData } from "@hooks";
import { currentSection, filterFromUrl, selectedBurnlist } from "@lib";
import type { Filter } from "@lib";
Expand All @@ -24,10 +24,10 @@ export function App() {
return (
<div className="dashboard-app">
<AppHeader detail={progress} section={section} />
<main className="dashboard-main" data-layout={section === "differential-testing" || section === "performance-tracing" || section === "streaming-diff" || section === "visual-parity" || selected ? "full" : "index"} data-section={section}>
{section === "differential-testing" ? <DifferentialTestingPage /> : section === "performance-tracing" ? <DifferentialTestingPage ovenId="performance-tracing" /> : section === "streaming-diff" ? <StreamingDiff projects={projects} projectsLoading={loading} /> : section === "visual-parity" ? <VisualParityPage /> : section === "new-oven" ? <NewOvenPage /> : section === "run-burn" ? <RunBurnPage /> : selected ? (
<main className="dashboard-main" data-layout={section === "differential-testing" || section === "performance-tracing" || section === "streaming-diff" || section === "visual-parity" || section === "custom-oven" || selected ? "full" : "index"} data-section={section}>
{section === "differential-testing" ? <DifferentialTestingOvenPage /> : section === "performance-tracing" ? <PerformanceTracingOvenPage /> : section === "streaming-diff" ? <StreamingDiff projects={projects} projectsLoading={loading} /> : section === "visual-parity" ? <VisualParityPage /> : section === "custom-oven" ? <CustomOvenView /> : section === "new-oven" ? <NewOvenPage /> : section === "run-burn" ? <RunBurnPage /> : selected ? (
error ? <DashboardError message={error} /> : loading && !progress ? <EmptyState title="Loading progress" detail="Reading the selected Burnlist." /> : progress ? (
<ChecklistDashboard data={progress} />
<ChecklistOvenView data={progress} />
) : <EmptyState title="Choose a Burnlist" detail="Select an item from the list to inspect its progress." icon={ListChecks} />
) : (
<section className="dashboard-index">
Expand Down
Loading
Loading