Skip to content

v0.1.0 - #1

Merged
keyobs merged 68 commits into
mainfrom
develop
Aug 14, 2026
Merged

v0.1.0#1
keyobs merged 68 commits into
mainfrom
develop

Conversation

@keyobs

@keyobs keyobs commented Aug 14, 2026

Copy link
Copy Markdown
Owner

No description provided.

keyobs added 30 commits August 9, 2026 14:29
Adopt @keyobs/dx-flow for husky hooks, commitlint, and release scripts
(branch protection on main, .env guard, tsc pre-commit, tests before
push to develop). Biome is removed right after setup; oxlint stays the
linter/formatter.
Add zod, three/@react-three/fiber/@react-three/drei, ml-pca for the
Grid -> FeatureExtractor -> GeometryDescriptor -> PCA -> point cloud
spike (ADR-0002). Wire vitest into vite.config.ts and add test/test:run
scripts so dx-flow's pre-push hook has something to run.
Official FDJ export (~680 draws, 2020-02 to 2026-08), served from
public/ per ADR-0001 (client-side-only, dataset committed to the
repo). Feeds the ADR-0002 vertical spike and, later, /draws.
Grid enforces the V1 invariants (5 distinct numbers 1-50, 2 distinct
stars 1-12, normalized ascending order) via a zod schema. Draw extends
it with the historical-draw fields (id, date, source). Scaffolds
domain/{grid,draw}/ per the V1 architecture.
Reads the already-sorted boules_gagnantes_en_ordre_croissant /
etoiles_gagnantes_en_ordre_croissant columns and routes them through
parseGrid so every parsed Draw carries the same distinctness/range
guarantees as a hand-entered Grid.
extractFeatures computes the V1 minimum feature set (sum/range/stats,
decade buckets, entropy, parity, gaps, consecutive/same-units/>31
counts, star sum/diff/parity) from a Grid alone, with a stable key
order (FEATURE_KEYS) for downstream vectorization. buildGeometryDescriptor
reshapes that into the exact V1-spec GeometryDescriptor shape.
buildSpatialEmbeddings runs every draw's FeatureVector through ml-pca
(centered + scaled, matching V3's StandardScaler default) and takes
PC1/PC2/PC3 as x/y/z. density/outlierScore/nearestNeighbors are
stubbed (0/0/[]) since clustering and density are DiscoveryModel (V3)
work, explicitly deferred by ADR-0002 - only the SpatialEmbedding
shape and position are real here.
App fetches the FDJ CSV, parses it, builds SpatialEmbeddings, and
hands them to PointCloudScene (@react-three/fiber Canvas + OrbitControls,
one point per draw at its PCA coordinates). Closes the ADR-0002 spike:
Grid -> FeatureExtractor -> GeometryDescriptor -> PCA -> point cloud.
Lives in src/spike/, separate from the real pages/geometry and
features/eurospace that will replace it later.
Installed without its bundled browser download; driven against the
system google-chrome-stable binary to visually confirm the spike's
point cloud actually renders (WebGL context, no console/page errors).
Pulls forward the Playwright dependency already planned in specs_v1.md.
react-router, @tanstack/react-query, recharts, d3 for the V1 pages;
sass for CSS Modules; @testing-library/react + jest-dom + jsdom for
component tests. Switch vitest to the jsdom environment (needed for
Testing Library) and fix the two existing tests that resolved the real
CSV path via import.meta.url, which jsdom no longer serves as a file://
URL - process.cwd()-relative resolution works under both environments.
total + always-exposed components: Jaccard on numbers/stars, decade
bucket L1 distance, normalized sum diff, normalized mean gap diff,
parity diff. distance(x,x)=0 and symmetry are covered by tests;
buildGeometryDescriptor already did the buckets/gaps/parity work so
this reuses it instead of recomputing.
…emporal/confidence)

evaluateGrid(grid, history) computes:
- structure: 1 - mean distance to the 20 nearest historical draws,
  with sum/amplitude percentile, decade-signature and parity match
  rate as factors
- originality: penalizes human-pick patterns (consecutive numbers,
  same-units pairs, multiples of five, <=31-only numbers) - purely
  descriptive, never framed as changing draw probability
- temporal: mean distance to draws inside each TemporalWindow
  (1/3/6/12/25/50/all), averaged with no window privileged - matches
  the spec's explicit warning that 6 has no special status
- confidence: inverse coefficient of variation of the nearest-neighbor
  distances (tight neighbor cluster = stable diagnosis)

Also adds findNearestNeighbors (generic k-NN over GeometryDescriptors,
reusable by /geometry) and classifyReading for the structure x
originality reading matrix. Scoring formulas are a reasonable, honest
first pass - not spec'd exactly - flagged for adjustment.
createCsvDrawRepository implements getLatest/getAll/getByDate against
a fetched CSV, parsed once and cached in memory. src/application/
drawRepository.ts wires the single app-wide instance pages will
consume through TanStack Query.
…ariations

Each variation stays tied to the original grid (per-number nearest
valid replacement) rather than producing a fixed universal output:
structurally-common swaps toward the most frequent historical number
in the same decade bucket, balanced spreads one number per decade
(+ one odd/one even star), anti-share swaps out <=31 and multiples-of-
five numbers. None is framed as more likely to be drawn - every valid
Grid keeps the same theoretical probability.
…routes

AppLayout renders the nav (evaluation/draws/geometry) and an
always-visible non-predictive disclaimer footer (data-testid for
E2E). / redirects to /evaluation. The ADR-0002 spike moves from
src/App.tsx to pages/spike/SpikePage.tsx, reachable at /spike so it
stays a working regression check until V4's features/eurospace
replaces it. Evaluation/draws/geometry pages are placeholders, filled
in by the next commits.
Zod-validated 5-number + 2-star form (plain button + ChangeEvent
handlers, no FormEvent), draw history via TanStack Query +
drawRepository, then evaluateGrid + classifyReading render the four
score cards (each showing its factors) and the reading-matrix label.
generateVariations surfaces the three variations with an explicit
non-predictive note. "Locate in EuroSpace" stays out entirely until
V4. Smoke-tested end to end: fill form -> evaluate -> 4 cards + 3
variations render, no console errors.
Table via drawRepository.getAll(): date, numbers, stars, sum,
amplitude, parity, decade-signature, and distance to the
chronologically previous draw (computeGeometryDistance between
consecutive GeometryDescriptors). Defaults to the 50 most recent
draws with a toggle to the full 680-draw history. Smoke-tested: row
counts, toggle, and the oldest draw correctly showing no previous
distance, no console errors.
Recharts scatter for sum x amplitude and sum x standard deviation,
a decade-signature histogram, a gap-map arrow chain for the most
recent draw, and its 10 nearest historical neighbors by
GeometryDistance. The "proximity graph" bullet from the spec is
implemented as this neighbor list rather than a literal network
graph - same underlying distance data, simpler for V1, flagged as a
simplification. Visually verified: scatter clusters realistically
around sum~130/amplitude~35, no console errors.
…hree V1 pages

renderWithProviders + a shared real-CSV fetch fixture back
EvaluationPage/DrawsPage/GeometryPage tests. Also fixes a real gap:
vitest globals were off, so @testing-library/react's auto-cleanup
never registered and DOM from one test leaked into the next within
the same file - added an explicit cleanup() in testSetup's afterEach.
tsc --noEmit against the root tsconfig.json checked zero files: that
config only has `references`, which tsc ignores outside --build mode.
Every "typecheck" run this session silently passed without checking
anything. Switched check to `tsc -b` (project-references build mode,
which the sub-configs already mark noEmit so nothing gets emitted).
Running it for real surfaced genuine errors: test files under src/
use node:fs/node:path/process, which tsconfig.app.json's `types`
didn't include - added "node" alongside "vite/client". Full project
now type-checks clean under the command that actually runs the checker.
The dx-flow pre-commit template ran tsc --noEmit against the root
tsconfig.json, which also checks zero files (see previous commit) -
every pre-commit "Type checking..." pass this session was a silent
no-op. Switched to tsc -b to match the now-fixed check script.
@playwright/test drives the system Chrome (channel: 'chrome', no
bundled browser download) against a webServer-managed dev instance.
The spec fills the evaluation form, checks the 4 score cards + 3
variations + disclaimer render, navigates to /geometry via the nav,
and checks the gap map + nearest neighbors render there too - the
V1 acceptance criterion "saisie -> évaluation -> géométrie en E2E".
Passes end to end; webServer shuts down cleanly after the run.
…arlo

