Hai Wiki
home / products / DESIGN.md

Product base — design

A single, structured home for every Hai Robotics product and product-level technology: one entry per thing, every published fact cited, comparable side by side, and shaped so a future solution can be assembled from it.

Status: phase 1 built (2026-09-11). There are 57 entries, 265 quotes checked word for word against the corpus, and 179 relations. Browse it at /products/ in the document site. Phase 2 (videos) and phase 3 (solutions) are below.


Why the scraped material was not enough

What exists Gap
catalog.json → 8 robot pages Systems, workstations, software, chargers and racking sit under solutions, mixed in with industry pages. Nothing is typed or comparable
catalog.json → 88 case studies, each with a products list Mostly boilerplate. 53 of the case pages end with the same "Products" footer (usually A42, A42T, A3, HaiStation), whatever the case actually used. Once that footer is ignored, the A3 is named in 0 case studies, not 40, and the A42T in 14, not 59
Products with no page A42N, A42D, A42-FW, A42C, A42 SLAM, HaiFlex and HaiPort appear only in case studies, the company timeline or the HaiQ page
technologies.json → 40 technologies Organised by technology layer, not by product. Product-level terms like Chain-Pick, HaiVest and tray / de-tray are absent
Video pages Deliberately excluded by scraper/discover.py. That is phase 2

Specs are sparse and uneven: each page publishes different headline figures and no page is a full spec sheet. "Not published" is therefore shown as a first-class value, and it is often a good question to ask Hai.

The corpus also contradicts itself in places. Each case is recorded in the entry's notes:

Where One page says Another says
A42T max height 12 m (product page) 10 m (robots overview)
HaiPick Climb density 45,000 totes / 1,000 m² 30,000 (racking page)
K50 fast charge 10 min → 2 h ~15 min → ~3 h (System 3 FAQ)
Payload per tote 30 kg (A42T-E2 page) 50 kg (System 3 page)

The model

Entities

One Markdown file per entity. The folder is its kind and the file name is its id, so products/robots/haipick-a3.md is the robot haipick-a3.

Kind Entries
systems HaiPick System 1, System 2, System 3, HaiPick Climb
robots families: HaiPick ACRs, Companion Bots · ACR: A3, A42, A42-E6S, A42T, A42T-E2 · mentioned only: A42N, A42D, A42-FW, A42C, A42 SLAM · AMR: K50, K600, K1000 · climber: HaiClimber · AGV: HaiFlex
workstations HaiStation (the portfolio), 1-to-1 High Performance, Auto Tray & Detray, On-Robot Picking, On-Conveyor Picking, U-shaped Conveyor, Conveyor Interface, HaiPort Workstation
software HaiQ and its five subsystems: WES, ESS, Algorithm Platform, Data Platform, Simulation Platform
charging HaiCharger
storage Racking, Containers
safety HaiVest
services HAI RaaS, Solution Generator, Virtual Warehouse
technologies Chain-Pick, fork-lifting, telescopic lift, grappling hook, multi-layer trays, double-deep fork, flexible width fork, 3D visual recognition, auto tray/de-tray, DM code + inertial navigation, SLAM, LiDAR, LiFePO4, LTO, backpack method

listing records how visible a product is on the site: page (its own product page), section (described on another page, like HaiPort on the HaiStation page) or mentioned (named only in passing). Technologies have no listing.

Family entries ("HaiPick ACRs", "Companion Bots") exist because the site uses those names as families. Looking up "ACR" or "Companion AMR" lands on the family, which lists its members, instead of attaching a vague term to one product. Aliases may still be shared when the site shares them. The K600 and K1000 are both "Heavy-Duty Companion", and the terms page lists both.

Attributes

_attributes.yaml defines every attribute once, with its label, unit, type (number, text or list) and the kinds it may appear on. A number may be a [min, max] range. Its order is the row order on product and compare pages.

Every value carries the verbatim quote it rests on:

