Repository navigation
Conversation
This was referenced Oct 2, 2026
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #328 +/- ##
==========================================
+ Coverage 88.21% 88.41% +0.20%
==========================================
Files 227 239 +12
Lines 36147 38887 +2740
Branches 2324 2832 +508
==========================================
+ Hits 31886 34381 +2495
- Misses 4257 4501 +244
- Partials 4 5 +1
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
geonnave
force-pushed
the
site-editor-p3
branch
from
October 4, 2026 02:38
c49f278 to
398f079
Compare
geonnave
force-pushed
the
site-editor-p3
branch
from
October 15, 2026 10:56
398f079 to
d3b56dd
Compare
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
… page Any web page in the browser can send requests to 127.0.0.1 with a valid Host header, and behind a permissive CORS policy read the replies, so the Host check alone let it save site.toml; a server bound beyond loopback took any Host. The peer address, Origin and Sec-Fetch-Site are checked. AI-assisted: Claude Opus 5.5
…ng tables A patched file is read back and must give the model that was sent, so a layout the patcher does not follow is refused rather than written. AI-assisted: Claude Opus 5.5
…adable files AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…e saving AI-assisted: Claude Opus 5.5
geonnave
force-pushed
the
site-editor-p3
branch
from
October 15, 2026 11:09
d3b56dd to
0284e37
Compare
Breaking: schema 3 calibration files are refused, so a calibration is collected again. swarmit's own calibration reader still expects schema 3 and needs its matching change before the dashboard reads these files. AI-assisted: Claude Opus 5.5
… block AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…'s next round AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…tangle Breaking, cross-repo: the messages and the config page (magic SWRP, 872 bytes) only match a swarmit bootloader and net core that store stations by mask, and swarmit's Python must accept mask messages before it relays them. Robots below device info 4 are refused with a reflash. AI-assisted: Claude Opus 5.5
…y-run AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…s of their own AI-assisted: Claude Opus 5.5
Breaking wire change, landing with DotBot-libs' 16-bit calibrated field: every advertisement field after the mask moves by one byte and the vendored dotbot_control.wasm is rebuilt at ABI 3 from that change. With the one-byte mask, a calibration naming station 8 or above read every sandbox robot as missing it and resent homographies on each advert. AI-assisted: Claude Opus 5.5
…obots AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…overage AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
… a placed one AI-assisted: Claude Opus 5.5
…body AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
… a file A placement's id comes from its stations, not its tag or anchor, so the same move saved twice, or a move into the source's own site, landed on an existing path; save_placed keeps that file and refuses the source's id. AI-assisted: Claude Opus 5.5
…ew file AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…editor AI-assisted: Claude Opus 5.5
…on stills AI-assisted: Claude Opus 5.5
…on save AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…moving ones AI-assisted: Claude Opus 5.5
…leave omitted tables AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
geonnave
force-pushed
the
site-editor-p3
branch
from
October 15, 2026 12:29
0284e37 to
0b67064
Compare
This was referenced Oct 15, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #327 (editor comfort), on #326, #315 and the LH2 stack to #343. Merges after them; until then the diff also carries their commits.
Walls and obstacles become part of a site pack, and every reader learns them in this PR, so the editor never draws something nothing else reads:
SiteSection.walls(2 points or more) and.obstacles(3 or more), strict like the rest.Site.walls/.obstacles.GET /controller/site(and the qrkey site reply) carrieswallsandobstacles.W) and Obstacle (O) tools: click the points, double-click or Enter to finish, Esc to cancel, snapped like areas. With Select, a barrier is moved whole or point by point, nudged with the arrows, and edited in the inspector (name, points asx, ylines, comment), with Undo. Checks: too few points (error), a point outside the extent (warning). The patcher writes the arrays of tables in place: an unchanged entry and its comment are left byte for byte, a moved point changes that number only, a new entry is appended after a blank line, a deleted one goes with its comment.Also: the scenario harness takes a
site.Plan: rendered copy https://claude.ai/artifact/LHUXjhx1nMWifC2oGRBayt, source https://github.com/DotBots/dotbot-workspace/blob/main/plans/site-editor/plan.html (both internal).
Walls or obstacles written inline (
walls = [{...}]) are refused rather than replaced on the first save, deleting an entry keeps the comments heading the others, and a body that leaves outwallsorobstaclesleaves the file's table alone.Validation. pytest: walls and obstacles read and refused (too few points, unknown key), served and round-tripped through the REST model; the blocking test on a disc against a segment and inside a polygon; a robot driven at a wall stops within a millimetre of contact while one past the wall's end drives on; a robot in contact backs off; a scenario (stepped controller and simulator) where a waypoint behind a wall is not reached and the site route serves the wall; the patcher's byte-identical round trip of a walled file, a moved point, an add and a delete keeping the other comments, the first and last array of tables, too few points refused. vitest: the map draws a wall and an obstacle; the editor draws a wall point by point and saves it as a new entry next to an unchanged obstacle, edits an obstacle's points as text and deletes it; point parsing, moving and the double-click dedup.
npm run lint, typecheck and build;pre-commit run --all-files; full pytest 1832 passed, vitest 869 passed; also a robot placed against or across a wall cannot drive through it, one inside an obstacle drives out, idle robots are not checked, Backspace while drawing keeps the selection, scenarios 15 passed.By hand, headless:
dotbot site new walled, a wall and an obstacle added through the editor's REST save;dotbot run simulator --site walled --robots 4; two robots sent across the wall stop at it (batch FAILED) while a third reaches its goal;/consolein headless Chrome draws the wall, the obstacle and the stopped robots; the editor draws, selects and draws a new obstacle in Chrome.dotbot/console-web/src/siteEditor/Canvas.tsxdotbot/sim/barriers.pydotbot/tests/test_site_barriers.pydotbot/console-web/src/siteEditor/Inspector.tsxdotbot/tests/test_site_toml.pydotbot/site_toml.pydotbot/console-web/src/siteEditor/SiteEditor.tsxdotbot/console-web/src/siteEditor/siteEditor.test.tsxdotbot/console-web/src/barrierLayer.test.tsxdotbot/console-web/src/siteEditor/edit.tsdotbot/console-web/src/siteEditor/edit.test.tsdotbot/site.py,MapView.tsx,dotbot/models.py,plant.py,dotbot/config.py,dotbot/site_editor.py,types.ts,test_site_editor.py,api.ts,types.ts,scenario_harness.py,test_server.py,dotbot/dotbot_simulator.py,test_qrkey_app.pyDocs (the site pack format page) follow after review.