Refusal ghost: part-way refusals that need a frame map or a merge first

Open
#1,015 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
48/100
Issue type
Feature
Clarity
Clearly specified
Activity status
Active
Tech stack
rust
Domain
backend

Research direction

Start with docs/decisions/871-refusal-ghost-rest.md and trace the listed call sites in raster.rs, multiaxis/rotary.rs, rotary_links.rs, generate.rs, cross_spindle.rs, and machining3d/entry.rs. Check how each path is framed and how existing tests pin ghost locations; add tests for any changed sites. Done means each site returns a correctly mapped partial path or has its reason recorded in a decision file, with successful output goldens unchanged.

Written by the indexing model from the issue text.

Description

area:2d area:ui effort:high P2 source:agent

Follow-up to #871 (refusal ghost for part-way refusals). The #871 PR adopted the ghost where the moves are in hand and the frame is already mapped to world by run_job. The remaining part-way refusals each need a frame map or a merge first, so they were listed in docs/decisions/871-refusal-ghost-rest.md rather than swept:

  • finishing3d raster / rings / swarf (raster.rs parallel, rings_and_tail, swarf_multi): Rotary contour and parallel run these on frame-LOCAL facets (multiaxis/rotary.rs calls of finishing3d::waterline / swarf). First add .map_err(GenError::without_ghost) (or a to_world map) at those rotary calls, then adopt with_ghost_moves(b.moves()).
  • Rotary links and posing (rotary_links.rs radial_relink, rotary.rs posed): rotary-local frame. Needs f.to_world plus the tip offset.
  • Face under an area turn (generate.rs turn_path(face_over(..)?, -turn)): the refusal's spot (already today) and any ghost are in the turned frame. Map the spot and ghost back through turn_path(-turn).
  • Cross drill app-side laws (cross_spindle.rs rapids_clear, cross_holder on the spindle-shifted t): carry the ghost by the same shift in_world uses.
  • Nested refusals (machining3d/entry.rs pocket3d_air_split material leg, run_rest rest ladder; generate.rs stitched contour runs): the inner refusal already carries its own ghost and with_ghost keeps it. Prepend the outer moves to it, which needs a small Ghost merge.
  • Multiaxis stamp / swarf link / curve walk, the rotary gate, the fixture route: these are one-liners, but each needs its frame checked (posed or unposed world).

Done means: each site above either hands back its partial path in world coordinates (pinned by a test that its ghost lands where the part is) or is listed in a decision file with the reason. No generator's successful output changes, so goldens stay byte-identical.

Effort is high because it touches generator code (safety floor), even though the change is display-only.

Part of #261 (follow-up to #871).

Dominant language
Rust
Stars
8
Forks
11
Avg merge
5h 22m
Merged PRs (30d)
409

Getting set up

This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from NeoTech/Camcraft

All issues in NeoTech/Camcraft

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.