max_height_m:
  value: 5.5                       # normalised: comparable across products
  quote: "With up to 5.5m(18 feet) picking height"   # exact text from the page
  source: https://...              # optional; defaults to the entry's url
  note: fork lift speed            # optional short qualifier, shown in grey
  external: true                   # optional; a fact from outside the corpus,
                                   # shown as "unverified", quote not checked

what_it_does is required on every entry, so each one has at least one cited statement. Your own reasoning goes in the Markdown body, under Notes, and never into attributes.

Relations

Stored as Reads as (this side / the other side)
includes / part_of Includes / Part of
variant_of Variant of / Variants
alternative_to Alternatives (both sides)
works_with Works with (both sides)
uses Uses / Used by — the target must be a technology

Store a relation on whichever side has the evidence; the site shows it from both sides. Each relation takes one of three forms:

relations:
  works_with: [haiq]                 # checked: the target's name is on this entry's page
  part_of:
    - {id: haipick-system-1, quote: "The A3 and A42-FW ACRs are launched for HaiPick System 1",
       source: "https://www.hairobotics.com/company"}          # checked: quote on source
  variant_of:
    - {id: haipick-a42, inferred: true, note: "Named as an A42 model"}   # not checked; shown as "inferred"

Case-study mentions

These are computed, not typed. Each product page lists the case studies whose own text names it or one of its aliases. The site's boilerplate "Products" footer is ignored, "HaiPick A42" does not match "A42T" or "A42-E6S", and plurals such as "7 HaiPorts" count. Generic names (WES, Racking, Virtual Warehouse) set case_match: false.


Files and commands

products/
  DESIGN.md             this document
  _attributes.yaml      the attribute dictionary
  <kind>/<id>.md        one entry each
site/productbase.py     loader shared by the site and the checker
scraper/verify_products.py
poetry run python scraper/verify_products.py   # check every entry
poetry run python site/serve.py                 # browse at http://127.0.0.1:8000/products/

The checker enforces: known fields, kinds, families and listings; attributes defined for the entry's kind, with the right value type; every quote verbatim on its source page; every relation pointing to an existing entry, evidenced or marked inferred; and every knowledge link resolving to a real heading. It exits non-zero and lists each problem.

Adding or updating a product

  1. Copy a similar entry into the right kind folder; the file name becomes the id.
  2. Fill in name, url, listing and what_it_does, then any attributes from the dictionary. Copy each quote exactly from the page text in data/pages.jsonl.
  3. For a fact from outside the corpus (a datasheet, a conversation), add external: true and a source.
  4. Run the checker, then refresh the site.

Roadmap

Phase 2 — videos. Add videos to the in-scope sections in scraper/discover.py, re-run fetch and extract (cached, one request per second), then add new figures and video links to entries. All three verify_*.py scripts must still pass, since catalog.json is regenerated.

Phase 3 — solutions. A solution is a composition: requirements, a system choice, a bill of materials, and the technologies that make it work. Entry ids are stable and kinds are typed, so a solutions/ collection can reference them without changing anything here:

# solutions/<id>.yaml  (phase 3 — illustrative)
based_on: case:bosideng-hps1        # a reference deployment, or "design" for your own
system: haipick-system-1
requirements: {peak_totes_h: …, skus: …, clear_height_m: …}
bill_of_materials:
  - {product: haipick-a42n, qty: …}
  - {product: haicharger, qty: …}
  - {product: haiport-workstation, qty: …}

The checker would then confirm every product exists, that the robots are ones the system includes, and flag a requirement beyond a product's published figures (for example a clear height above a robot's max height). Case studies become the first reference solutions.


Decisions (2026-09-11)

  1. Products without a product page are included. More detail can be added later.
  2. Every published attribute needs a verbatim quote; external facts are allowed but marked "unverified".
  3. Technologies live in the same base and link to knowledge/.
  4. Videos come in phase 2, after this phase.
  5. The folder is products/.