Skip to content

Rewrite vision section: new how-tos, migrated references, runtime fixes#4933

Merged
shannonbradshaw merged 20 commits intoviamrobotics:new-docs-sitefrom
shannonbradshaw:review/vision
Apr 16, 2026
Merged

Rewrite vision section: new how-tos, migrated references, runtime fixes#4933
shannonbradshaw merged 20 commits intoviamrobotics:new-docs-sitefrom
shannonbradshaw:review/vision

Conversation

@shannonbradshaw
Copy link
Copy Markdown
Collaborator

Summary

Full Phase 1–4 rewrite of the vision docs section against upstream new-docs-site. 14 new pages, 10 modified, 8 deleted. All linters and make build-prod clean.

New how-tos (docs/vision/)

Reference migration (operate/reference/services/vision/reference/services/vision/)

  • mlmodel.md: adds missing xmin_ymin_xmax_ymax_order field, corrects input_image_mean_value description (was copy-pasted from stddev), removes false defaults, fixes Go code (undefined variables, wrong method casing, wrong DecodeImageFromCamera signature). Preserves #prerequisites anchor hardcoded in the vision-ml-model builder UI
  • color_detector.md: adds missing label field, surfaces startup errors
  • detector_3d_segmenter.mddetections-to-segments.md: updates to the viam:vision:detections-to-segments module model name following the July 2025 RDK migration (PR rdk#5143); adds module install step

Runtime bug fixes

  • measure-depth.md: three Python bugs (get_image singular → get_images plural; NamedImage.source_name.name; .image attribute → bytes_to_depth_array())
  • act-on-detections.md: do_command timeout keyword argument
  • data-ai/ai/deploy.md: adds {#model-framework-support} anchor (the app UI hardcodes this anchor but the heading slugged to something else)

Other changes

  • vision/_index.md rewritten as explanation with CVOps framing and links to all pages in the section
  • configure.md trimmed from 552 to 238 lines; attribute table moved to reference, cloud inference moved to batch-inference.md, troubleshooting moved to tune.md, self-referential links and unsourced FPS claim fixed
  • reference/apis/services/{vision,ml}.md: date refreshed, stale /operate/ links fixed
  • URL aliases preserve all reverse-link paths from the app UI
  • Card shortcodes and canonical pointers in data-ai/_index.md, data-ai/ai/_index.md, and tutorials/configure/pet-photographer.md updated

Reverse-link paths preserved through aliases

  • /operate/reference/services/vision/mlmodel/#prerequisites (vision-ml-model builder)
  • /data-ai/ai/deploy/ + #model-framework-support (registry UI + ML model instructions)
  • /data-ai/ai/{act,alert,run-inference}/ (data-ai section cards)
  • All old /services/vision/*, /ml/vision/*, /data-ai/services/vision/* paths

Test plan

  • Spot-check the rewritten landing page at /vision/
  • Spot-check tune.md symptom-to-attribute mapping against the mlmodel reference
  • Verify /data-ai/ai/deploy/#model-framework-support redirects and the anchor resolves (tests the app UI hot path)
  • Verify /operate/reference/services/vision/mlmodel/#prerequisites redirects with anchor (tests the vision-ml-model builder link)
  • Verify /data-ai/ai/{act,alert}/ redirect to the vision/ equivalents
  • Confirm rendered pages in the Netlify deploy preview
  • make build-prod passes

Artifacts in the code-map

Review outputs saved at ~/viam/code-map/vision-* for traceability — landscape, IA evaluation, section plan, per-page findings, and the inventory files produced during Phase 1.

Landing and explanation:
- Rewrite vision/_index.md as explanation with CVOps loop framing
- Add how-it-works.md extracting the two-service architecture

New how-tos (docs/vision/):
- tune.md: symptom-driven map of mlmodel vision service attributes
- retrain.md: CVOps loop for model drift
- deploy-from-registry.md: registry model deployment (takes /data-ai/ai/deploy/)
- deploy-custom-model.md: BYO model deployment
- segment-3d.md: GetObjectPointClouds with detections-to-segments
- detect-by-color.md: dedicated color_detector how-to
- batch-inference.md: viam infer CLI (takes /data-ai/ai/run-inference/)
- roll-out-to-fleet.md: fleet model rollout (link-heavy)

Config reference migration (operate/reference/services/vision → reference/services/vision):
- mlmodel.md: adds missing xmin_ymin_xmax_ymax_order field, corrects
  input_image_mean_value description, removes false defaults, fixes Go
  code; preserves #prerequisites anchor (hardcoded in app UI)
- color_detector.md: adds missing label field, surfaces startup errors
- detector_3d_segmenter.md renamed to detections-to-segments.md;
  updates to viam:vision:detections-to-segments module model name,
  adds module install step

Runtime bug fixes on existing pages:
- measure-depth.md: fix Python depth decode (get_image→get_images,
  source_name→name, .image→bytes_to_depth_array)
- act-on-detections.md: fix do_command timeout keyword argument
- data-ai/ai/deploy.md: add {#model-framework-support} anchor (hot
  app UI link was broken)

Configure.md trim: 552→238 lines. Remove duplicate attribute table (now
in reference), remove cloud inference section (now batch-inference.md),
trim troubleshooting (now tune.md), fix self-referential links and
unsourced FPS claim.

Deletions with URL aliases preserved:
- data-ai/ai/{act,alert}.md superseded by vision/{act,alert}-on-detections.md
- data-ai/ai/{deploy,run-inference}.md migrated to vision/
- operate/reference/services/vision/* migrated to reference/services/vision/

API reference: refresh stale 2022-01-01 dates, fix /operate/ links on
reference/apis/services/vision.md.

All 23 affected pages pass vale, prettier, markdownlint. make build-prod
passes with no errors. All reverse-link paths from app UI preserved
through aliases.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@netlify
Copy link
Copy Markdown

netlify bot commented Apr 14, 2026

Deploy Preview for viam-docs ready!

Name Link
🔨 Latest commit b9a9ab9
🔍 Latest deploy log https://app.netlify.com/projects/viam-docs/deploys/69e022f89d1a7f0008164fa8
😎 Deploy Preview https://deploy-preview-4933--viam-docs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 46 (🟢 up 1 from production)
Accessibility: 99 (🔴 down 1 from production)
Best Practices: 92 (no change from production)
SEO: 89 (🔴 down 3 from production)
PWA: 60 (🔴 down 10 from production)
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to your Netlify project configuration.

shannonbradshaw and others added 19 commits April 14, 2026 18:48
Nav structure:
- Create docs/vision/overview.md as the section overview page (weight 1,
  linkTitle "Overview"). Section header opens this via manualLink.
- Stub docs/vision/_index.md to frontmatter only with manualLink to
  /vision/overview/.
- Rename how-it-works.md linkTitle to "How the vision service works".

Prose editing pass (23 pages):
- overview.md: replace "wraps whatever is doing the seeing" framing and
  reword detection/classification/segmentation examples to avoid
  colon-then-or constructions.
- configure.md: clarify Tune detection quality link sentence.
- tune.md: fix repeated "specific" and rework architecture sentence.
- retrain.md: replace the "a camera gets moved" passive/active mix.
- deploy-from-registry.md: tighter opening, fewer repeated "Viam
  registry" phrasings.
- deploy-custom-model.md: flatten parallel bullets, fix double-negative,
  clarify role-registration language.
- segment-3d.md: parallelize gerunds in use cases list; fix label
  repetition in pipeline description.
- detect-by-color.md: "brittle to" → "sensitive to".
- batch-inference.md: fill in the missing number in "roughly seconds
  per image".
- measure-depth.md: trim redundant phrasing in depth map definition.
- alert-on-detections.md: replace "--" em-dash-style break with colon.
- detect.md: parallelize the final application examples.
- classify.md: clarify the implicit-confidence description.
- track.md: split the long opening sentence.
- mlmodel.md: flatten the opening paragraph.
- color_detector.md: parallelize the use-case examples.
- detections-to-segments.md: fix label repetition.

Registry linking:
- Every mention of "registry" that was unlinked now links to
  https://app.viam.com/registry.
- Existing filtered-view links normalized to the landing URL.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Viam app add-resource menu no longer has a "Component or service"
top-level item. The current flow is: click +, select "Configuration
block", type to search in the dialog, click a result, enter a name,
click "Add component". Updated every vision how-to and config
reference to match this flow.

Registry modules install automatically when you click "Add component";
replaced "If prompted, confirm to install the module" with that
clarification.

Also aligned other UI label references:
- Section titles render uppercase via section-group.svelte CSS. Use
  "ML MODEL" and "DEFAULT CAMERA" (section labels) rather than title
  case or "dropdown" descriptions.
- retrain.md now uses the actual Version dropdown that exists in the
  ML model service panel (not an "ML model dropdown" that doesn't).

Files updated:
- vision/configure.md
- vision/deploy-from-registry.md
- vision/deploy-custom-model.md
- vision/detect-by-color.md
- vision/segment-3d.md
- vision/retrain.md
- vision/track.md
- reference/services/vision/mlmodel.md
- reference/services/vision/color_detector.md
- reference/services/vision/detections-to-segments.md

Verified against app.viam.com UI code at 84d992edc:
- app/ui/src/lib/components/robot/add-resource-menu/menu-items.svelte:42
- app/ui/src/lib/components/robot/add-resource-menu/create-block-modal/
- app/ui/src/routes/.../builder/vision-ml-model/section.svelte:58,101

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rigorous pass verifying every UI label across the vision section against
Viam app source at 84d992edc.

Add-resource dialog flow corrections:
- "Search for X and select it" → "In the search field, type X and
  select the matching result" for specificity
- Dropped "click Add component again to confirm" from multiple places.
  Registry modules install automatically on first Add component click.

Control card and TEST panel: dropdown labeled "Camera"
(app/test-cards/src/lib/components/vision-service-view/vision-service-view.svelte:134).
Every instruction that previously said "select your camera" now
specifies the **Camera** dropdown by name, and tells users to pick the
camera their vision service is configured to run on. Affects:
- vision/overview.md
- vision/configure.md
- vision/deploy-from-registry.md
- vision/deploy-custom-model.md
- vision/detect-by-color.md
- vision/tune.md (new camera step in Verify section)
- vision/act-on-detections.md (TEST panel troubleshoot step)
- vision/alert-on-detections.md (TEST panel confidence check)
- reference/services/vision/mlmodel.md
- reference/services/vision/color_detector.md

Refresh button does not exist on the control card. The RefetchController
defaults to refetching every second; users see a live overlay
automatically. Replaced "click Refresh" with "the overlay refreshes
automatically" everywhere.

Upload model form (deploy-custom-model.md) corrected field labels:
- "Name" → "Model name"
- "Framework" → "Model framework"
- "Type" → "Task type" (options: Object detection, Single label
  classification, Multi label classification, Other)
- "Model file"/"Labels file" → "Choose model file"/"Choose label file"
  button labels inside the Upload files picker
- Added the "New model"/"New version" + Visibility step that precedes
  the main form
- Final button is "Upload model", not "Upload"

Run model flow in mlmodel.md reference: updated to reflect the
Auto-prediction mode icon (tooltip "Run Model") and the Run model side
panel in the expanded image view. The "Actions tab" referenced earlier
does not exist.

Verified but unchanged (accurate):
- CONFIGURE, CONTROL, CONNECT, LOGS, MODELS, TEST — tabs are rendered
  uppercase via details-nav.svelte and section-group.svelte CSS
- Save button label
- ML MODEL / DEFAULT CAMERA section titles
- Select model button, Version dropdown, Latest option
- SDK code sample, Include API key, API key, API key ID
- Trigger menu item, Type and Data Types field labels
- Data has been synced to the cloud, Binary (image)
- Email specific addresses, Email all machine owners, Add Webhook
- Data Capture button on component cards
- GetImages data-capture type

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The add-Configuration-block flow has TWO Add component buttons:
- One on the block detail page that opens after selecting a search
  result (block-page-header.svelte:36-41)
- One in the modal name-input dialog that opens after the first click
  (content-rdk-builtin.svelte:87, content-registry-item.svelte:85)

Every vision how-to was documenting only the second click, leaving
users stuck on the detail page. Updated 11 step sequences across
10 docs to use the canonical pattern: "Click Add component, name X,
click Add component again to confirm".

Also corrected:
- vision/mlmodel display string from "vision / mlmodel" (with spaces)
  to "vision/mlmodel" (no spaces) — block-card-rdk-builtin.svelte:27
  uses {subtype}/{name} with no spaces. Affects configure.md,
  deploy-from-registry.md, mlmodel.md reference, color_detector.md
  reference.
- track.md: clarified that the search result for object-tracker is a
  registry-item card showing the module/model with a VISION badge,
  not a literal "viam:vision:object-tracker" string.

Verified against canonical state machine documented at
code-map/ui-flows/add-configuration-block.md.

Per-page mapping verified in code-map/vision-ui-verification-add-block.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Align step language with the verified trigger-card UI: Method (not
"type"), Frequency (hz), and Alert frequency (not "notification
frequency"). Corrections found while verifying UI flow docs end-to-end
against current app source.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Catches UI-label mistakes at commit time by grepping markdown for
strings that don't match the current app UI (e.g., "Notification
frequency" when the label is "Alert frequency", "Generate machine key"
when the button says "Generate API key", "Component or service" for
the retired + menu item).

Rules derive from the canonical flow documents at
~/viam/code-map/ui-flows/, each verified by reading every involved
Svelte component end-to-end.

Usage:
  python3 scripts/check-ui-labels.py                # scan docs/
  python3 scripts/check-ui-labels.py path/to/p.md   # scan named files
  python3 scripts/check-ui-labels.py --staged       # scan staged files

Escape hatch: add `<!-- ui-check-ignore -->` to the end of a line to
suppress the check (for common-mistakes callouts that reference the
wrong label on purpose).

To enable locally as a pre-commit hook, place the following in
.git/hooks/pre-commit:

  #!/usr/bin/env bash
  set -euo pipefail
  worktree_root="$(git rev-parse --show-toplevel)"
  script="$worktree_root/scripts/check-ui-labels.py"
  [ -x "$script" ] || exit 0
  python3 "$script" --staged

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Traced every UI step in the vision docs against the 7 canonical flow
documents and fixed discrepancies:

- mlmodel reference: sharpen "Run model" panel step to name the
  Choose ML model and Run buttons explicitly.
- alert-on-detections: trigger-card step 5–6 now names the ALERT
  OPTIONS and WEBHOOKS sections and clarifies that Alert frequency
  is per-row (each email row, all-owners row, each webhook row each
  have their own).
- configure: rewrite the CONNECT tab / SDK code sample instructions
  to match the actual switch behavior. The Include API key switch
  starts visually on but displays placeholders; clicking it flips the
  snippet to real credentials. Step now says "click the switch" and
  names the real placeholder strings.

No new flows discovered: every UI instruction in the vision docs
maps to one of the existing flows under ~/viam/code-map/ui-flows/.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Systematic pass against code-map/playbook-writing.md (Williams/LRS
principles plus Viam style rules) over all 22 vision-section pages.

Style-rule fixes (the bulk):
- Replace em dashes (-- and —) in prose with colons, parentheses, or
  separate sentences across detect, classify, measure-depth, act-on-
  detections, alert-on-detections, color_detector reference.
- Sentence-case headings: "Try It" -> "Try it", "What's Next" ->
  "What's next", "Troubleshoot" -> "Troubleshooting" where it diverged
  from the section's dominant pattern.
- Sentence-case and restored canonical link text in "What's next" /
  cross-reference links (for example, "Detect Objects (2D)" ->
  "Detect objects").
- Fix `vision / mlmodel` -> `vision/mlmodel` (no spaces; matches the
  actual result-card display per add-configuration-block flow doc).
- Replace 2 `e.g.` in track.md code comments with "for example".
- Track.md: table default-value cells `--` -> `None` for readability.

Structural / writing fixes:
- overview.md: add an Index Position sentence before the built-in
  model table so it doesn't drop into the reader cold.
- how-it-works.md: move an `if`-clause from stress position to
  opener so the payload "more than one role" sits at stress; split a
  19-word parenthetical so subject and verb stay close.
- configure.md: split a dense nested parenthetical in the tflite_cpu
  search step into two sentences.
- measure-depth.md: fix malformed two-em-dash parenthetical ("--for
  example, ... --you") to proper parentheses.
- alert-on-detections.md: trigger-card section 5/6 now names the
  ALERT OPTIONS and WEBHOOKS sections and clarifies that Alert
  frequency is per-row. (Supplements earlier UI-label commits.)
- retrain.md: soften an unverifiable quantitative claim ("majority
  drop significantly within the first six months") and replace with
  the same training-to-production-gap citation used in overview.md.

No changes to prose that was already clean: deploy-from-registry,
tune, roll-out-to-fleet, batch-inference, reference _index,
mlmodel/color_detector/detections-to-segments reference body prose.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Before: 17 flat pages under /vision/. After: 4 top-level pages + 3
task-oriented subsections, matching how users frame their goals.

New structure:
  /vision/overview, /vision/how-it-works, /vision/configure,
  /vision/classify (top-level)
  /vision/object-detection/ (detect, detect-by-color, tune, track,
    act-on-detections, alert-on-detections)
  /vision/3d-vision/ (segment-3d, measure-depth)
  /vision/deploy-and-maintain/ (deploy-from-registry,
    deploy-custom-model, retrain, roll-out-to-fleet, batch-inference)

Every moved page keeps its old /vision/<page>/ URL as an alias, so
existing inbound links continue to work via Hugo's redirect.

Internal vision-section links and the vision-service reference links
updated to point directly at the new locations. overview.md's "Where
to go next" regrouped to match the new subsection structure.

Cross-section link updates (train, monitor, data-ai, tutorials, etc.)
are in a separate commit.

Classification stays as a single top-level page. act-on-detections
and alert-on-detections live under object-detection since that's the
dominant use case; classify.md cross-references them.

Build verified: make build-prod clean. Vale clean. 1126 aliases emitted.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Point links from other sections (train, monitor, data-ai, tutorials,
reference) at the new /vision/object-detection/, /vision/3d-vision/,
and /vision/deploy-and-maintain/ paths. The old /vision/<page>/
aliases still resolve, but direct links are cleaner.

Also fix pre-existing UI-label violations in files touched by this
pass (caught by scripts/check-ui-labels.py):
- pet-photographer.md (3 places): "Component or service" is the
  retired menu label; current label is "Configuration block".
- monitor/alert.md: same.
- monitor/overview.md: "notification frequency" aligned to the UI
  label "alert frequency".

Tighten the "Trigger type" rule in check-ui-labels.py to require a
UI-instruction context (Set/select/dropdown/EVENT section/field) so
table column headers and prose use of the phrase don't false-trip.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fixes 4 correctness issues and 7 enhancements from a review pass on
the vision section.

Bugs:
- configure.md: clarify that registry models ship with their own
  labels.txt (previous text implied users had to create one).
- configure.md: move GetProperties mention out of "Save" step and
  into post-verify prose. GetProperties is a code call, not a
  web-app action, so placing it under Save created a false
  expectation.
- 3d-vision/measure-depth.md: "from the camera's optical center" is
  wrong for LiDAR and ToF sensors; rephrase to name the sensor
  frame. Also change "from your camera" to "from your perception
  sensor" to cover LiDAR/ToF, and hedge "standard convention" to
  "typically follows this convention".
- object-detection/act-on-detections.md: add a "Not a safety system"
  caution box on the wrapper pattern. The example gates new motion
  at command time but does NOT interrupt motion in progress; readers
  copying the pattern for real safety would build something that
  fails in the exact scenario it is meant to protect against.

Enhancements:
- configure.md opener: name the upstream paths (registry, managed
  training, custom training script, external) so the page does not
  assume users arrived via a specific prior section.
- configure.md step 4: include camera_name in the vision service
  JSON (previously only mlmodel_name was shown).
- configure.md step 7: expand the "complete configuration" JSON to
  include the camera component, not just the two services.
- classify.md: bump weight so Classification appears before Object
  detection in the nav (classification is conceptually simpler).
- overview.md: reorder the "Where to go next" groups to match.
- measure-depth.md "What's next": add an Act on detections link.
- alert-on-detections.md: link to filter-at-the-edge tutorial
  alongside the sparse filtered-camera README.
- classify.md: link the first "transform camera" mention to its
  reference page.
- track.md: link the Hungarian algorithm mention to Wikipedia.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Addresses the two bigger reviewer items:

1. configure.md step 2 "Configure the ML model service" now shows a
   Builder tab alongside the JSON tabs. The Builder walkthrough names
   the Select model dialog, the My models / Registry tabs, the Task
   type / Framework / Visibility filters, and the Version dropdown
   (Latest vs. specific timestamp), verified against the app source.
   JSON now splits into "registry model" and "local model file" tabs
   so the two paths are visibly distinct.

2. The "Available ML model services and vision models" section moved
   out of configure.md into a new page:
   docs/vision/deploy-and-maintain/available-models.md. The new page
   has context the reviewer asked for: how to pick among the listed
   modules (read the README, check recent releases, prefer framework-
   specific services over generic triton), what the distinction is
   between ML model services, vision services, and public models,
   and a pointer back to the deploy-from-registry matching table.

The new page is weight 5 in deploy-and-maintain so it appears first
in the subsection. The subsection _index card list and overview.md's
"Deploy and maintain models" group link to it.

Removed modulescript: true from configure.md frontmatter since the
{{< mlmodels >}} shortcode moved.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
available-models.md: reword the opening "three things" list so it
correctly describes one ML model service API with multiple module
implementations and one vision service API with multiple models
(instead of pluralizing "services" in a way that implies they are
separate APIs).

how-it-works.md: rename linkTitle and title from "How the vision
service works" to "How a vision service works". A configured vision
service is an instance of one of several models, so "a" reads more
accurately than "the".

Updated cross-references in configure.md, tune.md, and overview.md
to match the new title.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The registry-search widgets on docs pages duplicate app.viam.com/registry
without adding much. Their disambiguation and guidance framing, however,
is docs-native value that the registry site doesn't provide. Reshape the
page accordingly:

- Cut resources_svc and mlmodels widgets from both the dedicated page
  and deploy-from-registry.md. Remove modulescript frontmatter from
  deploy-from-registry.md since no shortcode on the page needs it now.
- Rename the dedicated page to "What's in the Viam registry for vision":
  three-way entry taxonomy (ML model service implementations vs vision
  service models vs public ML models) plus the existing picking
  guidance (read the README, check versions, prefer framework-specific,
  verify task type). The page now sends users to app.viam.com/registry
  for the actual browse/search.
- Update link text in configure.md, deploy-from-registry.md §1, and
  overview.md's "Where to go next" to match the new title and framing.

Net effect: one page of opinions and taxonomy, not a docs-hosted second
search UI. Deploy how-to is shorter and focused on the procedure. URL
stays /vision/deploy-and-maintain/available-models/ so existing links
and aliases continue to resolve.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The base branch dropped the hidden data-ai/ and manage/ sections (PRs
viamrobotics#4931, viamrobotics#4932) and had started migrating docs/operate/reference/services/
vision/* to docs/reference/services/vision/* (viamrobotics#4924). My branch was
already at the new location.

Conflict resolution:
- docs/data-ai/_index.md, docs/data-ai/ai/_index.md: modify/delete —
  accept base's deletion. My changes were link updates from the vision
  restructure pass; moot now that the files are gone.
- docs/operate/reference/services/vision/mlmodel.md: deleted in HEAD,
  modified in base — accept my deletion. My branch has a modern
  rewrite at the new path (docs/reference/services/vision/mlmodel.md);
  the old file is stale and should not come back.
- docs/vision/object-detection/alert-on-detections.md: keep my content
  (sentence-case, colon-delimited next steps, "In the WEBHOOKS
  section" UI precision) but retarget the triggers-reference link to
  /reference/triggers/ (base's new path).
- docs/reference/apis/services/ml.md: keep my link to deploy-from-registry.
- docs/tutorials/configure/pet-photographer.md: keep my card link to
  deploy-from-registry.

Also retarget broken cross-section links to base's new paths:
- /data-ai/capture-data/capture-sync/ -> /data/capture-sync/capture-and-sync-data/
- /data-ai/train/train/ -> /train/train-a-model/
- /data-ai/ai/deploy/ in retrain.md Next steps -> /vision/deploy-and-maintain/deploy-from-registry/
(Aliases that still reference /data-ai/ paths stay in frontmatter for
inbound redirect compatibility.)

Commit bypasses check-ui-labels hook because the 29 violations it
flags are pre-existing style issues in unrelated files the base
branch brought in (tutorials, monitor, reference), none of which
this merge touched. The hook logic is tightened in a follow-up
commit to check only files modified in the commit.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Before this change, --staged mode returned every file in the index,
so a merge commit pulling in files from upstream tripped on
pre-existing style issues in content the merge author never touched.
The yesterday merge commit had to pass --no-verify because of 29
false positives from tutorials and other files the base branch
brought in untouched.

Fix: detect an in-progress merge by the presence of .git/MERGE_HEAD,
then filter the candidate list to files whose staged blob differs
from BOTH parents (HEAD and MERGE_HEAD). A file whose staged content
matches one parent is inherited unchanged from that side and is not
the merge author's work. A file whose staged content differs from
both was manually edited during conflict resolution — exactly what
the hook should check.

Non-merge commits are unaffected: MERGE_HEAD does not exist, so we
return every staged .md file as before.

Works correctly in git worktrees thanks to `git rev-parse --git-dir`
(returns the worktree's actual .git location, which is a pointer
file in a worktree — the full path is resolved before the MERGE_HEAD
existence check).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The merge brought htmltest back online against my PR. 26 link errors
across my own files and files affected by the vision restructure.

Fixes in my vision reference and how-to files:
- mlmodel reference: retarget 5 broken cross-section links
  (/data-ai/train/train/ -> /train/train-a-model/,
   /data-ai/ai/deploy/ -> /vision/deploy-and-maintain/deploy-from-registry/,
   /manage/troubleshoot/teleoperate/default-interface/ -> /monitor/default-interface/,
   /data-ai/capture-data/capture-sync/ -> /data/capture-sync/capture-and-sync-data/)
- tune.md: anchor /vision/configure/viamrobotics#6-test-from-the-control-tab ->
  /vision/configure/viamrobotics#6-verify-with-the-control-card
- retrain.md, roll-out-to-fleet.md: /fleet/fragments/ ->
  /hardware/fragments/

Fixes in files that reference vision content from elsewhere:
htmltest's IgnoreDirs config treats /operate/, /manage/, /data-ai/ as
non-existent even if Hugo generates alias redirects, so every link
to those paths is flagged broken. Updated direct link targets in 13
files (glossary stub, 7 tutorials, 3 operate reference pages,
hello-world/building, and 5 motion API generated/override includes)
to the canonical /reference/services/vision/* and
/vision/object-detection/* paths instead of the old ones.

Also fixed 14 pre-existing "Component or service" -> "Configuration
block" UI-label violations in the tutorial/operate files I was
already editing for the link fixes, since the pre-commit hook flags
them whenever a file is touched.

Local htmltest run: all 1415 documents pass.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PR viamrobotics#4938 "Motion planning + navigation: section review" restructured
motion-planning/ and navigation/ out of /operate/reference/services/
into top-level sections and updated internal links. My PR restructured
vision/ the same way on the same base. Merge collided on one file
both PRs touched: docs/operate/hello-world/building.md.

Resolution: in building.md, keep my Vision link
(/vision/object-detection/detect/#using-a-vision-service) and take
upstream's Motion + Frame system links (/motion-planning/ and
/motion-planning/frame-system/). Each PR owns its own section's
paths.

Local htmltest: 1448 documents, 0 errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ew/vision

Upstream PR viamrobotics#4939 added three alias redirects to fix the base-branch
Netlify deploy, which had been erroring since PR viamrobotics#4938 merged. My
last merge commit inherited the broken state. Pull in the fix.

Clean merge, no conflicts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@shannonbradshaw shannonbradshaw merged commit 1ac7b23 into viamrobotics:new-docs-site Apr 16, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant