Repository navigation
[ai][docs] devlog register format and PR numbers; 0.5.2 backlog cleanup - #677
Conversation
Add entries for the PRs merged since September 25 that the devlog did not record: the survey rename and asset rebuild (#664, #665), the October 4 merges (#656, #666, #670, #671, #673, #674, #631 landing), the vocabulary and survey export plans (#630), the prettier CI check (#639), S2.4's estimate columns (#634), the TrueNAS runbook follow-on (#620), the facet experiment plan (#657), the annotation save plan (#660), the Lombard-Laguna plan (#675) and the dependency bumps. Move the #622, #624, #626 and #627 bullets from September 27 to September 28 and date #672's entry October 5, their UTC merge dates. Remove the branch tags of work that has since merged (#631, #663, #668, #669). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…numbers throughout
Record the register rules in STYLE.md ("Logs and registers") and in a
formatting note at the top of the devlog: each bullet is one physical
line, each UTC date has one heading with no ranges, and every bullet for
work that landed through a PR ends with its number. The devlog-update
skill applies them: gap-fill goes into the day's single entry, removing
a landed branch tag adds the PR number, and its verify step checks for
duplicate dates, ranges, wrapped bullets and missing numbers.
Apply them to the whole devlog:
- Join 57 hard-wrapped bullets onto one line each (147 continuation
lines), text unchanged.
- Merge the 10 dates that had two to five headings into one heading
each, and split the six date-range headings by the merge dates of
their PRs. 237 entries become 219, one per date, newest first.
- Add PR numbers to 900 bullets, matched against each PR's commits and
changed files; uncertain matches were checked by hand. 1,250 of 1,309
bullets now carry a number. The 44 without one are direct pushes from
before PRs (March to June 2025), the September 2026 field captures,
two pieces of work that never reached main, and two with no matching
PR. The 15 tagged bullets are unmerged branch work.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sprint 0.5.2.0: - Physical reference authoring and scoring is delivered: the record and import (#635), scoring (#637) and macOS authoring with the Compare inspector (#656). Move it to Complete; the operator pilot item now says review runs in the delivered window. - Current-solver evidence refresh: the October campaign re-ran the corpus B0 baseline (#672), so what remains is D2 on kirk0 under the current solver, bound to a frozen reviewed split. Sprint 0.5.2.1: - Rewrite the solid-body item to the campaign's result: A2 is not promoted, B0 is kept (#672). What remains is S2.4's refined stages, smoother chain breaks and oracle coverage, a tracker stage/CPU profile, sensor geometry for every corpus case, and F8 once a governed split exists. Add Complete entries for #633, #634, #635, #636, #637, #649, #650, #656, #659, #672 and #673, in PR order after #627. Plans: - Physical reference plan: tick P1 (#656) and restate the status. - Near-edge plan: mark F6s superseded by the October campaign, which ran B0, the shadow and A2 at all 23 core sites; record why F8 and the face-transition remedy stay open. The evaluation protocol now keeps raw outputs local and writes findings into a docs/ report, as AGENTS.md requires; the results branches named in earlier findings are kept as provenance. - MVP sprint plan: S0 names the delivered reference tooling and kirk0's 20-object reviewed pack. - Clear the three plan-hygiene gate violations from #656 and #673: the Swift physical-pose plan and the facet resource notes now name the point annotation tool as their canonical hub. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
The devlog-update skill's new-day insertion step (SKILL.md line 190) still says to prepend "immediately after the # Development Log title line", which contradicts the PR's updated ordering rule and the devlog's new intro/formatting note and would misplace future entries.
Review effort: Balanced
Findings: 1
What changed in this PR
Documentation-only PR that converts docs/DEVLOG.md from drifting prose back into a strict register and records what the 0.5.2.0/0.5.2.1 work has since delivered. It codifies register rules in .github/STYLE.md and the devlog-update skill, backfills PR numbers and merges duplicate/range date headings in the devlog (not shown in these diffs), and updates the backlog and several LiDAR plans to reflect merged PRs and the October near-edge campaign's decision to keep B0. No code, schema, or behaviour changes.
Changes:
- Adds a "Logs and registers" standard to
.github/STYLE.md(one physical line per bullet, one heading per UTC date, a PR number on every landed bullet) and mirrors it into thedevlog-updateskill, whose verify step now checks for ranges, duplicate dates, wrapped bullets and missing numbers. - Marks delivered work complete across the physical-reference, near-edge, swift-pose and facet plans and the MVP sprint plan's S0 row; moves eleven PRs (#633–#673) into the backlog's Complete section.
- Clears plan-hygiene gate violations by retargeting the Canonical links of the swift-physical-pose and facet-authoring-resource-notes plans to the
point-annotation-tool.mdhub (verified:check-plan-canonical-links.py --checkreports 0 gate violations).
| File | Description |
|---|---|
.github/STYLE.md |
Adds the "Logs and registers" section defining devlog/backlog register rules. |
.claude/skills/devlog-update/SKILL.md |
Applies register rules; updates conventions and verify commands. One step (line 190) left inconsistent with the new ordering rule. |
docs/BACKLOG.md |
Collapses completed 0.5.2.0/0.5.2.1 items; adds #633–#673 to Complete. |
docs/plans/lidar-052-mvp-sprint-plan.md |
Updates S0 "Still open" and the physical-reference prose to reflect delivered tooling. |
docs/plans/lidar-near-edge-tracked-state-plan.md |
Records local-only raw outputs; marks F6s superseded by the October campaign; annotates F8/face-transition. |
docs/plans/lidar-physical-reference-review-plan.md |
Updates status and P1 checklist with delivering PR numbers (#635/#637/#656). |
docs/plans/lidar-swift-physical-pose-plan.md |
Marks increments A–D delivered (#656); retargets Canonical/Related links. |
docs/plans/lidar-facet-authoring-resource-notes.md |
Adds a Canonical link to satisfy plan hygiene. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
…troduction
The insertion step still said to prepend new-day entries immediately
after the "# Development Log" title line. The devlog now has an
introduction and a Formatting note before its first entry, and the
skill's own ordering rule says new entries go after them, so following
the step literally would put an entry above the introduction. It now
says to insert before the first "## " entry, and names the title as the
file spells it ("# Development log").
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ming, D2 corpus refresh, and #676's records (#678) * [ai][go] l5tracks: select a span's two percentiles instead of sorting The update cost profile (#676) found 58 % to 88 % of the solid body's Tracker.Update CPU in admitSolidBodyExtents: minimumAxisSpan calls trimmedSpan on 21 axes per visible face per frame, and each call sorted every member's projection to read two order statistics, the 1st and 99th percentiles. trimmedSpan now selects them: the upper one first, which leaves every value ordered before it in the prefix, then the lower one within that prefix. nthFloat64 is a quickselect with a median-of-three pivot and a three-way partition, in sort.Float64Slice's order (NaN first), and it sorts what remains after 2 log2(n) unproductive partitions, so its worst case is a sort's. The values are the ones sort.Float64s puts at those positions, so every span is the same, bit for bit: a test compares it with the old implementation on spread, tied, ascending, descending, constant and NaN/Inf/signed-zero inputs at 8 to 4,000 points. Benchmark on the Mac: 2.0 times faster at 256 points, 3.5 at 1,024, 3.6 at 4,096. The solid body is default-off, so a default replay does not run this code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][docs] span selection: balanced timing of B0, the shadow and A2 on both builds Measures the selection change against main under the October campaign's balanced protocol: three timing sites, B0, the shadow and A2 on each build, six conditions in one order and then reversed, four p99 values per condition, 300 s scored, on the Mac under caffeinate. - The shadow's and A2's Tracker.Update p99 fall to 30 % to 40 % of main's at every site (A2: 3.45 to 1.36 ms at 3rd-folsom, 8.79 to 2.71 ms at embarcadero-bryant); the four values of each condition lie within about 10 % of each other. - Byte-identical: kirk0 shadow and A2 replays of both builds wrote the same tracking baselines, solid-body rows and summaries. - Not enough for the campaign's screen: A2 is still 12 to 20 times B0's p99. What remains is the 21-axis search over every member, and reducing it changes spans, so it needs the corpus screen. Raw logs and the summary stay on the LiDAR volume. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][docs] devlog and backlog for the near-edge follow-ups Now that #677's register format is on main: five one-line devlog bullets under October 5 for S2.4, the oracle, the cost profile, the D2 re-run and the coverage survey, each ending (#676). In the backlog the evidence-refresh item keeps only the 24-site label-free D2 comparison and the frozen-split binding, the solid-body item keeps the extent admission change, balanced re-timing, held-out geometry and F8, and Complete gains the four #676 deliveries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][docs] devlog and backlog for the span selection change Two branch-tagged devlog bullets under October 5 for the selection change and its balanced timing, and the backlog's solid-body item now records that selection cut the solid body's p99 to 30 % to 40 % of the sort's while A2 still fails the cost screen, leaving the axis-search reduction, held-out geometry and F8. The timing report notes that the measured selection build (786bd0851) is this change on the earlier main, rebased onto #676 unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][docs] D2 on the 23-site corpus, label-free, on the current build The D2 report left the 24 September corpus-wide comparison pre-#600. Re-ran it on build acbe183 with the same flags (first segment, 200 s scored after 70 s, scorecards from 70 s, medoid scored against the OBB centre), captures from the NAS, evidence scored on the internal disk and moved to the LiDAR volume. embarcadero-folsom is left out as held out, so both runs are summarised over the same 23 sites. Six of seven measures hold in both arms. Contested terminations moved: the OBB centre's share fell by a median factor of 0.86 per site and the medoid's did not, so the OBB centre went from worse at 15 sites to better at 16. That matches kirk0, where the exact solver cut the OBB centre's identity switches and left the medoid's. The arms diverge as before (median MOTA 0.892 against 0.887). D5 stands. The report gains the corpus section and provenance; its recommendation no longer says the corpus figures are pre-#600, and notes the guide and plan updates that landed in #676. The backlog's evidence-refresh item now leaves only the frozen-split binding. One branch-tagged devlog bullet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][go] l4perception: select the near-edge percentile instead of sorting A profile of A2 after span selection put the next sort in the near-edge measurement: LateralPercentile sorted every projection to read one order statistic, for every face of every candidate pair the tracker gates. It now selects that value with the same quickselect, which moves from l5tracks to l4perception as NthFloat64 so both callers share it. The selected value is the sort's; the only possible difference is the sign of an exact zero, which no sort promises either. Tests compare every percentile with the sort's on spread, tied, ordered, constant and NaN/Inf/signed-zero inputs, and bit for bit on cluster-like points. Benchmark: 2.8x at 256 points, 3.3x at 1,024, 5x at 4,096. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][docs] span selection report: where A2's update goes now, and the near-edge percentile The report said the cost left after span selection was the 21-axis span search. A profile of B0 and A2 after selection at 3rd-folsom says otherwise: the span search is under half of A2's update (0.15 of 0.33 s), and even free it would leave A2's update three times B0's. The near-edge measurement in association's gate costs as much as B0's whole update, mostly a sort in LateralPercentile. A2's update is 2.5 % of the frame callback's CPU. Balanced timing of the near-edge percentile's selection (c33ed5d) against the span selection alone (28d713f), captures from the internal SSD, four p99 values per condition: the shadow's and A2's p99 fall 8 % to 12 % at 3rd-folsom and embarcadero-bryant, non-overlapping; A2 stays 10.4 and 18.5 times B0's. One run disturbed by a desktop application was set aside and repeated. The span-selection build reproduced its earlier p99 within 4 %. The backlog item no longer names the span search as what remains; it records the screen's scope (Tracker.Update or the frame) as an open decision. Two branch-tagged devlog bullets. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][docs] span selection report: the near-edge percentile at pierce-haight The third timing site, same protocol, captures from the internal SSD: the shadow's p99 falls 10 % (1.138 to 1.024 ms) and A2's 28 % (1.200 to 0.858 ms), non-overlapping. pierce-haight's solid-body cost sits in a few frames with large clusters, where A2's gate measures the near edge for every candidate pair. A2 is 8.1 times B0's there. One B0 run that ended at load 9.5 was set aside and repeated. Devlog and backlog ranges updated to all three sites. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Adds the October 6 entry for the twenty PRs that merged that day (#679 to #703, with #684 still open as a branch bullet), records #677's devlog and backlog work under October 5, and replaces the five span-selection branch tags there with #678 now that it has merged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Moves the work merged since #677 to the Complete section with its PR numbers, following the governance rule that items are completed, not deleted: - #690 and #692 had dropped their items on merge; Phases 1, 2 and 4 and the perf track-count identity are now Complete entries. - #678, #686 and #688 had left their finished work inline in the parent items under branch names; it moves to Complete and the parents keep only what remains. - #682 completes the Tailscale long-poll item, #680 the mac half of the perf baseline item (the ci half stays), and #689's frame timing is recorded beside the solid-body item it informs. The sprint review's R4 and R6 status lines and the PCAP read-in-place report cite #686, #688 and #680 instead of branch names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* [ai][docs] devlog: October 6, #677 and #678 landed Adds the October 6 entry for the twenty PRs that merged that day (#679 to #703, with #684 still open as a branch bullet), records #677's devlog and backlog work under October 5, and replaces the five span-selection branch tags there with #678 now that it has merged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][docs] backlog: record what landed on October 6 Moves the work merged since #677 to the Complete section with its PR numbers, following the governance rule that items are completed, not deleted: - #690 and #692 had dropped their items on merge; Phases 1, 2 and 4 and the perf track-count identity are now Complete entries. - #678, #686 and #688 had left their finished work inline in the parent items under branch names; it moves to Complete and the parents keep only what remains. - #682 completes the Tailscale long-poll item, #680 the mac half of the perf baseline item (the ci half stays), and #689's frame timing is recorded beside the solid-body item it informs. The sprint review's R4 and R6 status lines and the PCAP read-in-place report cite #686, #688 and #680 instead of branch names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ico from it, stop embedding static/ (#704) * [ai][go] embed all of web/build, including _-prefixed files WebBuildFiles was `//go:embed web/build/*`. The glob names web/build/_app, so that directory is kept, but Go then skips every file below it whose name starts with "_" or ".". SvelteKit names shared chunks _app/immutable/chunks/<hash>.js, and the hash alphabet includes "_" (D_9rjNUa, start.BQyT_uoz.js). A chunk whose hash started with one would be missing from the binary and 404 under /app in production, while the --debug server, which reads web/build from disk, served it. Today's single-chunk build has one hash-named file per build, so the odds were small but never zero. The SvelteKit 3 split strategy would make dozens. `all:web/build` keeps everything, as DocsSiteFiles already does. With a stub build plus fake chunks _Ab12Cd3.js and Bx9_k2Lm.js, `go list` showed the old directive embedding only the second; the new one embeds both. StaticFiles (`static/*`) keeps its pattern: the server routes only /favicon.ico to it. TestWebBuildEmbedKeepsUnderscoreFiles pins the directive itself, since no committed build contains a "_" file to prove the point at run time. TestWebBuildEmbedMatchesDisk checks that every file under web/build is readable from the embed, which CI's integration job runs against a real build. With the old directive and the fake chunk on disk, both fail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][go] serve /favicon.ico from the web build and stop embedding static/ StaticFiles (`//go:embed static/*`) existed for one route, /favicon.ico, and in production that route had been a 404: the handler was http.FileServer(http.FS(radar.StaticFiles)), which looks for favicon.ico at the root of a tree whose files sit under static/. Dev mode read ./static from disk and worked, which is why it went unnoticed. The SvelteKit app links /app/favicon.ico itself, but /docs/ declares no icon, so browsers fell back to the broken /favicon.ico. The long-running local server answers 404 there today. The favicon now comes from the web build, web/static/favicon.ico by way of web/build: fs.Sub of WebBuildFiles in production and ./web/build in dev, the same tree /app is served from. This is items 1.1 and 1.3 of the binary size reduction plan. The two icons are byte-identical, so nothing visible changes except that the route works. Dropping StaticFiles also stops the binary embedding whatever sits in static/, which web/scripts/copy-build.js filled with a copy of the web build. Identical files are stored once by the compiler, so in a local build the binary shrinks by only 16,752 bytes. The cost was stale pages that no longer matched the build (31 KB of them in a long-lived checkout), and once the 172 MB of accumulated builds the plan measured. TestStart_ProductionModeListenAndShutdown already requested /favicon.ico but checked nothing, and it fails against the old handler with a 404. It now requires 200 and web/build/favicon.ico's bytes, or a 404 when the build is the index.html-only stub. TestStart_DevModeWithBuildDir checks that dev mode serves the build's favicon. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][js][make][cfg] stop copying the web build into static/ The web build's postbuild hook, web/scripts/copy-build.js, copied web/build/* into the repo-root static/ so the server could embed it. #49 added the copy when /app was already served from web/build, and the server never served anything from static/ but /favicon.ico. With the favicon now taken from the web build, nothing reads static/, so the hook and the script go, and so does the tracked static/favicon.ico, which is byte-identical to web/static/favicon.ico. - make clean-web removed three static/_app subdirectories; it now removes static/ outright, clearing what older builds left in existing checkouts. - .gitignore keeps static/ ignored so those leftovers stay out of git status, and says why. - The static-build Docker context no longer re-includes static/. `make build-web` now leaves no static/ behind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][docs] binary size plan: phase 1.1 and 1.3 landed Ticks the plan's first three checklist items: the static/ embed and StaticFiles are gone, and the favicon comes from the web build in production and dev. A note at the top records what was measured on the way. static/ held a byte-identical copy of the web build, which the compiler's content-addressed storage kept almost free (16,752 bytes), plus stale pages. The favicon it was kept for had been a 404 in production. The two Markdown links to ../../static become code spans, since a clean checkout no longer has that directory. The canonical hub's "currently ~211 MB" becomes "when the plan was written", and the stale static/ row reads 0 MB. ARCHITECTURE.md says where /favicon.ico comes from. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [ai][docs] physical pose plan: British spelling of serialisation #677 left "serialization" in the plan's effort table, which fails the British-spelling step of `make lint-docs` on main. Same length, so the table stays aligned. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

Purpose
The devlog had drifted from a register into prose: hard-wrapped bullets, several headings for one date, date ranges, and most bullets without the PR that delivered them. The 0.5.2.0 and 0.5.2.1 backlog items also predated the work that has since landed and the October near-edge campaign's decision to keep B0. Docs only: no code, schema or behaviour changes.
Changes
Three commits, reviewable separately.
1. Devlog gap-fill, September 25 to October 5
2. Devlog register rules, applied throughout
.github/STYLE.mdgains "Logs and registers": one physical line per bullet, one heading per UTC date with no ranges, and a PR number on every bullet whose work landed through a PR. The devlog's header and thedevlog-updateskill carry the same rules; the skill's verify step now checks for duplicate dates, ranges, wrapped bullets and missing numbers.3. Backlog and plans: what 0.5.2.0 and 0.5.2.1 delivered
AGENTS.mdrequires. The S0 row of the MVP sprint plan is updated.Checklist
DESIGN.md. (Not applicable: documentation only.)README.mdis up to date. (Not affected.)docs/DEVLOG.mdis up to date.Checks run locally: prettier 3.9.9, relative links, backtick paths, British spelling, header metadata, plan canonical links (0 gate violations, down from 3), and
make check-no-results.🤖 Generated with Claude Code