mulberry32 - deterministic, same seed always gives the same sequence.
Backs Strategy proposal tie-breaking and the Monte Carlo baseline in
the upcoming walk-forward backtester (V2 reproducibility requirement).
8 rule kinds cover every V2-spec category except "zone géométrique"
(needs a real DiscoveryModel embedding, V3+): number-frequency
(fréquences/rareté via signed weight), above-31, repeat-from-previous,
recency, star-frequency are additive [0,1]-scored preferences;
decade-spread, sum-range, parity-target are bounded greedy adjustments
applied after the initial top-5/top-2 selection. Seeded via
createSeededRandom for reproducibility. Always returns a valid Grid.
countMatches(a, b) for numbers/stars intersection size, and
prizeRank(matchedNumbers, matchedStars) mapping to the 13 official
tiers (null when nothing is won). Backs the walk-forward backtester's
per-step metrics.
For each date T in the requested range, proposeGrid only ever sees
sortedAscending.slice(0, index) - draws at or after T, including any
beyond the range itself, can never influence T's proposal. Verified
directly: running the same test range against the full 680-draw
history vs a history truncated right after the range produces
identical proposals, proving draws after the range have zero effect
(the spec's "toute fuite future est une erreur bloquante"). Also
reproducible by seed and reports a valid empty result for a range
with no draws.
5 baselines (uniform-random, fixed-grid, frequent/rare-numbers,
geometric-no-temporal) all reuse proposeGrid with a specific rule set
- fixed-grid is the one exception, a constant Grid. Generalized
runWalkForwardBacktest to take a plain (history) => Grid function
instead of a Strategy, so baselines share the exact same walk-forward
loop rather than a parallel implementation.

runMonteCarloComparison runs N seeded uniform-random backtests and
reports the tested strategy's percentile against that distribution -
"no advantage detected" near the 50th percentile is an expected,
valid outcome.

Found a real perf bug while measuring: 500 Monte Carlo samples over a
200-step range took 24s, because scoreNumbers/scoreStars always did
O(history) precomputation (frequency counts, recency gaps) even when
no rule used it - the uniform-random baseline (rules: []) paid that
cost on every single step for nothing. Guarded the precomputation
behind which rule kinds are actually present: 24s -> 1.3s for the
same run. (First attempt at the guard also skipped the cheap
'above-31' rule's own scoring loop by mistake - caught by
proposeGrid.test.ts's above-31 test failing immediately, fixed by only
guarding the precomputation, not the rule loop itself.)
…ing detection

splitDateRanges chronologically slices sorted history into train
(oldest)/validation/test (most recent) by ratio - chronological, not
random, so test never precedes train, consistent with the walk-forward
no-leakage principle. detectOverfitting flags a >0.75 mean-matched-
numbers gap between train and validation/test; "test beats train" and
"all three comparable" both correctly report no overfitting signal.
…eriment

runExperiment wires the V2 pipeline into the spec's exact
Experiment/ExperimentResult/EvaluatedGrid shapes: splitDateRanges for
train/validation/test, walk-forward backtest on each, detectOverfitting
across them, compareBaselines + runMonteCarloComparison on the test
range, and one WindowComparison per requested TemporalWindow (windows
span from latestDrawDate(draws), independent of the train/val/test
split - "6 has no privileged status" applies here too).

generatedGrids carry precomputed features/geometry per spec's note
that V4 should project them without recomputing the backtest.
datasetVersion/modelVersion are simple placeholder constants - no real
versioning infra yet, flagged as a simplification.
Strategy builder (toggle the 8 rule kinds, weight/params inline),
train/validation/test % split, temporal-window multi-select, seed and
Monte Carlo sample count, run button -> runExperiment. Results show
the overfitting warning (when triggered), test metrics, baseline
comparison table, Monte Carlo percentile + histogram, per-window
comparison, and the generated-grids table for date-level inspection.
JSON export via a Blob download (no backend, per ADR-0001). Multiple
experiments accumulate in a session-local comparison list.

Smoke-tested end to end: toggled extra rules incl. sum-range/decade-
spread, selected extra windows, ran two experiments, confirmed all
tables/chart populate and the comparison list grows - zero console
errors. The repeated proposed grids across nearby dates in the
generated-grids table are expected: with 580+ historical draws
already accumulated, one more draw barely shifts frequency rankings,
so a frequency-driven strategy is naturally stable step to step - not
a bug.

Not implemented (flagged, not gold-plated): true backtest
cancellation/AbortSignal and Web Workers - a full run finishes in
roughly a second at this dataset size (see the perf fix in the
baselines/Monte Carlo commit), so there's nothing to cancel or
offload yet.
keyobs and others added 28 commits August 11, 2026 11:21
Renders without crashing, and once history loads and discoverStructure
runs, families and the null-hypothesis comparison panel populate.
…per-variation scores

Addresses devdx/fix.md:

1. Number/star inputs now color live as the user types: green when the
   value is within range (1-50 for numbers, 1-12 for stars - fix.md
   said 1-10 for stars, kept 1-12 since that's the actual EuroMillions
   rule already enforced everywhere else in the app; flagging in case
   1-10 was actually intended), red when out of range. Hit a real CSS
   cascade bug along the way: .starInput's own border-color was
   winning over .inputInvalid/.inputValid under some conditions since
   combined-class order isn't reliably reflected in Vite's dev-time
   CSS injection - fixed with !important on the state-override classes
   (verified against getComputedStyle, not just visually).

2. Each score card now has a plain-language description at the bottom
   (what "Structure historique" etc. actually means), and factor keys
   like "window_1"/"sumPercentile" are now shown as readable French
   labels ("Sur 1 an", "Percentile de la somme") via a lookup table in
   ScoreCard - domain code stays untouched, only the presentation layer
   translates.

3. Each variation now shows an explanatory sentence (anti-partage's
   sharing-reduction rationale, kept alongside the existing "doesn't
   change your odds" disclaimer already above the list) and its own
   4 scores (Structure/Originalité/Temporalité/Confiance), computed via
   evaluateGrid on that variation's grid, displayed compactly with
   color-coded dots matching each ScoreCard's accent.

Verified in a real browser: live coloring confirmed via
getComputedStyle (not just screenshot), all descriptions/labels render,
per-variation scores populate. All 114 unit/component tests and both
E2E specs still pass.
…rence

A Grid needs 5 distinct numbers and 2 distinct stars; validityClass now
checks the earlier entries in the same array (numbers or stars
separately) and marks a repeated value invalid regardless of it being
in range - only the first occurrence of a value can be green. Verified
with getComputedStyle: typing 7 twice keeps the first green and turns
the second red, same for stars.
… point, readable gap map

Addresses the new /geometry section of devdx/fix.md:

1. A "grille de référence" banner at the top of the page shows the
   reference grid's numbers/stars as Bubbles, so it's always visible
   while scrolling through the charts below.

2. A plain-language description under every chart/section title
   (what "Somme x Écart-type" etc. actually shows).

3. Both scatter charts now overlay a second Scatter series containing
   just the reference grid's own point, rendered as a bigger
   outlined dot in a distinct accent color - clearly distinguishable
   from the rest of the historical cloud.

4. "Carte des écarts" rebuilt: the old plain-text chain
   ("26 —3→ 29 —6→...") looked like it might already be showing a
   grid and a variation together - it wasn't, it was just one grid's
   own gaps, which is exactly the confusion that prompted this fix.
   Now it shows two clearly labeled NumberChain rows (grid numbers as
   round Bubbles linked by gap-labeled arrows): the reference grid
   (highlighted variant) and one of its proposed variations (plain
   variant), so the two shapes are visually comparable and distinct.

New reusable src/components/bubble/: Bubble (a single round
number/star display, visually matching /evaluation's input bubbles
but non-interactive) and NumberChain (Bubbles + gap arrows). Also
extracted VARIATION_LABELS/VARIATION_DESCRIPTIONS out of
EvaluationPage into application/variationLabels.ts so /geometry reuses
the same text instead of duplicating it.

Verified in a real browser (bubble counts, screenshots of the banner/
gap-map/full page) - zero console errors. All 116 unit/component
tests and both E2E specs still pass.
…elector

The reference grid on /geometry was silently just the latest historical
draw, disconnected from whatever the user typed on /evaluation, and none
of the charts marked it with a visually distinct color. Persist the last
evaluated grid to localStorage and let /geometry pick between it, the
latest draw, or a free-form grid typed directly on the page; give the
reference grid a dedicated accent color across all charts, add legends,
a decade-histogram marker, and a visual nearest-neighbors list.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…versioned

Track CLAUDE.md, the skills (.agents/skills + .claude/skills symlinks),
CONTEXT.md and docs/adr/ - they were sitting on disk but .gitignore's
blanket ".claude" rule kept CLAUDE.md itself from ever being committed.
settings.local.json stays out via the user's global gitignore. Prepares
the ground for .claude/agents/ and .agents/workflows/ (agent-integration).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Turns a feature/architecture request into a plan for this repo before
any code is written: explores real usage instead of assuming from
naming, consults domain-modeling for domain vocabulary, calibrates
exploration depth and blocking questions to the stakes, and only
treats a decision as settled once the user has explicitly confirmed
it. Crash-tested blind against the src/ modularization brief in
devdx/new-architecture.md (twice - once exposing a stale file pointer
it correctly refused to guess around) before tightening the prompt's
positive-guidance gaps.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Identifies which tests are worth writing for a given diff or plan,
anchored on this repo's own testing conventions (coverage target on
the pure domain/analysis layer, the named scientific invariants,
colocated Vitest style, Playwright for user journeys) rather than
generic advice. Advisory only, same read-only tool set as architect -
produces a prioritized list, never test files.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Reviews a diff against this repo's own documented conventions in
CLAUDE.md (component style, file naming, import order, domain purity,
data-testid patterns, premature-abstraction avoidance) rather than
generic bug-hunting, which /code-review already covers. Read-only,
reports via ReportFindings, anchors every finding to a citable rule -
completes the architect/test-strategist/quality-reviewer trio from
evolution.md's feature workflow diagram.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ties architect, grill-me, test-strategist, and quality-reviewer into
the plan -> challenge -> human validation -> implement -> test ->
review -> validate -> (ADR if it earned one) sequence sketched in
evolution.md. Entry test for when to bother with the full sequence
at all: can you already name every touched file and confirm none is
imported outside the one feature you're changing - a checkable bar
instead of "use judgment" or "if it feels obvious."

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ooter

Adds the CI gate this repo's Vercel deployment (ADR-0001) relies on:
a reusable test.yml (check/lint/test:run), ci.yml as the required
check on push to main/develop and on every PR, and simulate-deploy.yml
as a build-only dry run on develop pushes - mirroring the pocket-pbt
pattern, adapted for a flat repo with no monorepo filters and no
custom deploy job, since Vercel's own Git integration (not the CLI)
builds and deploys on push once code reaches its production branch.

Also: vercel.json's SPA rewrite (react-router routes would 404 on
reload without it), packageManager pin (pnpm/action-setup needs it to
resolve a version), .vercel added to .gitignore, and a read-only
deploy-troubleshooter agent that diagnoses a failed run from its
actual log output instead of guessing from the workflow file's intent.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
develop now gets its own real deployment (tests -> build -> GitHub
Pages) instead of a build-only dry run, so there's a working staging
environment independent of Vercel before code reaches main -
redundancy across two separate platforms rather than relying on one.

