Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions .claude/skills/upload-file/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 `<Downloads>` 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 `<Downloads>` 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): `/<section>/<product>/<file>`, 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.

Expand Down
13 changes: 7 additions & 6 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -440,21 +440,22 @@ 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

- [ ] **`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 `<Downloads>` 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 `<Downloads>` 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.
- [ ] **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.
Expand Down
15 changes: 9 additions & 6 deletions robot/manipulator/wr65.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

:::

Expand All @@ -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
Expand Down
24 changes: 14 additions & 10 deletions robot/manipulator/wrl63.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

:::

Expand All @@ -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 |
Expand All @@ -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
Expand Down