From 88236bad150cdbdbaddf7e1cbef976e2e7a425db Mon Sep 17 00:00:00 2001 From: Timothy Lee Date: Thu, 15 Oct 2026 14:53:13 +0800 Subject: [PATCH 1/3] fix(manipulators): restore Realman's joint limits and weights for WR65 and WRL63 Realman's current parameters (Gen 3 and Gen 4, English and Chinese) and our archived specifications agree on these values; the manuals' specification tables are the outlier and widened WR65 J5 and WRL63 J3. The 27 V supply maximum from the manuals stays. --- TODO.md | 9 +++++---- robot/manipulator/wr65.md | 15 +++++++++------ robot/manipulator/wrl63.md | 24 ++++++++++++++---------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/TODO.md b/TODO.md index ca5a0c9..c8b0328 100644 --- a/TODO.md +++ b/TODO.md @@ -440,10 +440,11 @@ A read-only audit of every Markdown file on 2026-10-07. The high-severity items - [ ] **Docking robots linked to hand-charging rules.** `solution/robot-platforms/index.md:91` links `guides/operational-safety.md:74-75` ("do not leave charging unattended overnight"). `robot-maintenance.md:52` says unattended where `operational-safety.md:75` says overnight. - [ ] **No emergency-stop subsection** on `h1-2.md`, `go2.md`, `b2.md`, `a2.md`. `g1.md` and `r1.md` have one. - [ ] **B2 sealing.** `robot/quadruped/b2.md:132` says "be familiar with the sealing procedure" and doesn't link one. -- [ ] **WRL63 manual error.** The published `wrl63-user-manual-en-v1.1.pdf` contains RM65 text (an "RM65-B" spec heading, 610 mm radius, RM65 joint ranges). Raise it with the vendor. -- [x] **WR65 J5 — 2026-10-08.** The WR65 manual gives J5 as ±128° in its installation section and ±180° in its spec table. The ±128° is likely a documentation error; `wr65.md` now uses ±180°, consistent with the spec table and the other joints. -- [x] **WRL63 weight — 2026-10-08.** `wrl63.md` said 10.0 kg (`-B`); the published spec sheet (`wrl63-user-manual-en-v1.1.pdf`) says 10.2 kg. The page now follows the spec sheet. -- [ ] **WRL63 force-sensing weight.** `wrl63.md` gives 10.1 kg for the force-sensing variants, from an unpublished 2023 document. The spec sheet gives no figure for them, and the page now shows them lighter than the `-B`. Source it or remove it. +- [ ] **Manual errors to raise with Realman.** The manuals we publish disagree with Realman's current parameters ([RM65](https://develop.realman-robotics.com/en/robot/robotParameter/RM65OntologyParameters/), [RML63](https://develop.realman-robotics.com/en/robot/robotParameter/RML63OntologyParameters/)), which give the same figures for Gen 3 and Gen 4. Ask which figures apply to the arms we have shipped, and whether there are corrected manuals to republish. + - `wr65-user-manual-en-v2.8.pdf`: the specification table gives J1, J4 and J5 as ±180°, where Realman give ±178°, ±178° and ±128°. The manual's own installation section gives J5 as ±128°. + - `wrl63-user-manual-en-v1.1.pdf`: contains RM65 text (an "RM65-B" spec heading, 610 mm radius, RM65 joint ranges). Its specification table gives J1, J2, J4 and J5 as ±180°, J3 as +165° to −150° and a weight of 10.2 kg, where Realman give ±178°, −178° to +145° and 10 kg. +- [x] **WR65 and WRL63 joint limits and weights — 2026-10-15.** Both pages follow Realman's current parameters again, which match the specifications restored from the archive in `6790cd8`. `8a37e9a` in PR #44 had switched them to the manuals' specification tables, which widened WR65 J5 to ±180° and WRL63 J3 to +165°. Each joint table now names its source and the manual's differing values. The 27 V maximum supply voltage from the manuals stays. +- [x] **WRL63 force-sensing weight — sourced.** Realman's current parameters give 10.1 kg for the six-axis force version and 10 kg for the standard version. - [ ] **NanoPC 12 V claim.** `peripheral/computer/nanopc.md:35` "most robot bases we supply can feed 12 V directly" has no source. Check it against the bases before a customer over-volts a 5-20 V board. ### Publishing tools diff --git a/robot/manipulator/wr65.md b/robot/manipulator/wr65.md index 8e31827..891feda 100644 --- a/robot/manipulator/wr65.md +++ b/robot/manipulator/wr65.md @@ -85,7 +85,8 @@ and their figures for the force-sensing variant differ from ours — 627 mm reac Reach and force-sensor accuracy are the two values to confirm from the manual supplied with your arm, or from [Realman's current page](https://www.realman-robotics.com/en/products/rm65.html), -before you rely on them. The figures below are the ones that are consistent across both. +before you rely on them. Where Realman's current figures and our manual differ, the +figures below follow Realman. ::: @@ -108,16 +109,18 @@ before you rely on them. The figures below are the ones that are consistent acro #### Joint limits and speeds -From our manual, and identical across the variants. Worth having in front of you when you -are planning trajectories — a pose that looks reachable can sit outside J2 or J3. +From [Realman's current parameters](https://develop.realman-robotics.com/en/robot/robotParameter/RM65OntologyParameters/), +and identical across the variants. The specification table in the manual we publish gives +±180° for J1, J4 and J5; plan to the ranges here. Worth having in front of you when you +are planning trajectories — a pose that looks reachable can sit outside J2 or J5. | Joint | Motion range | Maximum speed | | --- | --- | --- | -| J1 | ±180° | 180°/s | +| J1 | ±178° | 180°/s | | J2 | ±130° | 180°/s | | J3 | ±135° | 225°/s | -| J4 | ±180° | 225°/s | -| J5 | ±180° | 225°/s | +| J4 | ±178° | 225°/s | +| J5 | ±128° | 225°/s | | J6 | ±360° | 225°/s | ### Control interface diff --git a/robot/manipulator/wrl63.md b/robot/manipulator/wrl63.md index b489455..e4c6885 100644 --- a/robot/manipulator/wrl63.md +++ b/robot/manipulator/wrl63.md @@ -85,7 +85,8 @@ and their figures for the force-sensing variant differ from ours — 917 mm reac Reach and force-sensor accuracy are the two values to confirm from the manual supplied with your arm, or from [Realman's current page](https://www.realman-robotics.com/en/products/rml63.html), -before you rely on them. The figures below are the ones that are consistent across both. +before you rely on them. Where Realman's current figures and our manual differ, the +figures below follow Realman. ::: @@ -96,7 +97,7 @@ before you rely on them. The figures below are the ones that are consistent acro | Degrees of freedom | 6 | | Payload | 3 kg | | Repeatability | ±0.05 mm | -| Body weight | 10.2 kg (`-B`) · 10.1 kg (force-sensing variants) | +| Body weight | 10.0 kg (`-B`) · 10.1 kg (force-sensing variants) | | Working radius | 900 mm (`-B`) — see the caution above for the others | | Power supply | DC 24 V rated, 27 V maximum | | Power consumption | ≤ 200 W maximum, ≤ 100 W comprehensive | @@ -106,20 +107,23 @@ before you rely on them. The figures below are the ones that are consistent acro | Communication | WiFi · network interface · Bluetooth · USB serial · RS485 | | Control modes | Drag-and-drop teaching · teaching pendant · API · JSON | -Note the trade against the [WR65](/robot/manipulator/wr65): half again the reach, but **3 kg payload rather than 5 kg** and 10.2 kg of arm rather than 7.2 kg. Both matter when you are sizing a mobile base. +Note the trade against the [WR65](/robot/manipulator/wr65): half again the reach, but **3 kg payload rather than 5 kg** and 10 kg of arm rather than 7.2 kg. Both matter when you are sizing a mobile base. #### Joint limits and speeds -From our manual, and identical across the variants. Worth having in front of you when you -are planning trajectories — note that **J3 is asymmetric**, unlike every other joint. +From [Realman's current parameters](https://develop.realman-robotics.com/en/robot/robotParameter/RML63OntologyParameters/), +and identical across the variants. The specification table in the manual we publish gives +±180° for J1, J2, J4 and J5 and +165° to −150° for J3; plan to the ranges here. Worth +having in front of you when you are planning trajectories — note that **J3 is asymmetric**, +unlike every other joint. | Joint | Motion range | Maximum speed | | --- | --- | --- | -| J1 | ±180° | 180°/s | -| J2 | ±180° | 180°/s | -| J3 | +165° to −150° | 225°/s | -| J4 | ±180° | 225°/s | -| J5 | ±180° | 225°/s | +| J1 | ±178° | 180°/s | +| J2 | ±178° | 180°/s | +| J3 | +145° to −178° | 225°/s | +| J4 | ±178° | 225°/s | +| J5 | ±178° | 225°/s | | J6 | ±360° | 225°/s | ### Control interface From e170ac03f0614b11675829f6acdfebe2224da7e9 Mon Sep 17 00:00:00 2001 From: Timothy Lee Date: Thu, 15 Oct 2026 14:53:43 +0800 Subject: [PATCH 2/3] docs(contributing): say what check:downloads does when the index is unreachable It passes and reports the queries as not checked, so "fails if a query matches nothing" only holds when the store's index is reachable. --- CONTRIBUTING.md | 2 +- TODO.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 748afe6..cf70591 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -123,7 +123,7 @@ curl -s https://download.westonrobot.net/index.json | grep wr65 That is the same file the site build reads, so if a document is in there it is live. -`npm run check:downloads` fails if a page still points into `static/_upload/`. That is not a lint rule — CI has no copy of your local file, so such a page would 404 for everyone but you. It also fails if a `` query matches nothing in the store. +`npm run check:downloads` fails if a page still points into `static/_upload/`. That is not a lint rule — CI has no copy of your local file, so such a page would 404 for everyone but you. It also fails if a `` query matches nothing in the store's index. If the index can't be reached, it reports those queries as not checked and does not fail. The path convention is [ADR 0001 D4](docs/adr/0001-host-downloadable-documents-on-s3.md): `/
//`, and a published path is **never renamed or deleted**. A customer's bookmark, a QR code printed on a chassis and a support email from 2024 all depend on that. diff --git a/TODO.md b/TODO.md index c8b0328..d636883 100644 --- a/TODO.md +++ b/TODO.md @@ -451,7 +451,7 @@ A read-only audit of every Markdown file on 2026-10-07. The high-severity items - [ ] **`publish-files.py` overwrites and over-uploads.** `scripts/publish-files.py:340` uploads `! differs` items, overwriting a published key and its `.sha256` under an immutable cache header. `:312-315` treats an unreadable store as empty, so `--publish` would upload everything. Refuse both without an explicit override, and say in CONTRIBUTING what to do on `!`. - [ ] **No manual deploy.** `.github/workflows/deploy.yml:3-7` runs only on push and pull_request, so a publish or retire doesn't reach the download tables until the next merge. Add `workflow_dispatch` and a "trigger a deploy" step to CONTRIBUTING and both skills. -- [ ] **`check-downloads.py` passes too easily.** `scripts/check-downloads.py:143-147` passes when the index is unreachable; `unsatisfied()` (`:100-106`) ignores `retired`, so an all-retired product passes with an empty table. `docs/design/file-hosting.md:86`, `:117` say "the build fails", but it's a separate script. `CONTRIBUTING.md:126` says it "also fails if a `` query matches nothing", which doesn't hold in either case. +- [ ] **`docs/design/file-hosting.md` says "the build fails".** `:86` and `:117` say an unresolved `` query fails the build, but it is `scripts/check-downloads.py`, a separate CI step, that fails. Two behaviours of that script stay as they are (decided 2026-10-15): an unreachable index passes with its queries reported as not checked (see the `fetch_index()` docstring), and a query that matches only retired documents passes, because retiring a document is deliberate. `CONTRIBUTING.md` now states the unreachable-index case. - [ ] **`LOCAL_REF` misses link forms.** `scripts/check-downloads.py:32` doesn't match reference-style links, `pathname:///_upload/`, unquoted `href` or `static/_upload/`. - [ ] **`wrfiles.py` accepts bad names.** `scripts/wrfiles.py:171-245` accepts a subject with spaces or capitals, an uppercase extension (the key keeps `.PDF`) and firmware tagged `en`. CONTRIBUTING says bad names are refused. - [ ] **`--list` without credentials** ends in a `NoCredentialsError` traceback; `CONTRIBUTING.md:90` says it reports what's missing. From d7fb1e6b7592601b0bc6c0b5175f83534a09b04b Mon Sep 17 00:00:00 2001 From: Timothy Lee Date: Thu, 15 Oct 2026 14:54:00 +0800 Subject: [PATCH 3/3] docs(upload-file): move static/_upload aside instead of deleting it The folder can hold staged documents that are not published yet, and deleting it to preview the CI build loses them. --- .claude/skills/upload-file/SKILL.md | 12 ++++++++++-- TODO.md | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.claude/skills/upload-file/SKILL.md b/.claude/skills/upload-file/SKILL.md index 27b061d..2e59896 100644 --- a/.claude/skills/upload-file/SKILL.md +++ b/.claude/skills/upload-file/SKILL.md @@ -95,8 +95,16 @@ Publishing needs the AWS CLI, boto3, credentials and `WR_FILES_DISTRIBUTION_ID` 7. **Rebuild and look.** `npm run build && npm run serve`, then the product page. A local build with the file still staged shows the **local** copy, badged - `staged`. To see what a customer gets, remove `static/_upload/` first and - rebuild — that is the build CI produces. + `staged`. To see what a customer gets — the build CI produces — move + `static/_upload/` outside the repository while you build, then move it back. + Do not delete it: it can hold staged documents that are not published yet. + + ```bash + mv static/_upload ../_upload.hold + npm run build && npm run serve + # after stopping the server: + mv ../_upload.hold static/_upload + ``` 8. **Clean up.** Delete the staged copy once published; it is scaffolding, and the page now resolves from the store. diff --git a/TODO.md b/TODO.md index d636883..ace3974 100644 --- a/TODO.md +++ b/TODO.md @@ -455,7 +455,7 @@ A read-only audit of every Markdown file on 2026-10-07. The high-severity items - [ ] **`LOCAL_REF` misses link forms.** `scripts/check-downloads.py:32` doesn't match reference-style links, `pathname:///_upload/`, unquoted `href` or `static/_upload/`. - [ ] **`wrfiles.py` accepts bad names.** `scripts/wrfiles.py:171-245` accepts a subject with spaces or capitals, an uppercase extension (the key keeps `.PDF`) and firmware tagged `en`. CONTRIBUTING says bad names are refused. - [ ] **`--list` without credentials** ends in a `NoCredentialsError` traceback; `CONTRIBUTING.md:90` says it reports what's missing. -- [ ] **upload-file skill.** `.claude/skills/upload-file/SKILL.md` should say a wrong version is also retired (as `retire-file/SKILL.md:21` does); `:94-96` "remove `static/_upload/` first" deletes staged files not yet published; `:37` has a garbled sentence. +- [ ] **upload-file skill.** `.claude/skills/upload-file/SKILL.md` should say a wrong version is also retired (as `retire-file/SKILL.md:21` does); `:37` has a garbled sentence. (Step 7 now moves `static/_upload/` aside instead of deleting it, 2026-10-15.) - [ ] **`check-video-budget.sh` extensions.** `scripts/check-video-budget.sh:41` patterns are case-sensitive and miss `.gif` and `.avi`. - [ ] **First checks need more than python3.** `CONTRIBUTING.md:18` says so, but the video check needs bash and git. - [ ] **What the store is for.** ADR 0001:21 and ADR 0002:42 disagree, and the store holds vendor manuals while the template says to link the vendor. Record the real rule.