GitHub Pages serves from a /izeetok/ subpath (no custom domain),
unlike Vercel's root domain, so both the Vite base and the router's
basename now read from VITE_BASE_PATH (set only in the Pages build
job; unset everywhere else keeps root-relative paths). Also copies
index.html to 404.html in that build - Pages has no server-side
rewrites, so client-side routes need the fallback trick Vercel's
vercel.json rewrite already handles for main.

deploy-troubleshooter updated to know about both targets and where
each one's logs actually live.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…20 actions

pnpm install was failing in CI with a 401 on @keyobs/dx-flow: locally
it resolves through the dev's own ~/.npmrc token, which CI has no
equivalent of. Inject the token into .npmrc at runtime from a new
GH_PACKAGES_TOKEN repo secret (read:packages PAT) instead of committing
an env-interpolated auth line - that would have shadowed everyone's
working local token the moment NODE_AUTH_TOKEN isn't exported, which
it isn't by default.

Also pins engines.node to 24.x (matching actual dev machines, not the
22 the old workflow happened to hardcode) and replaces the Node20-era
actions/checkout@v4 + actions/setup-node@v4 + pnpm/action-setup@v4 with
actions/checkout@v7 + pnpm/setup@v2 (the latter is pnpm's own
recommended replacement for action-setup on pnpm v11+, and installs
the Node runtime in the same step). Bumps upload-pages-artifact and
deploy-pages to v5 for the same Node24 reason before they warn too.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
dx-flow granted izeetok Actions access on the @keyobs/dx-flow package,
so the automatic per-run GITHUB_TOKEN can now authenticate to
npm.pkg.github.com (GitHub Packages requires a token even for public
packages, unlike npmjs - it's not a private-package thing). Drops the
GH_PACKAGES_TOKEN secret this would otherwise have required someone to
create and rotate; adds permissions: packages: read to both workflows
so that token actually carries package-read scope. Also fixed
pnpm/setup's install:true default, which would have run pnpm install
before the auth line was appended and hit the same 401 again.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
ci.yml and deploy-develop-pages.yml both triggered on push to develop,
each independently calling test.yml - two parallel test runs per push.
ci.yml only needs to cover push to main (defense in depth alongside
Vercel's native deploy) and pull_request (the required check for
merges into either branch); deploy-develop-pages.yml already gates
its own build+deploy with the same test job on develop pushes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Reusable-workflow permissions are capped by the caller's own
permissions block, not just by what the callee requests. test.yml asks
for packages: read (to install @keyobs/dx-flow), but ci.yml - which
also calls test.yml - only granted contents: read, so GitHub rejected
the call outright ("packages: read... but is only allowed packages:
none"). deploy-develop-pages.yml already had this right; ci.yml didn't.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
With "Include administrators" enabled on main's branch protection,
nobody can push there without going through a PR - the required check
already ran against the PR's head commit via pull_request before any
merge is possible. Running it again on the resulting push to main was
pure duplicate work with no bypass scenario left to guard against.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…omain root

DEFAULT_CSV_URL and SpikePage's own copy of it were hardcoded to
/results/euromillions_202002.csv, which only resolves on a root
deploy (Vercel). On GitHub Pages (served from /izeetok/), every page
that loads draws - /draws, /evaluation, /geometry, /laboratory,
/discovery - 404'd fetching it. Both now build the URL from Vite's
import.meta.env.BASE_URL, the same mechanism already used for the
router's basename, so it resolves correctly under any base path.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…cal draws

Adds findExactMatch, a pure domain helper comparing a Grid against
Draw history for an exact numbers+stars match - kept separate from
evaluateGrid's four scores since this is a binary historical fact, not
a continuous score, and mixing it in would collapse two different
kinds of information into one.

Surfaces it on /evaluation next to the reading-matrix line, with
copy that keeps the app's non-predictive stance: a repeat draw doesn't
change future odds, and the "never appeared" case is scoped to the
CSV's actual coverage (since Feb 2020) rather than claiming EuroMillions
history at large.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…s aside

findNumbersOnlyMatches finds every past draw sharing the same 5
numbers regardless of stars - a looser, more frequent match than the
exact one. Shown as a separate banner, only when there's no full exact
match already (that message already covers the stronger case), listing
every date it happened rather than just the first, since a repeat
within 680 draws - while rare - isn't impossible.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
EvaluationPage always started blank even though evaluatedGridRepository
already persisted the grid for /geometry's benefit - navigating away
and back lost both the form input and the results. GridInputForm gets
an optional initialGrid prop (used only by /evaluation for now;
/geometry's free-form input is unaffected) to seed its digit inputs on
mount, and EvaluationPage lazily initializes its grid state from the
repository instead of null.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Drafts CHANGELOG.md from conventional commits since the last tag and
recommends a semver bump (patch/minor/major) with reasoning - neither
of which any existing tooling does. dx-flow's own release:* scripts
only bump package.json and tag; there's no changelog generation
anywhere in the repo. Stops at the draft: never runs pnpm release:*,
npm version, or git tag itself, matching the read-only-except-explicit
family convention already established for the other agents.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Replaces the unused Vite boilerplate with an actual README: what the
app is and isn't (non-predictive), stack, commands, deployment targets
and links, current src/ layout, and the versioned .claude/agents +
.agents/skills + .agents/workflows setup.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
First entry, drafted by release-manager from the full commit history
(no prior tag existed). Recommends a minor bump: the release is
dominated by feat commits (grid domain, evaluation, /evaluation,
/draws, /geometry, /laboratory, /discovery, agent tooling, CI/CD) with
no breaking-change marker anywhere in the log.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
It drafted a first CHANGELOG.md that was accurate but far too verbose
(every sub-parameter and count spelled out per bullet), and separately
once reported the file as written without ever having called Write -
composed the text in its own reasoning and asserted a result it hadn't
produced. Both caught by re-reading the actual file after the fact.
Adds: one line per entry, no sub-detail dump; and read the file back
after writing it, report only what's confirmed on disk.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Was tracking only grill-with-docs; the other three skills already
versioned under .agents/skills/ (domain-modeling, grill-me, grilling)
were installed but never recorded in the lockfile.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
izeetok Error Error Aug 14, 2026 12:07am

@keyobs
keyobs merged commit 81f4a52 into main Aug 14, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant