Skip to content

chore(release): F11, a code base ready for curves - #163

Closed
AlexandreGallais wants to merge 57 commits into
mainfrom
develop
Closed

AlexandreGallais wants to merge 57 commits into
mainfrom
develop

Conversation

@AlexandreGallais

Copy link
Copy Markdown
Owner

Release: F11, a code base ready for curves

Feature

  • F11 — A code base ready for curves (feat: F11, a code base ready for curves #162): folders by business domain (ADR-0043) with the lint rule local/folder-layout; a property test for every math and geometry function; shared test helpers; one path writer; one pass per corner. No drawing changes.
  • Breaking change: contourToPathData removed from the public API (use contourPiecesToPathData): the next version is 0.2.0.

Tooling and process

  • Private records in a sibling repository, then inside the project as records/, ignored by Git (ADR-0041, ADR-0044); npm run records:save.
  • Status line: the turn's clock to the second, stopped when the agent ends its turn.
  • Guard hook hardened (commit -n, HUSKY=0, core.hooksPath, +refspec pushes).
  • Draft F12 (points on a curve with handles) in E14.

🤖 Generated with Claude Code

AlexandreGallais and others added 30 commits October 13, 2026 01:43
The report keeps the essentials on one row; each one is saved in the Git directory, and the
Turns section of npm run metrics lists them all for the retrospective.

Refs: RET-001.T3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The theme waits for the page font and draws the diagrams one at a time, so that Mermaid measures
the labels with the font they are shown in; wrapped labels and a wider padding. A test keeps each
label line at 32 characters or fewer, cut with <br/>.

Refs: RET-001.T3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs: RET-001

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…inal

Time and tokens run from the Product Owner's prompt after the agent last ended its turn, the same
figures as the session report; a compaction or a message sent mid-turn stays in the turn. A call
interrupted before the turn is no longer shown as running.

Refs: RET-001.T3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What helped and hurt the Product Owner recorded; the site theme draws diagrams in a queue,
without disabling a lint rule.

Closes: RET-001

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…inutes

scripts/watch-task.ts follows a background task's output under Monitor and prints a line only
on a stall, a resume, the end or the time limit; the agent runs long commands in the background
instead of waiting. A call running over 5 minutes shows in red. Transcripts are kept 3650 days so
that every retrospective reads its tokens; the metrics page lists where each record lives.

Refs: RET-001

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…es a task end

A background task's notification is not the Product Owner's prompt: the status line and the
session report no longer start a new turn on it. The watchdog reads every new line, so it sees
the end pattern even when the task's exit line follows, and ends when the task exits.

Refs: RET-001

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR-0041: the metrics, the transcripts and the source library hold raw
messages and local paths; `npm run records:save` copies them into a
private repository beside this one, commits and pushes. Compared with a
submodule (URL and moving commit in the public tree) and an ignored
folder inside (every tool must skip it). Run at each session end and
each retrospective.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The guard now also denies `git commit -n`, `HUSKY=0`, `core.hooksPath`,
a `+branch` refspec and Git commands written with `git -C <path>`. The
session-start hook counts a feature as started from its first story in
progress, and removes the files of calls left running for a day.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tag `archive/f10-round-shape` was deleted when the history restarted;
note 0010 now points to `refs/pull/139/head` and to the bundle in the
private records. The metrics limits name the records as the backup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
F11: one path writer, `contourToPathData` removed from the public API;
the folder limit comes from SP-010; VAL-010 shows figures before and
after, without a guided test; curves stay out of F11.

Refs: F11
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Product Owner started the run on F11.

Refs: F11
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The turn's time is written to the second (12 min 05 s), so the line
visibly refreshes each second. The tokens still grow by steps: Claude
Code writes a request's usage only once its answer is complete; the
metrics page says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR-0044 supersedes ADR-0041's place: the records repository moves from
beside the project to records/ inside it, its own Git repository listed
in .gitignore. ESLint, Prettier, secretlint and WebStorm skip it; the
script's default folder follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ped at the stop

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nds its turn

It said active and kept counting after the last answer: the end of the
turn was read but not shown. The tally keeps when the turn ended; the
line then shows your turn and the last turn's time, stopped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs: SP-010.T1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tests stay beside their module; folders split by theme; shape types stay
at the root of their layer so that subfolders never form a cycle.

Refs: SP-010.T2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR-0042, the Product Owner's choice at the end of SP-010: folders named
by business theme, 15 modules a signal checked by a test with listed
exceptions, shape types at the root of their layer, the playground split
by panel. F11's criterion 4 and EN-022 follow it.

Refs: SP-010.T3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs: SP-010.T3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The review found that `free-shape.ts` beside `free-shape/` cannot both be
imported, and that `import-x/no-cycle` ignores type imports. The Product
Owner chose to keep each shape's type in its folder. Counts, the
colocation source and EN-022's tasks corrected.

Refs: SP-010.T3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes: SP-010
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
alignmentFactor: the mirrored alignment takes the rest of the room.
boxAspect: unchanged by a translation, grows by a vertical stretch.
cornerSetbacks: the radius at every corner of any rectangle.
edgeFactors: in [0, 1], the reduced setbacks fit their edge.
hasLength: a segment of integer points is kept exactly when they differ.

Refs: EN-020.T1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Properties for isSoundStretch, mirrorAcrossAxis, stretchedRightHalf,
stretchedSideDirections, stretchScale and turningAngles. The fitness
test now reads each function's own test file, so a property written for
a caller no longer counts; its list of exceptions is gone.

Refs: EN-020.T2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fitness test fails on an empty list and ignores commented-out
properties; a reversed polygon is unsound; turning angles checked vertex
by vertex and on a 3-4-5 triangle; hasLength meets equal ends; the right
half closes and rises; the odd closure, λ = 1 and the growth with λ for
the side directions; a round trip for stretchScale; tight factors,
reversed setbacks, mirror and alignment bounds.

Refs: EN-020.T2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes: EN-020
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The helpers each test file kept for typing, clicking, reading and
opening the page (11 copies of `text`, 10 of `type` in 3 variants) now
live once in `playground/user-actions/`, and fail at once on an element
the page lacks instead of skipping it. The radius-field tests set their
mixed radii through Points mode, no longer through the page's
attributes. Barrels allowed in playground subfolders; procedure verbs
choose, click and type added.

Refs: EN-021.T1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The rectangle of US-001 as points or corners (3 variants), expectPoints
(6 copies, 4 variants), the shoelace area (2), a free shape from points
and radii side by side (2), integer points (10) and triangles (2) for
properties now live once in `tests/geometry-fixtures.ts`, outside the
library's barrels. Every expected value is unchanged.

Refs: EN-021.T2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AlexandreGallais and others added 23 commits October 13, 2026 16:30
`contourToPathData` is removed: `contourPiecesToPathData` is the only
writer of path data, its tests compare with written-out path data, and
`SEPARATOR` and `CLOSE_PATH` are declared once. A rounded contour builds
each corner's triple once (`cornerTriples`) and its turning angle once,
shared by the clamp (`clampedRadii`) and the fillets: `filletArc` and
`cornerSetbacks` take the angle, `turningAngles` takes the triples.
Every drawing is unchanged.

BREAKING CHANGE: `contourToPathData` is removed from the public API;
`filletArc(corner, angle, radius)`, `cornerSetbacks(corners, angles)`
and `turningAngles(triples)` take the turning angles or the triples.

Refs: EN-021.T3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After the auditor's and the verifier's reviews: the playground tests no
longer keep a local helper that skips a missing element (`field`,
`radiusField`, `pressDelete`, `addPoint`, raw `?.click()`); new actions
`openServedPage`, `commitField`, `pressKey`, `readDisplay`,
`readPressedState`, `selectChoice`, and `chooseOption` fails on a
missing option. The last rectangles and integer points of the library's
tests use the fixtures, which get their own test. New cases kill
mutations that survived: the concave fillet of an L shape, the 3-4-5
triangle clamped to its incircle, arc radii in corner order. The test
actions leave the playground's coverage; the conventions name `tests/`
and `playground/user-actions/`; the JSDoc gap of the unused-imports rule
goes to the improvement log.

Refs: EN-021.T3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes: EN-021
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The barrels scope names the playground's subfolders since EN-021; a
second session's worktree runs `npm ci`, never a link to the main
`node_modules`, or no Git hook runs (seen at EN-020's push).

Refs: CHK-010.T1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs: CHK-010.T1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Light evolvability check: sizes before EN-022, mutations found by hand,
the property check, the playground panels importing both ways, the
worktree hooks, the run's reviews. Figures checked by the auditor.

Refs: CHK-010.T2
Closes: CHK-010
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR-0042: `src/model/` in one folder per shape, its type inside
(rectangle, regular-polygon, free-shape) and per concern (radii,
placement, selection); `src/geometry/` in rounded-corners, box and
polygon, the shared types at its root; `src/math/` past 15 modules, its
vector arithmetic in `vector/` with the `Vector` type. Files moved with
`git mv`, imports rewritten to their canonical paths, barrels per
folder. No behavior changed: the same 830 tests pass.

Refs: EN-022.T1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`toolbar/`, `shape/`, `points/`, `position/`, `drawing/`, `guided-test/`,
the steps of the guided test in `guided-steps/`, the page's own reading
and writing in `page/`; the entry, the mounting and the update stay at
the root. Value imports between panels go one way. Skills and the demo
template name the steps' new paths.

Refs: EN-022.T2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`tests/folders.test.ts` fails on a folder of `src/` or `playground/`
past 15 modules that `docs/conventions/files.md` does not list with its
reason, and on a listed folder no longer past it (mutation-checked).
The conventions page gives the layout of ADR-0042 and its one
exception, the playground's user actions.

Refs: EN-022.T3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After the audit of EN-022: a listed folder's count must be its true
count; the conventions name what sits at the roots (`listenToInputs`,
`boundingBox`, `ALIGNMENTS`) and their example tree uses current paths.

Refs: EN-022.T3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The story records why the layout departs from the research note: math
past 15 split into `vector/`, `polygon/`, `hasLength` in rounded corners,
8 playground folders so that panels import one way; `page/` is a
question for the Product Owner.

Closes: EN-022
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ared

After the audit of F11: the folder and barrel checks fail on a scan
without subfolders, and the barrel check reads the playground; the
fixtures get tests for decimals, the negative half of integer points,
the spread of triangles and a free shape's box; `loadPage` is shared by
`openPage` and `openServedPage` and tested without its script tag; the
playground tests read values and texts through the shared actions, and
choose an anchor cell with `chooseRadio`; `clampedRadii` gets a case of
unequal edge factors; fitness filters barrels by file name.

Refs: AUD-010.T1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conventions without non-existent paths and with the list of repository
tests in one place; the playground tests' rules as a list; the worktree
step without incident history; note 0012's retained choices as a table;
F11, EN-022 and CHK-010 worded as they stand.

Refs: AUD-010.T2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Findings with their evidence and action, the sources the round shape's
spike needs, and the light evolvability check.

Refs: AUD-010.T3
Closes: AUD-010
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The modules left beside theme folders move into themes: math/angle,
math/bisection, math/precision, the point beside the vector; geometry/box
gets the alignment, anchor, bounding box and size, geometry/contour the
arc, segment, contour piece, corner and cyclicItem. The two tests at the
root of src/model go to selection and placement. In the playground, the
wiring of the panels moves into mount/, and each test of the whole page
sits in the folder of the panel it exercises.

Refs: EN-023.T1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Folders now carry the names of docs/domain, the same in each layer:
corner-radius (was rounded-corners and model/radii), regular-polygon
(was polygon), and the box split into layout-box (the layout box of
Q21: alignment, anchor, fit, stretch, size) and placement (the straight
box and the turn, beside model/placement).

Refs: EN-023.T2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR-0043 supersedes ADR-0042: folders are named after the domains of
docs/domain, a folder holds modules or domain folders, never both, and
15 modules stay a signal. The new rule local/folder-layout reports a
file beside folders and an unlisted folder past the signal, in the
editor; the folder test keeps its list and docs/conventions/files.md
equal. Conventions, the story EN-023 and three rows of the feedback
log follow.

Refs: EN-023.T3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the review of EN-023: isAnchor and isModelSize go to
model/layout-box, boxAspect to geometry/regular-polygon, the angle's
field to playground/position. local/folder-layout skips hidden and tool
folders; its tests cover the boundary, the barrel, a nested listed path
and the data of each message. The folder test checks that the rule is
on for src and playground, and walks the tree for the files the lint
does not read. EN-023 done.

Refs: EN-023.T4
Closes: EN-023
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
[F11.AC1] no test file declares a shared helper again; [F11.AC2] one
writer of path data, its separator and close command declared once;
[F11.AC3] one pass over the corners of a rounded contour; the folder
and property checks tagged [F11.AC4] and [F11.AC5]. Each new check
was made to fail once. An improvement row: unicorn's
prefer-iterator-concat writes code Node.js 24 cannot run.

Refs: VAL-010.T1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The guide's page for F11: no drawing changed, so a table of figures
(largest folder, property tests, repeated helpers, path writers,
tests), the domains of each layer, and three checks the Product Owner
can do in the editor. VAL-010 in progress, its test card written; the
feature plan names the test of each criterion.

Refs: VAL-010.T2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs: VAL-010.T2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Product Owner read the demo page, checked the folders in the
editor and saw the lint refuse a file beside folders; the code is
trusted to the audits. Remarks routed: a short text in the playground
at every validation (run skill), a short page for a feature without
drawing (improvement log), a draft F12 for points on a curve with
handles in E14. The criteria of F11 are traced to tagged tests,
the project-wide tests included. AGENTS.md's state follows.

Refs: VAL-010.T3
Closes: VAL-010, F11
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment thread scripts/watch-task.ts Fixed
Comment thread scripts/watch-task.ts Fixed
watch-task's --until is plain text now, the start of a line, not a
pattern built from the command line (js/regex-injection); its output
file is read in one step, no existence check before (file-system-race).
library-html removes tags and comments until none is left
(incomplete-multi-character-sanitization).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment thread scripts/library-html.ts Fixed
Comment thread scripts/library-html.ts Fixed
AlexandreGallais and others added 3 commits October 13, 2026 16:43
Decided with the Product Owner: F12 comes before F10; a point keeps
its corner radius under its handles and gets it back when they are
removed, with a clear switch between the two modes; new points start
in the mirrored angle and length mode. How a handle is typed (x and y,
angle and length, pasted Bézier data, others) goes to the spike, every
method to be built and tried (Q32). SP-011 drafted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deletes the local branches merged into develop or deleted on GitHub,
prunes, and reports what is left; the run skill calls it as soon as
the feature pull request is merged and after the release. A feedback
row, and an open item to look for a cleaner run workflow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CodeQL still read the repeated replacement as an incomplete
sanitization; tags and comments are now cut out by splitting on their
marks, a mark never closed kept as text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

2 participants