Debian Package Tracker
Register | Log in
Subscribe

linuxcnc

Choose email to subscribe with

general
  • source: linuxcnc (main)
  • version: 1:2.9.9-2
  • maintainer: LinuxCNC Developers (DMD)
  • uploaders: Petter Reinholdtsen [DMD] – Sebastian Kuzminsky [DMD] – Jeff Epler [DMD] – Andy Pugh [DMD]
  • arch: all any
  • std-ver: 4.7.4
  • VCS: Git (Browse, QA)
versions [more versions can be listed by madison] [old versions available from snapshot.debian.org]
[pool directory]
  • oldstable: 2.9.0~pre1+git20230208.f1270d6ed7-1+deb12u2
  • old-p-u: 2.9.0~pre1+git20230208.f1270d6ed7-1+deb12u2
  • stable: 1:2.9.4-2+deb13u1
  • unstable: 1:2.9.9-2
versioned links
  • 2.9.0~pre1+git20230208.f1270d6ed7-1+deb12u2: [.dsc, use dget on this link to retrieve source package] [changelog] [copyright] [rules] [control]
  • 1:2.9.4-2+deb13u1: [.dsc, use dget on this link to retrieve source package] [changelog] [copyright] [rules] [control]
  • 1:2.9.9-2: [.dsc, use dget on this link to retrieve source package] [changelog] [copyright] [rules] [control]
binaries
  • linuxcnc-doc-de
  • linuxcnc-doc-en
  • linuxcnc-doc-es
  • linuxcnc-doc-fr
  • linuxcnc-doc-zh-cn
  • linuxcnc-uspace (3 bugs: 1, 1, 1, 0)
  • linuxcnc-uspace-dev
action needed
Debci reports failed tests high
  • unstable: fail (log)
    The tests ran in 0:04:28
    Last run: 2026-08-13T03:20:58.000Z
    Previous status: unknown

  • testing: fail (log)
    The tests ran in 0:00:18
    Last run: 2026-01-31T13:46:36.000Z
    Previous status: unknown

  • stable: pass (log)
    The tests ran in 0:01:33
    Last run: 2026-07-15T20:01:47.000Z
    Previous status: unknown

Created: 2026-01-31 Last update: 2026-09-14 09:30
A new upstream version is available: 2.9.10 high
A new upstream version 2.9.10 is available, you should consider packaging it.
Created: 2026-07-03 Last update: 2026-09-14 09:00
lintian reports 1 error and 55 warnings high
Lintian reports 1 error and 55 warnings about this package. You should make the package lintian clean getting rid of them.
Created: 2026-06-30 Last update: 2026-06-30 09:17
version in VCS is newer than in repository, is it time to upload? normal
vcswatch reports that this package seems to have a new changelog entry (version 1:2.10.0~pre1, distribution UNRELEASED) and new commits in its VCS. You should consider whether it's time to make an upload.

Here are the relevant commit messages:
commit 6136221d1b3a908f5be12ca4fef5a3f178ae0439
Author: Rene Hopf <renehopf@mac.com>
Date:   Sun Sep 13 19:25:33 2026 +0200

    fix encoder test syntax

commit adbc11f244e9c0bdf17ac4a5b435c1673a6938db
Author: Rene Hopf <renehopf@mac.com>
Date:   Sun Sep 13 18:58:52 2026 +0200

    add abs encoder test

commit 552f1d4f041f8a851be3091a4a284d9466580b61
Merge: f5aeb26a dd394d90
Author: BsAtHome <bertho@vagrearg.org>
Date:   Sun Sep 13 15:50:49 2026 +0200

    Merge pull request #4513 from grandixximo/rtai-driver-deprecate
    
    Remove the RTAI-kernel-only hardware drivers

commit f5aeb26a1793f9ae9c62081fd16352b26b9567cf
Merge: e63cf163 bd51c0d3
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Sep 13 09:26:14 2026 -0400

    Merge pull request #4414 from grandixximo/g121-kins
    
    G12.1, G13.1: select the kinematics type from G-code

commit dd394d90d0ac531b4a95c86e1b80817069244df3
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Sep 13 20:20:15 2026 +0800

    Remove the RTAI-kernel-only hardware drivers
    
    These drivers only ever built for RTAI kernels and were excluded from
    uspace builds since 2014, so no current install could load them:
    
      hal_stg, hal_motenc, hal_vti, hal_evoreg, hal_tiro, hal_ax5214h,
      opto_ac5, pci_8255, pcl720, pluto_servo, pluto_step
    
    All serve early-2000s ISA/PCI/parport cards.  A poll on the forum and
    emc-developers found zero users with the hardware, Vital Systems
    reports no Motenc cards remaining and none known in use, and no
    testers are available, so a uspace port cannot be validated either.
    At the weekly meeting the decision was to remove them outright rather
    than deprecate.
    
    Also remove hal_skeleton (a kbuild-era code template), the now unused
    rbf2h.py firmware header generator, the pluto firmware trees
    (unbuildable without an ancient Quartus), and the sample configs for
    these cards (by_interface/pluto, servotogo, vigilant, vitalsystems,
    by_machine/boss, attic/demo_mazak).
    
    Driver docs, man pages, component-list rows and po4a masters go with
    the drivers.

commit e63cf163cec1462bd88446577958e1179e136e1d
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Sep 13 20:58:13 2026 +0800

    build: tighten the depclean and modclean comments
    
    Follow-up to #4419: same content in fewer words. State where dependency files live under each BUILD_SYS, why removing them forces no recompilation, what stale .d files do to the build, and why the recipe is a find rather than $(RM) $(DEPS) $(RTDEPS).

commit 7b29e9c33b6e78ae34731e4532d801d107c04ac8
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Tue Sep 8 20:34:44 2026 +0800

    build: wipe generated manpage tree on clean
    
    GENERATED_MANPAGES depends on BUILD_SYS, so removing manpages by list
    leaves stale files behind on uspace trees (e.g. the kbuild-only driver
    manpages pluto_servo.9, pluto_step.9, pcl720.9).  gen_complist.py then
    picks up the stale files and generates links to manpages the current
    build configuration cannot produce, making local doc builds diverge
    from CI.
    
    Everything under docs/build/man is generated (halcompile output,
    asciidoctor output from docs/src/man, alias pages, translations), so
    wipe the whole tree in both clean-manpages and genclean.

commit 5c7ac76b2dbd6a9d1e098cb7911a3fc7b6a00d1c
Merge: 0649d32a c3e266fc
Author: BsAtHome <bertho@vagrearg.org>
Date:   Sun Sep 13 12:32:18 2026 +0200

    Merge pull request #4419 from greatEndian/fix/depclean-userspace-deps
    
    build: make depclean remove the userspace dependency files too

commit 0649d32a987cd1f60ede1be77f9b1135a4944f7c
Merge: d400df7f 88e1e025
Author: BsAtHome <bertho@vagrearg.org>
Date:   Sun Sep 13 12:32:05 2026 +0200

    Merge pull request #4418 from greatEndian/fix/axis-jog-increment-units
    
    axis: jog increments follow the selected axis type (degrees vs linear)

commit d400df7f3f1302cb55fc06c84c1c98976c0253fc
Merge: 24fd9146 6e97ff0e
Author: BsAtHome <bertho@vagrearg.org>
Date:   Sun Sep 13 12:22:22 2026 +0200

    Merge pull request #4515 from grandixximo/tap-comp
    
    hal: add tap component, UI override for bit outputs

commit 24fd9146ef13f77f469681a12e8edab7284f3807
Merge: e1b2897e 37b61f5e
Author: BsAtHome <bertho@vagrearg.org>
Date:   Sun Sep 13 12:14:49 2026 +0200

    Merge pull request #4441 from grandixximo/g33-sync-fixes
    
    Fix spindle position-sync jitter and catch infeasible thread pitches

commit e1b2897e4520ee53eb8ef511773b6b2231bd11ea
Merge: dc1b0e24 2ad450b9
Author: BsAtHome <bertho@vagrearg.org>
Date:   Sun Sep 13 12:14:16 2026 +0200

    Merge pull request #4476 from alex-pres/pr-gremlin-draw-workpiece
    
    preview: draw stock outlines from (WORKPIECE,...) comments

commit bd51c0d31396b500e3bd4e9ce628384417da25cb
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Sep 12 20:11:00 2026 +0800

    docs: G12.1 and G13.1 select the kinematics from G-code
    
    The G-code reference gains G12.1 and G13.1, the switchkins chapter
    describes the type declaration (switchkinsDeclare with
    KINSTYPE_IDENTITY and KINSTYPE_PRIMARY, G13.1 resolving identity
    from it) and leads with the deprecation notice for
    motion.switchkins-type instead of offering the pin as an equal way
    to switch.  The motion man page follows.

commit a60a24b2618dc6791838122132625d7b9bee2a6f
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Sep 12 20:10:48 2026 +0800

    tests: selecting a kinematics from G-code
    
    The machine stands in a pose the two kinematics disagree about,
    which is the only place the codes can be tested: a switch between
    kinematics that agree proves nothing.  From there the test runs a
    program in AUTO, where the interpreter reads far ahead of the
    machine, and asks for a move along the one axis identity
    kinematics carries on its own joint.  Every other joint has to
    hold, and the kinematics number has to reach the motion controller
    and come back to the program.
    
    It also puts G13.1 in an ON_ABORT_COMMAND routine.  Such a routine
    is run by a single execute() call that cannot service a queue
    synchronisation point, so the switch has to leave one out there
    and let the rest of the routine run.  The routine ends with G54,
    so the test leaves the machine in G55 and looks at which one comes
    back.
    
    The test module (5axiskins without identityfirst) has identity at
    type 1, so G13.1 ends the program in type 1 and the program puts
    the working kinematics back with G12.1 P0 by number.  It selects
    its starting kinematics explicitly: with G13.1 in the abort
    routine, an estop reset already leaves the machine in identity, so
    a program that assumes the boot kinematics proves nothing.  The
    check that the two kinematics disagree compares against the
    programmed point rather than the live position readout.

commit 81020666a0cbe27578a5d0265d79d48589d78779
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Sep 12 20:10:22 2026 +0800

    configs: select kinematics with G12.1 in the switchkins sims
    
    The switchkins sim configs chose their kinematics by writing
    motion.switchkins-type through an analog output, the route motion
    has just deprecated.  The M428, M429 and M430 remaps, the TWP
    wrappers behind G53.1, G53.3, G53.6 and G69, the abort handler
    and remap.py now use G12.1 and G13.1.  That drops the M66 sync
    either side of every switch, the test that the HAL pin exists at
    all, and the #5399 clobber each M66 costs, since G12.1 and G13.1
    synchronise interpreter and motion themselves.
    
    On pumakins, scarakins, genhexkins, genserkins and three21kins the
    identity kinematics is type 1, so the M428 remaps there select the
    module's working kinematics with G12.1 P#<kinstype> instead of
    assuming type 0.  The trsrn vismach guis and the halshow watch
    lists follow motion.kins-type.

commit 0b09aebe1a8b60eeef07244f0ca6b0906799ddda
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Sep 12 20:09:35 2026 +0800

    motion: deprecate selecting the kinematics type from HAL
    
    motion.switchkins-type cannot be the general way to choose
    kinematics.  The interpreter never sees it, so a program is read,
    its limits checked and its path looked ahead in whatever
    kinematics the interpreter last knew about, which need not be the
    one that ends up running it.  Nothing in the pin can fix that; the
    interpreter has to be told, which is what G12.1 and G13.1 are for.
    
    Motion says so once per session, the first time the pin is used to
    change the type.  A configuration that never switches never sees
    it, and the G-code route never triggers it.  The pin keeps
    working; it is meant to go.
    
    The selection's names now describe what they hold:
    
      adjustKinsVar0              -> switchkins_type, an int
      kinsType ('r'/'s' toggle)   -> switchkins_seq, a counter
    
    and the traj-prefixed status fields move into EMC_TRAJ_STAT where
    they belong.

commit 57850283e984d6a3942eb67bce06654ffe45f6b1
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Sep 12 20:07:52 2026 +0800

    G12.1, G13.1: select kinematics from G-code
    
    G12.1 P- selects one of the kinematics offered by a switchable
    module, G13.1 cancels to the type the module declares as identity.
    Both are queue synchronisation points, so no motion is planned in
    one kinematics and executed in another.  A cancel lands in the
    state that always solves, like G49 or G69, not in whatever happens
    to be numbered zero.
    
    A switchable module that declares no identity type refuses G13.1
    with an error pointing at the switchkins documentation and goes on
    taking G12.1 P- by number; a P word naming a type the module does
    not provide is a read-time error rather than a mid-program motion
    abort.  Where no kinematics is attached (sai, the preview) both
    codes fall back to type 0.
    
    Until now the only way to switch from a program was to write
    motion.switchkins-type through an analog output and force a sync
    by hand, typically M68 E3 Q1 followed by M66 E0 L0, wrapped in a
    subroutine or a remapped M-code.  Motion takes the G-code request
    and the pin on their edges, so whichever asked most recently wins.
    motion.kins-type reports the selection in force.
    
    Nothing cancels the selection implicitly.  It survives program end
    and abort so the kinematics keeps matching the position readout,
    since switching re-derives world position from the joints.  To put
    back a caller's selection:
    
        #<saved> = #<_kins_type>
        G12.1 P2
        ( ... )
        G12.1 P#<saved>
    
    #<_kins_type> reads back from motion on every synch, so it stays
    right across an abort, which drops a queued switch, and across a
    switch made from HAL behind the interpreter's back.  Status has a
    single writer: motion, which records the type only once the module
    confirms the switch, so a refused type leaves the pin, the status
    and #<_kins_type> on the kinematics still running, and names the
    refusal to the operator.
    
    Q was parsed and carried to motion without anything reading it, so
    it is gone.
    
    EMC_ADJUST_KINS_OFFSET_DATA is registered in the NML format and
    name tables and has the update() its declaration promised, without
    which the message could not cross the channel.

commit e6e928b8d7897275af6f3472a412888df5d7b62e
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Sep 12 20:03:28 2026 +0800

    kinematics: a switchkins module declares what each type is
    
    A kinematics number says nothing about what the kinematics IS.
    Give the module a way to say it: switchkinsDeclare(ktype, flags)
    from switchkinsSetup(), with KINSTYPE_IDENTITY and
    KINSTYPE_PRIMARY from kinematics.h.  A module that declares
    nothing keeps working, its types numeric-only.
    
    The declarations are static once loaded, so they travel to the
    interpreter through the status channel: motion copies
    kinematicsTypeFlags() into emcmotStatus at load, task mirrors them
    into EMC_TRAJ_STAT, and a GET_EXTERNAL_KINS_TYPE_FLAGS() canon
    accessor reads them there.  -1 marks a type the module does not
    provide, and the stat buffer initializes to that, so before the
    first status lands the answer is "unknown", not "declared
    nothing".
    
    Declaring a type the module does not provide, or declaring two
    identity types, fails the module load.
    
    The in-tree modules declare their types next to the function
    tables they describe.  The trt modules and 5axiskins follow their
    identityfirst sparm, so the declaration tracks the layout the
    config actually gets.  The hand-rolled switchable comps (the two
    trsrn, the tdr and millturn) answer kinematicsTypeFlags()
    directly, the way they answer kinematicsSwitchable().

commit dc1b0e24020dfe0df8a2a3c51ddc4a1024111368
Merge: 7804865c f6a15084
Author: BsAtHome <bertho@vagrearg.org>
Date:   Sun Sep 13 11:50:20 2026 +0200

    Merge pull request #4416 from grandixximo/g53-rotary-tool-offset
    
    rs274ngc: back the rotary tool offset out of machine coordinates

commit 7804865c35d176f9ae143a6d25cbba640674eb86
Merge: f35f8a5b 39d821c6
Author: BsAtHome <bertho@vagrearg.org>
Date:   Sun Sep 13 11:38:22 2026 +0200

    Merge pull request #4455 from grandixximo/kins-tool-frame
    
    kinematics: let a module report where the tool points

commit f35f8a5bc188c878b6a17e327d002ae10c4bd5d8
Merge: 80c120a0 f6c371c0
Author: BsAtHome <bertho@vagrearg.org>
Date:   Sun Sep 13 11:12:47 2026 +0200

    Merge pull request #4431 from grandixximo/kins-tool-offset
    
    5axiskins, maxkins: take the tool length through a pin like every other rotary module

commit 80c120a065cb857ad7d5d655709b3f9094e88cfe
Merge: b26ce954 d7935fd9
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Sep 13 04:41:13 2026 -0400

    Merge pull request #4343 from Sigma1912/Orient_Add-modes-with-index
    
    Orient.comp: Add modes with preceding homing to index

commit b26ce9544fdb29179054ead942695abf36376163
Merge: 9e46ff87 85fe1de8
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Sep 13 04:11:51 2026 -0400

    Merge pull request #4487 from grandixximo/g7x-flipflop
    
    interp_g7x: make the G7x roughing cycle independent of rounding

commit 9e46ff870139c2ec4f19f5bd58cba65906d0e329
Author: Greg Carl <26096779+snowgoer540@users.noreply.github.com>
Date:   Sat Sep 12 18:25:21 2026 -0400

    qtplasmac: fix cut recovery bug
    
    Fix cut recovery bug caused by trimming too much fat in commit 8862c57. Also addresses removed user buttons not being disabled, some interlocking template issues, and fixed the user manual URLs that were affected by recent doc URL structure changes.

commit bd7fb6c8d2cdb195c9929ddf587b785e5ca5685a
Merge: a693052b edb3f29d
Author: andypugh <andy@bodgesoc.org>
Date:   Sat Sep 12 20:52:41 2026 +0100

    Merge pull request #4520 from 85vmh/add_test_for_pr_4031_issue_3675
    
    Added tests that cover aborting a pending tool prepare or tool change

commit edb3f29d5e34bd25e1c1e96e2373d73004afaac5
Author: 85vmh <vasimihalca@gmail.com>
Date:   Sat Sep 12 21:23:04 2026 +0200

    tests: cover aborting a pending tool prepare or tool change
    
    The problem
    -----------
    Commit 764655eb4d moved IO handling out of the separate iocontrol process and
    into Task. The old NML dispatcher set RCS_DONE by default for every command it
    handled; the in-process emcIoAbort() did not, so EMC_TOOL_ABORT dropped the
    tool-change and tool-prepare output pins but left emcioStatus.status at the
    RCS_EXEC that emcToolPrepare()/emcToolLoad() had set.
    
    Nothing could clear it afterwards. read_tool_inputs() only reports completion
    while the corresponding output pin is still high, and the abort had just
    lowered it, so the handshake it waits for could never be observed. Because the
    MDI, auto and state-restore paths in emctaskmain gate on io.status == RCS_DONE,
    aborting while a tool change was pending wedged task: no further MDI command or
    program run would start, and the machine had to be restarted.
    
    The fix
    -------
    Fixed in commit 990cb293bd, "task: set io.status=DONE on emcIoAbort to unblock
    tool-change abort" (PR #4031, closes issue #3675), which sets
    emcioStatus.status back to RCS_DONE in Task::emcIoAbort().
    
    That fix landed without a regression test. This commit adds one; it contains no
    functional change.
    
    What the test covers
    --------------------
    tests/toolchanger/abort-during-change drives a sim machine whose tool-prepare
    and tool-change handshake pins are brought out to the test itself rather than
    looped back, so the test can leave a change pending for as long as it likes and
    abort in the middle of it. It checks four things:
    
      - a complete T1 M6 works, so the rest of the run starts from a known state;
    
      - aborting while tool PREPARE is pending returns the machine to RCS_DONE, the
        tool in the spindle is unchanged, and MDI still runs -- proving task is not
        stuck in WAITING_FOR_IO;
    
      - aborting while tool CHANGE is pending does the same. The tool in the spindle
        is asserted to be the *old* one: satisfying the status check by pretending
        the change completed would pass the RCS_DONE assertion but fail here;
    
      - a full tool change still succeeds after both aborts, so the abort path does
        not leave the tool-change state machine unusable.
    
    The test fails against a tree with the emcIoAbort() line from 990cb293bd removed
    and passes with it, and the surrounding tests/toolchanger tests are unaffected.
    
    The layout follows the existing tests/toolchanger/m61 test; mod_core_sim.hal and
    postgui.hal are that test's files unchanged.
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

commit a693052b3d8ce6f3c2c73a5704958c87cd3e7781
Author: Rene Hopf <renehopf@mac.com>
Date:   Sat Sep 12 19:07:34 2026 +0200

    fix gmoccapy jog pin

commit 5622d3f98a0599d9e4c964c9fca4aaaf6682541e
Author: Rene Hopf <renehopf@mac.com>
Date:   Sat Sep 12 18:55:10 2026 +0200

    fix type of motion doc

commit 6e97ff0e7779fb548e4cb193418a16eea7757fc3
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Sep 12 21:37:48 2026 +0800

    hal: add tap component
    
    tap sits between a HAL boolean signal (typically driven by HAL logic or
    by G-code digital outputs such as M64/M65) and the output it controls.
    Edges on the in pin pass the HAL logic state through to out and mirror
    it to the io pin, so a UI always shows the current state. A UI can
    force the output on or off via the io pin without MDI; the next edge
    of in hands control back to the HAL logic.
    
    Pins use the new bool API. The io edge is tested first so a UI
    override is not immediately overwritten by the in handler mirroring
    to io; a simultaneous in edge is consumed, io wins the tie.
    
    Includes the extracted manpage documentation, a components.adoc
    entry, and a tests/tap.0 regression test (test.hal driven, using
    hal.set_p/hal.get_p and threadbeat-synchronized waits).

commit f325d51f52da7d5e0e227ac35e3672ee6f873b4f
Merge: 9138e20e c82f7278
Author: BsAtHome <bertho@vagrearg.org>
Date:   Sat Sep 12 14:46:25 2026 +0200

    Merge pull request #4516 from Sigma1912/Vismach-Fix-Track
    
    Fix: vismach.py, fix valueError and recurrant message in Track()

commit c82f7278f0d4ce179b32444c38bbab18a8734f13
Author: david mueller <mueller_david@hotmail.com>
Date:   Fri Sep 11 19:57:00 2026 +0200

    Fix: vismach.py, fix valueError and recurrant message in Track()
    
    - Stop printing message on every cycle while waiting for the scene
    - Check length of array instead of comparing to an empty list

commit 9138e20e58da5cf16e50ef603f19dada87b99ba8
Merge: 432561ec 467684c2
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Thu Sep 10 19:57:02 2026 -0400

    Merge pull request #4512 from weblate/weblate-linuxcnc-linuxcnc-docs
    
    Translations update from Hosted Weblate

commit 432561eca28d7fe72eef17541945f1e8b0c3c2e8
Merge: e646ce0a 2ed0aaea
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Thu Sep 10 19:42:39 2026 -0400

    Merge pull request #4511 from weblate/weblate-linuxcnc-linuxcnc
    
    Translations update from Hosted Weblate

commit 467684c272ac151534f6015c7b3d5b7b4f2adea9
Author: Américo Monteiro <a_monteiro@gmx.com>
Date:   Fri Sep 11 01:07:32 2026 +0200

    Translated using Weblate (Portuguese)
    
    Currently translated at 34.1% (11614 of 33994 strings)
    Author: Américo Monteiro <a_monteiro@gmx.com>
    
    Co-authored-by: Américo Monteiro <a_monteiro@gmx.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/pt/
    Translation: LinuxCNC/LinuxCNC Documentation

commit 2ed0aaeaae4977560c2b7b9233b31d1627760823
Author: Daniel Nylander <yeagersthlm@gmail.com>
Date:   Fri Sep 11 01:07:32 2026 +0200

    Translated using Weblate (Swedish)
    
    Currently translated at 100.0% (420 of 420 strings)
    
    Co-authored-by: Daniel Nylander <yeagersthlm@gmail.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/gmocappy/sv/
    Translation: LinuxCNC/LinuxCNC/Gmocappy

commit 46a21c8e0795b0909a125c9a01a936a677ba5003
Author: Salvador Peña <salvadorp74@hotmail.com>
Date:   Fri Sep 11 01:07:31 2026 +0200

    Translated using Weblate (Spanish)
    
    Currently translated at 35.9% (12218 of 33994 strings)
    Author: Salvador Peña <salvadorp74@hotmail.com>
    
    Translated using Weblate (Spanish)
    
    Currently translated at 35.9% (12218 of 33994 strings)
    Author: Salvador Peña <salvadorp74@hotmail.com>
    
    Translated using Weblate (Spanish)
    
    Currently translated at 35.9% (12215 of 33994 strings)
    Author: Salvador Peña <salvadorp74@hotmail.com>
    
    Co-authored-by: Salvador Peña <salvadorp74@hotmail.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/es/
    Translation: LinuxCNC/LinuxCNC Documentation

commit e646ce0ad8b5f0c7024b25cad63537a0609a2787
Merge: 64efb28c 4d4124ae
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Wed Sep 9 18:24:57 2026 -0400

    Merge pull request #4509 from weblate/weblate-linuxcnc-linuxcnc-docs
    
    Translations update from Hosted Weblate

commit 4d4124ae4800d60d234459a81e5162c8eb6b4ac5
Author: Salvador Peña <salvadorp74@hotmail.com>
Date:   Wed Sep 9 18:02:15 2026 +0200

    Translated using Weblate (Spanish)
    
    Currently translated at 35.4% (12037 of 33994 strings)
    Author: Salvador Peña <salvadorp74@hotmail.com>
    
    Co-authored-by: Salvador Peña <salvadorp74@hotmail.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/es/
    Translation: LinuxCNC/LinuxCNC Documentation

commit 767740f3015ffda42801551280f16eccbee9c924
Author: Luca Toniolo <toniolo.luca@outlook.com>
Date:   Wed Sep 9 18:02:14 2026 +0200

    Translated using Weblate (Ukrainian)
    
    Currently translated at 99.6% (33879 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (German)
    
    Currently translated at 99.6% (33891 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (French)
    
    Currently translated at 2.4% (828 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Spanish)
    
    Currently translated at 35.4% (12037 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Co-authored-by: Luca Toniolo <toniolo.luca@outlook.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/de/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/es/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/fr/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/uk/
    Translation: LinuxCNC/LinuxCNC Documentation

commit 64efb28cd77a16b45ade81e576c784cdc574f40e
Merge: a1d46dbe be5cf546
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Tue Sep 8 02:11:09 2026 -0400

    Merge pull request #4506 from grandixximo/gmoccapy-early-sigterm
    
    gmoccapy: arm a minimal SIGTERM handler before the slow startup phase

commit be5cf546e28e6fd7d4022cbf6c4c586e4237346b
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Tue Sep 8 13:36:32 2026 +0800

    gmoccapy: arm a minimal SIGTERM handler before the slow startup phase
    
    699af8e5ae arms the full SIGTERM/SIGINT handler only right before
    Gtk.main(). A shutdown SIGTERM landing earlier, during the imports or
    app construction, hits the default disposition and kills the process
    mid-startup: no SystemExit unwind, so the atexit child cleanup and the
    _hal Py_AtExit hook never run. On a loaded machine this window
    stretches past task startup, so real shutdowns and the ui-smoke
    gmoccapy-quit driver can land SIGTERM in it.
    
    Install a minimal handler that exits through SystemExit as the first
    action of the script; the full handler replaces it when installed.
    Verified locally: SIGTERM in the import window now exits 0 with a
    clean linuxcnc shutdown, where the unpatched script died with 143.

commit c3e266fc6d317fc0413a755ca28360c2f0875ec5
Author: greatEndian <chabron94@gmail.com>
Date:   Wed Aug 19 10:12:36 2026 -0400

    build: make depclean remove the userspace dependency files too
    
    depclean removed only 'depends'.  Under BUILD_SYS=normal that directory
    holds the realtime dependency files; under the default BUILD_SYS=uspace
    'depends' is never created at all.  Every other dependency file is
    written next to its object as objects/**/*.d -- realtime included on a
    uspace build -- and depclean never touched them.  On the default build
    that made depclean a complete no-op: it rm -rf'd a directory that never
    existed.
    
    That matters when a source file is renamed or moved.  A stale dependency
    file still declares, say
    
        objects/hal/utils/halrmt.o: hal/utils/halrmt.c
    
    and gcc's -MP writes dummy targets for the *headers* only, never for the
    main source, so once hal/utils/halrmt.c is gone nothing can satisfy that
    prerequisite and the whole build stops with
    
        make: *** No rule to make target 'hal/utils/halrmt.c',
        needed by 'objects/hal/utils/halrmt.o'.  Stop.
    
    The obvious remedy is 'make depclean', and it did not help: the only way
    out was 'make clean' and a full rebuild.  Hit in practice on a
    run-in-place tree carried across the halrmt.c -> halrmt.cc rename and the
    src/libnml/posemath -> src/libposemath move; eight dependency files
    pointed at sources that no longer existed.
    
    Removing the files costs no recompilation -- nothing has a .d as a
    prerequisite, and UNREAD_DEPS is computed but never used -- so this only
    gives up header-dependency tracking until each object is next rebuilt,
    which is what asking for depclean means.
    
    The comment above modclean is corrected as well: 'clean' does remove the
    dependency files today, because genclean deletes objects/ wholesale.

commit a1d46dbeaaa03ed15f447139418414f1179bd3ac
Merge: 76156126 ed8c87a2
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Mon Sep 7 07:16:42 2026 -0400

    Merge pull request #4420 from greatEndian/fix/ruckig-log-flood
    
    tp: rate-limit Ruckig plan-failure logging to once per segment

commit ed8c87a29b98752ba26f4d02a0122e7ab9d182ce
Author: greatEndian <chabron94@gmail.com>
Date:   Fri Jun 26 10:28:10 2026 -0400

    tp: rate-limit Ruckig plan-failure logging to once per segment
    
    A segment whose inputs Ruckig can never solve keeps ruckig_planned=0,
    so tpCalculateSCurveAccel re-enters its failure branch every servo
    cycle and logs at the full servo rate (e.g. 1kHz). Motion is
    unaffected (it falls back to trapezoidal), but over a long run this
    floods the kernel log / journald with GBs of identical records.
    
    Add per-segment "already logged" flags to TC_STRUCT (reset by tcInit
    on every new segment) and log each failure once, tagged with the
    segment id. Not re-armed on a later success within the same segment,
    so an oscillating fail/succeed segment also cannot flood. No change to
    motion behaviour. master's own tpCalculateSCurveAccel already carries a
    scurve_jerk_warned once-only guard for the adjacent warning.
    
    tpCalculateSCurveAccel has five distinct Ruckig failure sites, each
    retried every servo cycle:
    
    - pool acquire: ruckig_planner stays NULL and is re-acquired next cycle
      for as long as the preallocated pool is exhausted;
    - velocity control, replan failed: keeps the previous trajectory and
      falls straight back in on the next cycle;
    - velocity control, first attempt failed: returns
      TP_SCURVE_ACCEL_ERROR, which only makes the caller use trapezoidal
      for that one cycle before calling back in;
    - position control, replan failed / first attempt failed: the same two
      cases on the position-control path.
    
    Each site gets its own flag rather than one shared flag, so a segment
    that hits more than one failure mode (e.g. pool-acquire, then a plan
    failure once a planner frees up) still logs each mode once. A single
    shared flag would report only whichever fired first.
    
    The first-attempt position-control ERR dump also regains plan_result,
    which was previously only on the replan branch, so the give-up path
    again shows which limit Ruckig objected to. The velocity-control
    first-attempt warning carries it too, for symmetry.

commit 76156126d8b12985eeb1cc70ae0215d6fa5f7233
Merge: 14d739aa 63532ab1
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Sep 6 21:50:02 2026 -0400

    Merge pull request #4504 from weblate/weblate-linuxcnc-linuxcnc-docs
    
    Translations update from Hosted Weblate

commit 63532ab13ed98e60085ae7da2e83f1c7d1e0550f
Author: Américo Monteiro <a_monteiro@gmx.com>
Date:   Mon Sep 7 02:52:54 2026 +0200

    Translated using Weblate (Portuguese)
    
    Currently translated at 34.1% (11595 of 33994 strings)
    Author: Américo Monteiro <a_monteiro@gmx.com>
    
    Co-authored-by: Américo Monteiro <a_monteiro@gmx.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/pt/
    Translation: LinuxCNC/LinuxCNC Documentation

commit e09b576d161818fa302877646c370271a7ed3359
Author: Salvador Peña <salvadorp74@hotmail.com>
Date:   Mon Sep 7 02:52:52 2026 +0200

    Translated using Weblate (Spanish)
    
    Currently translated at 35.3% (12022 of 33994 strings)
    Author: Salvador Peña <salvadorp74@hotmail.com>
    
    Co-authored-by: Salvador Peña <salvadorp74@hotmail.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/es/
    Translation: LinuxCNC/LinuxCNC Documentation

commit ade964b269d4120284b0e305eff3f907f0f75dbf
Author: Luca Toniolo <toniolo.luca@outlook.com>
Date:   Mon Sep 7 02:52:49 2026 +0200

    Translated using Weblate (Tamil)
    
    Currently translated at 81.4% (27689 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Portuguese)
    
    Currently translated at 34.1% (11595 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Ukrainian)
    
    Currently translated at 99.6% (33879 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Russian)
    
    Currently translated at 34.3% (11669 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (German)
    
    Currently translated at 99.6% (33891 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Chinese (Simplified Han script))
    
    Currently translated at 1.3% (450 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Norwegian Bokmål)
    
    Currently translated at 4.4% (1503 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (French)
    
    Currently translated at 2.4% (827 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Spanish)
    
    Currently translated at 35.3% (12022 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Co-authored-by: Luca Toniolo <toniolo.luca@outlook.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/de/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/es/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/fr/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/nb_NO/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/pt/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/ru/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/ta/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/uk/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/zh_Hans/
    Translation: LinuxCNC/LinuxCNC Documentation

commit 14d739aa99587b1c467640c5907ed806936cf475
Author: Cmorley <chrisinnanaimo@hotmail.com>
Date:   Sat Sep 5 19:03:13 2026 -0700

    qtvcp -3pcenter panel: update for small improvements
    
    Better feedback text, better goto position path.
    MarkoPolo

commit 39d821c64f2a0ec37c1f534abfc8ea94250e5116
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Fri Sep 4 19:14:49 2026 +1000

    kinematics: take the tool frame inverse request as a program writes it
    
    The search solves to a residual of 1e-18, and a direction written to six digits is a unit vector only to 1e-7, so a request copied from a program was reported unreachable. Normalise the axis on the way in, and take the component along it off the requested tool x, refusing only a zero vector or a tool x within a millionth of a radian of the axis, since neither describes a frame.

commit 6f45f6a7b973d54f8fe1bc6e2bddaaa1bbc9a02c
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Fri Sep 4 19:14:39 2026 +1000

    kinematics: let the caller hold joints in the tool frame inverse
    
    A rotary table turns the tool against the work as surely as a head rotary does, so on a machine with a table and a two axis head the solver had three orientation joints and a bare tool axis left a family, of which it reported the member nearest the seed; asked for tool x as well it turned the table to place it and reported no spin. The tilted work plane remap does the opposite: it holds the table, orients the head and applies the spin as the virtual rotation. Neither is wrong, and which is wanted is a machining decision; Heidenhain names the axes a tilt may use with M138 and lets PLANE choose TABLE ROT or COORD ROT.
    
    So the request names the joints to hold, a bit per joint, zero for none. A held joint keeps its seed value and the request is solved with the rest. Holding the table gives the two head solutions and the spin that finishes the frame, which is what the remap computes.

commit 3524f95228c92a52eab648e436603595a420167d
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Fri Sep 4 19:11:47 2026 +1000

    kinematics: the tool frame is the joints' alone
    
    The header said that a module applying a virtual rotation about the tool axis reports a frame that includes it. No module does, and none should: the rotation is a rotation of the coordinate system, not of the machine, which is where Heidenhain's COORD ROT, Fanuc's feature coordinate system and Siemens' swivel frame keep it. Reporting the joints alone also keeps the orientation inverse honest, since the turn it reports about the tool axis is then the value to apply and not a difference from whatever is applied already.
    
    Found by putting the two trsrn components next to the tilted work plane python: the frames agree exactly at zero virtual rotation and differ by exactly Rz(pre-rot) otherwise. Say so in the header and the chapter.

commit ade0664620662517dc921ab6bfe5248eec463cd9
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Wed Aug 26 19:07:39 2026 +1000

    tests: check the shipped frame functions where they run
    
    The frame cases so far run machines written for the test, so the
    hand-written matrix entries in each module are compiled and nothing
    more, and that is where a sign or a transposed pair hides.
    
    Run them in service instead: a realtime component loaded after the
    module under test, reaching it through the same exported entry points
    motion uses, for every kinematics type the module offers.  A failed
    check fails the load, and a failed load fails the test.
    
    The work frame is checked against the forward kinematics rather than
    against a matrix copied out of the module: a row of the work frame is
    how the reported position responds to one machine axis, by central
    difference.
    
    The tool frame has no such tie on a machine that carries the work, so
    what is checked is that the frame is a rotation, that a spindle the
    module calls fixed never moves, and that a joint carrying the whole
    head turns the reported frame about the machine's z and nothing else.
    The last one catches a frame built for the wrong joint or composed in
    the wrong order.
    
    Checked by mutation, in failed checks: reversing the head composition
    order in a trsrn module 300, a flipped sign in its work frame 150, one
    in the xyzac work frame 18, the wrong spindle convention there 25, a
    flipped sign in the puma flange 72.  The tree as it stands fails none.

commit 340032d425ae0ed59d4fcf57c78c7c5f661ccfc2
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Wed Aug 26 21:49:16 2026 +1000

    trsrn: set the kinematics pins up once, at load
    
    Both modules build their pins on the first kinematicsType() call and
    test an is_setup flag that nothing ever sets, so every later call runs
    the setup again.  The second run reassigns haldata to a fresh block and
    then fails to create the pins that block points at, all of them already
    taken, so the module is left reading through null references and the
    next forward or inverse call takes realtime with it.
    
    Motion asks twice when num_extrajoints is greater than zero, once in
    rtapi_app_main and once in init_comm_buffers, so that combination
    cannot be running today.
    
    Latching the flag would stop the repeat, but the setup does not belong
    in a function whose job is to answer a question.  halcompile has a hook
    for this, used by homecomp for the same reason: EXTRA_SETUP() runs once
    from the generated setup, before the component is made ready.  So the
    pins exist from the moment the module is loaded, kinematicsType() only
    answers, and the hal_set_unready() and hal_ready() calls the old
    placement needed are gone with it.

commit 2ae7c8a6f4236eec0d21e5cae7cd0f8ab0621ffd
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Mon Aug 24 14:18:03 2026 +1000

    kinematics: answer which joints point the tool somewhere
    
    The frames say where the tool points for a set of joint values.  The question
    a tilted work plane actually asks is the other way round: which joint values
    point it at the orientation the program wants.  Today that is answered outside
    the kinematics, in per-machine trigonometry in the TWP remap, once per machine
    and once per pair of rotary letters, which is how the copy in the tree came to
    check the primary angle against the secondary joint's limits.
    
    kinematicsToolFrameInverse() asks the module instead.  It reports every set of
    joint values that reaches the orientation, and nothing else: no joint limits
    and no preference between the answers, because the caller knows the limits and
    knows whether the operator asked for the shortest move or for one direction of
    rotation only.  A module that reports its frames needs to supply nothing, the
    generic search in kins_util.c drives them; a module with a closed form
    registers it and that is used instead.
    
    The request is a tool axis and optionally a tool x as well, and asking for tool
    x does not require a joint that can reach it.  A five axis machine spends both
    rotaries on the tool axis and the turn about that axis is not a joint, it is
    the virtual rotation, so the answer comes back in two parts: the poses that
    reach the axis, and the turn that places tool x, which is zero where a third
    orientation joint did the job instead.  The caller writes one path and the kind
    of machine becomes a number rather than a branch.  That is what the controls
    do, a Heidenhain PLANE VECTOR block carrying the normal and the base vector
    together and a Fanuc G68.2 defining where the plane's X points; neither refuses
    a program for naming both.
    
    Where a request still leaves the machine free, at a singular pose or on a
    machine with a spare orientation joint, one point of the family is reported,
    the one nearest the seed, with the number of free directions alongside.
    Returning samples of a curve as though they were alternatives would be worse
    than saying so.
    
    Three details in the search are not incidental.  The damping is adaptive,
    which is what keeps a rank deficient pose from turning finite difference noise
    into a step of thousands of degrees.  The Jacobian is central differenced,
    because a one sided error is first order in the step and shows up as a
    spurious singular value, which is exactly what the rank test must not see.
    And the joint unit is discovered by adding a whole turn and asking whether the
    frame came back, because every module in the tree takes degrees but the
    interface does not say so.
    
    The unit test drives it through a table rotary machine, a nutating head and a
    machine with both, and checks the nutating answers against the closed form the
    remap uses.

commit 8bf4605ae81042248add031e94c77300406e0413
Merge: fa910f12 699af8e5
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Fri Sep 4 20:23:04 2026 -0400

    Merge pull request #4501 from grandixximo/gmoccapy-quit-4500
    
    gmoccapy: fix SIGTERM/SIGINT hang while a modal dialog is up

commit 699af8e5ae645788355be42437804795afcc363f
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Sep 5 07:29:15 2026 +0800

    gmoccapy: fix SIGTERM/SIGINT hang while a modal dialog is up
    
    A modal dialog's gtk_dialog_run() loop is invisible to Gtk.main_quit(), so the GUI survived SIGTERM and the ui-smoke gmoccapy-quit test timed out. _terminate now destroys all other toplevels so run() returns and the unwind proceeds, with a forced exit as backstop.
    
    Also guard set_max_undo_levels() in hal_sourceview (dropped by newer GtkSourceView 4; the AttributeError popped the modal error dialog on CI), and harden the excepthook against a partially built app object.

commit fa910f12394ba1b76edc4c5b3ac67955d9d79ace
Author: Cmorley <chrisinnanaimo@hotmail.com>
Date:   Wed Sep 2 18:32:31 2026 -0700

    axis/gmoccapy -docs: add info qtvcp is embedable too

commit ee0ed55ec2e0662d2805519308a7859cd927e8f4
Author: Cmorley <chrisinnanaimo@hotmail.com>
Date:   Wed Sep 2 06:03:03 2026 -0700

    qtvcp -docs : add missing center finder image

commit dc61c5a384784882a6f86125fe38b1780afd5d92
Merge: 098cd98a a4cd6d9a
Author: BsAtHome <bertho@vagrearg.org>
Date:   Wed Sep 2 10:59:31 2026 +0200

    Merge pull request #4136 from grandixximo/ui-tests-phase3
    
    ui-smoke phase 3: screenshots, writable config mirrors, homing settle

commit a4cd6d9ad459762e64b554f0239d09af2d70c098
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Wed Sep 2 15:08:36 2026 +0800

    tests: ui-smoke phase 3, screenshots, reference diffs, crash dumps, driver hardening
    
    Each GUI smoke test now captures a screenshot on failure and a settled confirm shot on pass, uploaded as CI artifacts. The confirm shot is compared against a committed reference.png at 0% fuzz, writing red-highlight and absolute-difference diff images; the comparison never fails a test, it records rendering drift (freetype versions differ across distros) so preview regressions are visible at review time.
    
    Crash dumps: runtests -d opts in; on a crashing GUI test a gdb backtrace is printed from the core, collected via coredumpctl on systemd hosts or a plain-file core_pattern the CI workflow arms at job level. No sudo in the test scripts. gdb moves to control build-deps so package-arch tests have it too.
    
    gmoccapy runs against a writable config mirror with a seeded preference file so the first-run modal stays hidden; PROGRAM_PREFIX is pointed at the real nc_files for the mirror.
    
    Driver hardening: ensure_state/ensure_mode re-verify with a retry budget, and home_all / run_program retry their whole command sequence, so a late GUI startup revert (gmoccapy's own ESTOP or mode reset landing after the state checks) costs one retry instead of failing the test. No fixed sleep in the driver is load-bearing; the settles only keep transient warning dialogs out of the screenshots.
    
    Adds the touchy-fit test: boots touchy on a 1024x768 screen and fails if the window exceeds it.

commit 098cd98a6c03cc6fa8748b862e5fe09702529bae
Merge: 092cef0b 1017e5a1
Author: BsAtHome <bertho@vagrearg.org>
Date:   Wed Sep 2 09:41:23 2026 +0200

    Merge pull request #4496 from grandixximo/fix/docs-qtvcp-center-finder-image
    
    docs: drop dangling qtvcp_center_finder image ref

commit 1017e5a19ca3a92dba10122ae8fb3bc802058765
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Wed Sep 2 03:06:59 2026 -0400

    docs: drop dangling qtvcp_center_finder image ref
    
    24eb9899c9 referenced the screenshot without committing it, which broke the docs build.

commit 092cef0b3075543b6bae233215e442b4d33bda47
Merge: 24eb9899 49570d43
Author: BsAtHome <bertho@vagrearg.org>
Date:   Wed Sep 2 08:53:37 2026 +0200

    Merge pull request #4495 from grandixximo/rs274ngc-drop-dead-rtapi-math
    
    rs274ngc: drop dead rtapi_math.h includes

commit 24eb9899c9028335e33083217bb777f32effeb5c
Author: Cmorley <chrisinnanaimo@hotmail.com>
Date:   Tue Sep 1 19:46:24 2026 -0700

    qtvcp -add 3pcenter panel
    
    find center with 2 points.
    Donated by MarkoPolo

commit 49570d43eaf79a5769db132d39f20fe500b1f649
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Tue Sep 1 21:46:02 2026 -0400

    rs274ngc: drop dead rtapi_math.h includes
    
    interp_arc.cc, interp_execute.cc and interp_find.cc included
    <rtapi_math.h> but use no rtapi_ symbols. Their math functions and
    M_PIl come from <math.h>, which they already include after defining
    _GNU_SOURCE. The interpreter is built only as the userspace
    librs274.so, so the kernel branch of rtapi_math.h never applied.
    
    Completes the include cleanup that #4493 did for interp_convert.cc
    and interp_read.cc.

commit 10ca5afdb599878193562d284f0dd553542ec614
Merge: 7d381974 e0a4bb26
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Tue Sep 1 20:37:38 2026 -0400

    Merge pull request #4491 from alex-pres/pr-interp-speedup-number-parse
    
    optimization: rs274ngc: parse numbers with std::from_chars

commit 7d381974df563bc50a755d201c63272e383fa1ce
Merge: 1c6b998b cdeeaa40
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Tue Sep 1 20:37:07 2026 -0400

    Merge pull request #4493 from BsAtHome/fix_rs274ngc-no-rtapi
    
    rs274ngc: Don't use RTAPI. This is non-RT userspace code

commit 1c6b998b66b9c7ba42728565622f3489cddc1a57
Merge: ca409f39 02e9984c
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Tue Sep 1 20:13:59 2026 -0400

    Merge pull request #4490 from BsAtHome/halgs_fix-tests-components
    
    tests: Update all components in tests to getter/setter

commit ca409f3934546b1cab68c7ad95b1d041adf75192
Merge: d566b711 0c5566b0
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Tue Sep 1 18:29:38 2026 -0400

    Merge pull request #4494 from weblate/weblate-linuxcnc-linuxcnc-docs
    
    Translations update from Hosted Weblate

commit 0c5566b09191a52eeb8f506baead56b6a9c07182
Author: Américo Monteiro <a_monteiro@gmx.com>
Date:   Tue Sep 1 17:53:02 2026 +0200

    Translated using Weblate (Portuguese)
    
    Currently translated at 32.6% (11108 of 33994 strings)
    Author: Américo Monteiro <a_monteiro@gmx.com>
    
    Co-authored-by: Américo Monteiro <a_monteiro@gmx.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/pt/
    Translation: LinuxCNC/LinuxCNC Documentation

commit 105ee289278c6743573d5aba5037f9dfb224b9b2
Author: Luca Toniolo <toniolo.luca@outlook.com>
Date:   Tue Sep 1 17:52:59 2026 +0200

    Translated using Weblate (Tamil)
    
    Currently translated at 81.4% (27681 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Ukrainian)
    
    Currently translated at 99.6% (33878 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Russian)
    
    Currently translated at 34.3% (11668 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (German)
    
    Currently translated at 99.6% (33891 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Norwegian Bokmål)
    
    Currently translated at 4.4% (1500 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (French)
    
    Currently translated at 2.1% (715 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Spanish)
    
    Currently translated at 35.0% (11903 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Co-authored-by: Luca Toniolo <toniolo.luca@outlook.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/de/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/es/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/fr/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/nb_NO/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/ru/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/ta/
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/uk/
    Translation: LinuxCNC/LinuxCNC Documentation

commit b9b0dd787029c620cfe99c0ba7eb4523c71d5e29
Author: Salvador Peña <salvadorp74@hotmail.com>
Date:   Tue Sep 1 17:52:51 2026 +0200

    Translated using Weblate (Spanish)
    
    Currently translated at 35.0% (11903 of 33994 strings)
    Author: Salvador Peña <salvadorp74@hotmail.com>
    
    Co-authored-by: Salvador Peña <salvadorp74@hotmail.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/es/
    Translation: LinuxCNC/LinuxCNC Documentation

commit cdeeaa409e5867f4850157ab0d18b6ddfe57ae60
Author: Bertho Stultiens <bertho@vagrearg.org>
Date:   Tue Sep 1 14:48:23 2026 +0200

    rs274ngc: Don't use RTAPI. This is non-RT userspace code.

commit e0a4bb26f63f6f807ae6832de5b78c42ed35de55
Author: Alexey Presnyakov <309782758+alex-pres@users.noreply.github.com>
Date:   Mon Aug 31 20:34:12 2026 +0400

    rs274ngc: parse numbers with std::from_chars
    
    read_real_number built a std::string and a std::stringstream for every number
    in a program, and read_integer_unsigned handed the digits it had already
    delimited to sscanf("%d"). std::from_chars needs neither, and is
    locale-independent where the stream was not. Accepted syntax, parsed values
    and both error messages are unchanged, except that a magnitude too small for
    a double, and a line number too large for an int, are now parse errors.
    Parsing a 13.7M line program is 2.1x faster.

commit d566b71161a159a7f4fbbf61b9e6693f6b4bfbe4
Merge: 3f877213 37520737
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Mon Aug 31 07:12:52 2026 -0400

    Merge pull request #4489 from BsAtHome/fix_hostmot2-llio-spidriver-retval
    
    hostmot2: Fix the (superseded) SPI driver's low-level IO return values

commit 02e9984ccd72022d96697195434e884eb5fdf5be
Author: Bertho Stultiens <bertho@vagrearg.org>
Date:   Sun Aug 30 18:03:07 2026 +0200

    tests: Update all components in tests to getter/setter.

commit 3f87721343f2f6ad5940a2acac60a2c9262707f4
Merge: d17b036e 793a04c1
Author: BsAtHome <bertho@vagrearg.org>
Date:   Mon Aug 31 00:22:32 2026 +0200

    Merge pull request #4444 from grandixximo/fix/hal-gremlin-is-lathe
    
    gladevcp: fix velocity DRO row position on non-lathes

commit 375207373eaf717634defa0e30ee396e03a95820
Author: Bertho Stultiens <bertho@vagrearg.org>
Date:   Sun Aug 30 14:31:24 2026 +0200

    hostmot2: Fix the (superseded) SPI driver's low-level IO return values.

commit 85fe1de84ae0544fbb8ce155129faf75eb4e0ec2
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Aug 29 22:22:50 2026 +1000

    interp_g7x: build with the default floating point contraction again
    
    The exception was there to keep the G71 tool path away from FMA while the
    cycle still decided cases on exact float comparisons.  It does not any
    more, so the file can be built like every other one and CI is free to
    catch it if some other part of the code cannot.

commit 60756289b8f2df966b178c1f86c18f0affb31eef
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Aug 29 20:19:01 2026 +1000

    interp_g7x: make the G7x roughing cycle independent of rounding
    
    Discrete cases were decided by comparing floats that are meant to be
    equal, and lathe profiles produce those ties by construction: an arc
    starting at its own apex, an exactly flat facing cut, a scan line landing
    on top of an arc.  Moving the coordinates in tests/interp/g71-with-g70 by
    a relative 1e-12, far below the 1e-6 tolerance the cycle works to, changed
    the tool path in 16 of 20 runs and hung the interpreter in another 4.
    Contracting a*b+c into an FMA is a much smaller disturbance than that,
    which is why the test failed only on a compiler defaulting to x86-64-v3.
    
    Those comparisons now carry the tolerance.  The apex tie was the expensive
    one: broken the wrong way, pocket() re-enters the same pocket forever,
    which is the four hangs.  add_distance() ends on the requested distance
    rather than on an exact comparison against an accumulated sum, replacing
    the stall guard from the previous commit.
    
    The thresholds are plain numbers, so they only fit a part of a few tens of
    millimetres; scaled up, the same perturbation broke the path at 190 mm and
    every run at 305 mm.  The profile is normalised into a canonical range on
    entry and the tool path scaled back on output, by a power of two so the
    scaling adds no rounding of its own and is 1 at the size the thresholds
    were chosen for.
    
    The tool path now survives that perturbation on parts from 0.4 mm to
    381 m, and interp_g7x.o gives identical output built with
    -march=x86-64-v3, -ffp-contract=off, -mfpmath=387, -O0 and -O3.
    
    The two lines added to the g71-with-g70 expected output are the contour
    segment at the flatness test, now climbed like the rest.  Both are zero
    length repeats of moves already present, so the path is unchanged.

commit d17b036e072ddaaa31ab77e4e1345a952a8bdb17
Merge: 54cd4d6b 72db1592
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Aug 29 02:40:06 2026 -0400

    Merge pull request #4469 from BsAtHome/halgs_rm-halpr-function-access
    
    hal: Stop exporting halpr_*() private functions and shared memory base

commit 54cd4d6b23d3496a9a3d7bc9ce7373e1e63f3e83
Merge: 0eb76c61 e59dc278
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Aug 29 02:39:25 2026 -0400

    Merge pull request #4470 from BsAtHome/fix_docs-rm-hal-legacy
    
    docs: Update HAL API documentation - remove legacy API docs

commit 0eb76c619dbe544a356fc548de817ca91492ca57
Merge: f3532938 ddd7e5ca
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Aug 29 02:37:12 2026 -0400

    Merge pull request #4472 from BsAtHome/halgs_deprecate-old-api
    
    hal: Deprecate old HAL API

commit 57c0b500486d45ff43310d3f25c1db06979cc419
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Aug 23 17:35:00 2026 +1000

    tests: cover the frame helpers
    
    Pins down the two properties the chapter is about.
    
    Relating one tool axis convention to the other is a rotation, not a change of
    sign: a negated third column is refused because it is a reflection, the
    declared rotation post-multiplies so it is read in the module's own frame, the
    half turn keeps tool x and reverses the other two, and applying it twice is
    the identity.  Also checks the pumakins zero pose, whose own frame is a half
    turn about x, ends up as the identity after the declaration it makes.
    
    And composing the two reported frames means transposing the work one:
    toolFrameInWork() leaves the tool alone when nothing turns the work, gives a
    proper rotation, and composes a work frame with its own inverse back to the
    identity.
    
    Verified by mutation rather than by passing: making TOOL_FRAME_FLANGE negate
    only the tool axis fails nine checks, reversing the multiplication order fails
    four, and dropping the transpose in toolFrameInWork() fails two.
    
    Built the way tests/blendmath builds, compiling the source under test directly
    with the rest garbage-collected by the linker.

commit e3eda9500870c2ac7bf0f187b3c424957822cb20
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Aug 23 17:09:31 2026 +1000

    pumakins: supply the work and tool frames
    
    The arm carries the tool and nothing carries the work, so the work frame is
    the identity and this is the first module whose own tool maths is not in the
    convention.
    
    pumakins builds the ISO 9787 mechanical interface frame, whose z points
    perpendicularly away from the flange, and it relies on that: it reaches the
    tool tip by adding PUMA_D6 along the third column.  So it answers in its own
    frame and declares TOOL_FRAME_FLANGE, and switchkins turns it into the
    convention.  Nothing in the module itself flips a sign.
    
    Lift the rotation out of the forward kinematics into pumaFlangeRotation()
    rather than writing it twice, which is the whole point: a second copy of a
    machine's geometry that has to be kept in step by hand is the thing this work
    exists to remove.  The block moves verbatim and the forward kinematics loses
    the locals that went with it.
    
    At every joint zero the module's own frame is diag(1, -1, -1), a half turn
    about x, so after the declared half turn it reports the identity: tool axis
    [0, 0, 1], tool x [1, 0, 0].  A puma at zero and a vertical mill at zero give
    the same answer, which is right, because both have the tool pointing down at
    the work.

commit b677195d8ecd47f10a42fea6e99376fb0e9bc44e
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Aug 23 15:29:34 2026 +1000

    xyzacb_trsrn, xyzbca_trsrn: supply the work and tool frames
    
    These are the machines the split is for: a rotary carries the work and two
    more carry the tool, so neither frame is the identity and neither can be
    recovered from their product.
    
    The work frame is the table rotation, written in machine coordinates.  The
    tool frame is the primary rotation about z times the nutating secondary,
    written as two matrices and multiplied rather than expanded, so it can be read
    against the matrices in the config's remap_funcs_twp.py.
    
    Identity kinematics leaves both square with the machine, and so does tool
    kinematics: there the world axes are the tool axes by construction, which is
    what makes a G1 Z move run along the tool, so there is no machine-relative
    frame to report.
    
    Checked against the forward transform of each module at 27 poses.  The
    coefficients the forward applies to a displacement of the linear joints are
    the transpose of the work frame alone, as they should be, since turning the
    head does not move the tool tip when a linear joint moves.  The tool axis,
    recovered separately as the direction the tip retreats along when the tool
    gets longer, matches the third column of transpose(work) * tool.  For tool
    kinematics the same coefficients come out as the transpose of the whole chain
    including the virtual rotation, which is the statement that the world frame is
    the tool frame.  Agreement is to 3e-9 throughout.

commit a6ea5b12932af68e84e224c6916ee8e3257f494d
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Aug 23 15:29:33 2026 +1000

    trivkins: supply the work and tool frames
    
    trivkins does not build on switchkins.c, so it does not pick up the identity
    frames the way a switchkins identity type does.  Hand them through, since it
    is the kinematics most machines run and a caller that has to special-case the
    commonest module has not gained much.

commit b6b8ef5fbfad70e4e30c96c922028451da51dec9
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Aug 23 15:24:40 2026 +1000

    trtfuncs: supply the work and tool frames for xyzac and xyzbc
    
    Both rotaries carry the work on these machines, so the tool never turns in the
    machine frame and its frame is the identity.  All the rotation is the work's.
    
    The forward transform already contains it: the coefficients it applies to a
    displacement of the X, Y and Z joints are the rotation from machine into work,
    so the work frame in machine coordinates is their transpose.
    
    Checked against the forward transform by central difference over the linear
    joints at four primary and four secondary angles with both settings of
    conventional-directions: the composition transpose(work) * tool reproduces the
    frame to 3e-9, the result is orthonormal with determinant one, and the tool
    axis is machine z with the rotaries at zero.
    
    The check also shows the sign question plainly.  With conventional-directions
    true, A at 90 degrees on an xyzac machine puts the tool axis along -Y in work
    coordinates, which is +Z turned counterclockwise about +X as the documentation
    says it should be.  With the pin at its default of false the same move puts it
    along +Y.

commit 4be34b5c0ae2df73d5734b006a03eb20ba2045fa
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Aug 23 15:24:15 2026 +1000

    kinematics: add optional work frame and tool frame entry points
    
    kinematicsForward() reports where the controlled point is and nothing about
    which way anything faces, so a consumer that needs the geometry rebuilds it
    for itself.  Add two entry points a module can answer with instead:
    
      int kinematicsToolFrame(const double *joint, PmRotationMatrix *rot,
                              const KINEMATICS_FORWARD_FLAGS *fflags);
      int kinematicsWorkFrame(const double *joint, PmRotationMatrix *rot,
                              const KINEMATICS_FORWARD_FLAGS *fflags);
    
    Each returns the columns of that frame's axes in machine coordinates.
    Conventions are in the Kinematics Conventions chapter.
    
    They are reported separately rather than as the single work-to-tool rotation
    because the product cannot be taken apart again.  A consumer that has to place
    both bodies, a simulation model or a tracking display, needs each against
    something that does not move; one that wants the tool in workpiece
    coordinates, which is what a tilted work plane asks for, composes them with
    toolFrameInWork().  Composing is a multiply, decomposing is impossible, so the
    halves are what the module owes the caller.
    
    Modules built on switchkins.c export both and dispatch on the current type,
    returning -1 for a type that has not supplied them.  A type registers with
    switchkinsRegisterFrames() from its switchkinsSetup(); leaving it out costs
    nothing.  Adding it that way rather than as arguments to switchkinsSetup() and
    switchkinsRegister() keeps both signatures as they are, so no module has to
    change to build.
    
    The tool frame has two live conventions, so a type also declares the rotation
    relating its own to the one in use, and the dispatch applies it.  That is a
    rotation and not a sign: negating the third column alone leaves determinant
    -1, a reflection.  It is checked once at registration rather than on each
    call.  The work frame needs none of this, having no tool axis to point the
    wrong way.
    
    Identity types answer both the same way whichever module asked for them, so
    switchkins.c attaches the identity pair to any type whose forward is the
    identity one, and every switchkins module gains correct frames for its
    identity type without being touched.
    
    Nothing in motion calls either, so no module is obliged to define them and a
    module outside the tree need not know they exist.

commit 9e97f59294e40225693d9df8fcd1e3cb5ee2ace1
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sun Aug 23 14:32:38 2026 +1000

    docs: add a kinematics conventions chapter
    
    A kinematics module reports the controlled point and nothing else, so
    everything needing the rest of the machine geometry rebuilds it.  For
    xyzacb-trsrn the same chain is written three times: closed-form in
    xyzacb_trsrn.comp, as homogeneous matrices in the config's
    remap_funcs_twp.py, and as signed HalRotate calls in the vismach model.  The
    Python copy is kept in step by a comment saying its matrices "must be the
    same as the ones used to derive the kinematic model".
    
    Write down the vocabulary they would need to share: the four frames and which
    one kinematicsForward() reports in, the rotation sense already stated under
    Rotational Axes and its ISO 841 equivalent, what conventional-directions
    costs at its default, and the definition of the tool frame.
    
    Tool x is the part worth stating as a rule rather than a formula.  The
    virtual rotation about tool z supplies what a five-axis machine cannot, and
    the convention is that it leaves tool x parallel to the machine xy-plane; the
    formula follows from the machine's own secondary rotation matrix, which is
    why the two nutating configs in tree have different ones.
    
    Also anchor the Rotational Axes section so it can be referenced.

commit f35329387d4baeb2491862b0af607793fbda071b
Merge: 49660cb6 455ef16d
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Sat Aug 29 01:04:35 2026 -0400

    Merge pull request #4483 from BsAtHome/fix_mb2hal-modinfo
    
    mb2hal: Fix module info placement and cppcheck problem

commit 455ef16db01c82f8c7ec3a50d64038a48018f4ac
Author: Bertho Stultiens <bertho@vagrearg.org>
Date:   Fri Aug 28 14:26:05 2026 +0200

    mb2hal: Fix module info placement and cppcheck problem.

commit 49660cb6439326da1e31664bfde436633223030e
Merge: d47bccc9 3570f8ab
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Fri Aug 28 08:43:25 2026 -0400

    Merge pull request #4479 from weblate/weblate-linuxcnc-linuxcnc-docs
    
    Translations update from Hosted Weblate

commit 25398de1c003433ccfee455d6c48be6641fb6dcf
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Fri Aug 28 11:01:08 2026 +0800

    interp_g7x: build with -ffp-contract=off, fix latent geometry bugs
    
    The g7x offsetting code takes discrete threshold branches on iterated
    floating-point values (segment deletion at radius<1e-3, monotonicity,
    arc insertion at gap>1e-2), so a 1-ulp rounding difference can flip a
    branch and diverge the whole toolpath. GCC defaults to
    -ffp-contract=fast; when targeting x86-64-v3 (ubuntu-26.04 CI runner
    gcc default, --with-arch-64=x86-64-v3) this emits FMA instructions and
    changes rounding, failing g71-with-g70 and g71-endless-loop_2 in CI.
    Verified: rebuilding only interp_g7x.o with -march=x86-64-v3 fails,
    -ffp-contract=off passes; -O0/-O2/-O3/arch without FMA are all
    byte-identical, so contraction is the only variable.
    
    Disable FP contraction for interp_g7x.o (same semantics as ISO C's
    default). Investigating the divergence also exposed latent bugs that
    the flipped branches merely reach:
    
    - erase(p--) on a list iterator at begin() is undefined behavior; in
      practice it ends the loop early, skipping offsets for all remaining
      segments. Use the p=erase(p) idiom (two sites).
    - round_segment::intersect_end(round_segment*) silently clamped
      |cosB|>1 (non-intersecting circles) and set p's end to a point on
      the wrong circle, producing arcs the interpreter itself rejects.
      Trim to the closest points on the line of centers instead.
    - the add_distance() accumulation loop requires exact FP equality;
      under some roundings the step becomes too small to change the sum
      and the loop never terminates. Break when the sum stops changing.
    - the add_distance() junction snap moves arc endpoints off their
      circle; refuse to snap across a gap larger than 1e-3 instead of
      manufacturing an invalid arc.
    
    All fixes keep byte-identical output on the g71 tests with the
    baseline arch; they only change behavior in cases that previously
    produced undefined or geometrically invalid results.

commit 3570f8abff58db91c41b5fefe5950686b3bb4018
Author: Luca Toniolo <toniolo.luca@outlook.com>
Date:   Thu Aug 27 17:25:57 2026 +0200

    Translated using Weblate (Tamil)
    
    Currently translated at 81.4% (27681 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Translated using Weblate (Tamil)
    
    Currently translated at 81.4% (27680 of 33994 strings)
    Author: Luca Toniolo <toniolo.luca@outlook.com>
    
    Co-authored-by: Luca Toniolo <toniolo.luca@outlook.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/ta/
    Translation: LinuxCNC/LinuxCNC Documentation

commit 44a5145664132048a301a1f0ccf8c2680bc8f3f0
Author: Salvador Peña <salvadorp74@hotmail.com>
Date:   Thu Aug 27 17:25:56 2026 +0200

    Translated using Weblate (Spanish)
    
    Currently translated at 34.7% (11801 of 33994 strings)
    Author: Salvador Peña <salvadorp74@hotmail.com>
    
    Translated using Weblate (Spanish)
    
    Currently translated at 34.7% (11797 of 33994 strings)
    Author: Salvador Peña <salvadorp74@hotmail.com>
    
    Translated using Weblate (Spanish)
    
    Currently translated at 34.6% (11792 of 33994 strings)
    Author: Salvador Peña <salvadorp74@hotmail.com>
    
    Co-authored-by: Salvador Peña <salvadorp74@hotmail.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/es/
    Translation: LinuxCNC/LinuxCNC Documentation

commit 2ad450b9038fde5bf502cce12b2dffbf74077552
Author: Alexey Presnyakov <309782758+alex-pres@users.noreply.github.com>
Date:   Wed Aug 26 18:50:58 2026 +0400

    preview: draw stock outlines from (WORKPIECE,...) comments
    
    A (WORKPIECE,BOX|CYLINDER|TUBE,...) comment declares the stock the program is cut
    from; every preview host draws it as a translucent wireframe, toggled per host,
    and get_workpieces() hands a GUI the declared params and the outline in machine
    coordinates. Program extents are unchanged.

commit d47bccc94a40852ca04dadb3f062f709e95a651c
Merge: b7a619bc bdb13f66
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date:   Wed Aug 26 21:50:14 2026 -0400

    Merge pull request #4478 from weblate/weblate-linuxcnc-linuxcnc-docs
    
    Translations update from Hosted Weblate

commit bdb13f66b3c8c86f25f36306ff63cdcc3183358b
Author: Salvador Peña <salvadorp74@hotmail.com>
Date:   Thu Aug 27 00:34:47 2026 +0200

    Translated using Weblate (Spanish)
    
    Currently translated at 34.5% (11758 of 33994 strings)
    Author: Salvador Peña <salvadorp74@hotmail.com>
    
    Co-authored-by: Salvador Peña <salvadorp74@hotmail.com>
    Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/es/
    Translation: LinuxCNC/LinuxCNC Documentation
Created: 2025-03-16 Last update: 2026-09-14 10:03
The package has not entered testing even though the delay is over normal
The package has not entered testing even though the 5-day delay is over. Check why.
Created: 2026-07-04 Last update: 2026-09-14 10:03
1 bug tagged patch in the BTS normal
The BTS contains patches fixing 1 bug, consider including or untagging them.
Created: 2026-09-02 Last update: 2026-09-14 10:00
Depends on packages which need a new maintainer normal
The packages that linuxcnc depends on which need a new maintainer are:
  • dblatex (#942402)
    • Build-Depends-Indep: dblatex
  • docbook-xsl (#802370)
    • Build-Depends: docbook-xsl
Created: 2022-02-27 Last update: 2026-09-14 07:02
testing migrations
  • excuses:
    • Migration status for linuxcnc (- to 1:2.9.9-2): BLOCKED: Rejected/violates migration policy/introduces a regression
    • Issues preventing migration:
    • ∙ ∙ Updating linuxcnc would introduce bugs in testing: #1089809, #1143333
    • ∙ ∙ Autopkgtest for linuxcnc/1:2.9.9-2: amd64: Failed ♻, arm64: Failed ♻, armhf: Failed ♻, i386: Failed ♻
    • ∙ ∙ New but not reproduced on arm64 - info: linuxcnc-doc-de, linuxcnc-doc-en, linuxcnc-doc-es, linuxcnc-doc-fr, linuxcnc-doc-zh-cn, linuxcnc-uspace
    • ∙ ∙ New but not reproduced on armhf - info: linuxcnc-doc-de, linuxcnc-doc-en, linuxcnc-doc-es, linuxcnc-doc-fr, linuxcnc-doc-zh-cn, linuxcnc-uspace
    • ∙ ∙ New but not reproduced on i386 - info: linuxcnc-doc-de, linuxcnc-doc-en, linuxcnc-doc-es, linuxcnc-doc-fr, linuxcnc-doc-zh-cn, linuxcnc-uspace
    • ∙ ∙ Reproducibility check waiting for results on amd64 - info
    • Additional info (not blocking):
    • ∙ ∙ Piuparts tested OK - https://piuparts.debian.org/sid/source/l/linuxcnc.html
    • ∙ ∙ 77 days old (needed 5 days)
    • Not considered
news
[rss feed]
  • [2026-06-30] Accepted linuxcnc 2.9.0~pre1+git20230208.f1270d6ed7-1+deb12u2 (source) into oldstable-proposed-updates (Debian FTP Masters) (signed by: Petter Reinholdtsen)
  • [2026-06-30] Accepted linuxcnc 1:2.9.4-2+deb13u1 (source) into proposed-updates (Debian FTP Masters) (signed by: Petter Reinholdtsen)
  • [2026-06-28] Accepted linuxcnc 1:2.9.9-2 (source) into unstable (Petter Reinholdtsen)
  • [2026-06-27] Accepted linuxcnc 1:2.9.9-1 (source) into unstable (Petter Reinholdtsen)
  • [2026-01-25] linuxcnc REMOVED from testing (Debian testing watch)
  • [2025-11-11] linuxcnc 1:2.9.7-1 MIGRATED to testing (Debian testing watch)
  • [2025-11-03] Accepted linuxcnc 1:2.9.7-1 (source) into unstable (andypugh) (signed by: Steffen Moeller)
  • [2025-05-20] linuxcnc 1:2.9.4-2 MIGRATED to testing (Debian testing watch)
  • [2025-04-13] Accepted linuxcnc 1:2.9.4-2 (source) into unstable (Steffen Moeller)
  • [2025-03-15] Accepted linuxcnc 1:2.9.4-1 (source) into unstable (Steffen Moeller)
  • [2025-03-11] linuxcnc REMOVED from testing (Debian testing watch)
  • [2025-01-31] linuxcnc 2.9.3-2 MIGRATED to testing (Debian testing watch)
  • [2025-01-27] Accepted linuxcnc 2.9.0~pre1+git20230208.f1270d6ed7-1+deb12u1 (source) into proposed-updates (Debian FTP Masters) (signed by: Petter Reinholdtsen)
  • [2025-01-26] Accepted linuxcnc 2.9.3-2 (source) into unstable (Petter Reinholdtsen)
  • [2025-01-20] linuxcnc REMOVED from testing (Debian testing watch)
  • [2024-07-09] linuxcnc 2.9.3-1 MIGRATED to testing (Debian testing watch)
  • [2024-07-07] Accepted linuxcnc 2.9.3-1 (source) into unstable (Petter Reinholdtsen)
  • [2023-12-28] linuxcnc REMOVED from testing (Debian testing watch)
  • [2023-11-06] Accepted linuxcnc 2.9.1-2 (source) into unstable (Steffen Moeller)
  • [2023-10-26] Accepted linuxcnc 2.9.1-1 (source) into unstable (Andy Pugh) (signed by: Steffen Moeller)
  • [2023-02-13] linuxcnc 2.9.0~pre1+git20230208.f1270d6ed7-1 MIGRATED to testing (Debian testing watch)
  • [2023-02-10] Accepted linuxcnc 2.9.0~pre1+git20230208.f1270d6ed7-1 (source) into unstable (Sebastian Kuzminsky) (signed by: Petter Reinholdtsen)
  • [2022-11-11] linuxcnc 2.9.0~pre0+git20221105.ffb6bda926-1.2 MIGRATED to testing (Debian testing watch)
  • [2022-11-08] Accepted linuxcnc 2.9.0~pre0+git20221105.ffb6bda926-1.2 (source) into unstable (Petter Reinholdtsen)
  • [2022-11-08] Accepted linuxcnc 2.9.0~pre0+git20221105.ffb6bda926-1.1 (source) into unstable (Petter Reinholdtsen)
  • [2022-11-06] Accepted linuxcnc 2.9.0~pre0+git20221105.ffb6bda926-1 (source) into unstable (Sebastian Kuzminsky) (signed by: Petter Reinholdtsen)
  • [2022-09-12] linuxcnc 2.9.0~pre0+git20220906.02744cdef6-1 MIGRATED to testing (Debian testing watch)
  • [2022-07-15] linuxcnc 2.9.0~pre0+git20220402.2500863908-4 MIGRATED to testing (Debian testing watch)
  • [2022-07-14] linuxcnc REMOVED from testing (Debian testing watch)
  • [2022-07-14] linuxcnc REMOVED from testing (Debian testing watch)
  • 1
  • 2
bugs [bug history graph]
  • all: 9
  • RC: 2
  • I&N: 4
  • M&W: 3
  • F&P: 0
  • patch: 1
links
  • homepage
  • lintian (1, 55)
  • buildd: logs, cross
  • popcon
  • browse source code
  • other distros
  • security tracker
  • l10n (-, 9)
  • debci
ubuntu Ubuntu logo [Information about Ubuntu for Debian Developers]
  • version: 1:2.9.4-2ubuntu4
  • 2 bugs
  • patches for 1:2.9.4-2ubuntu4

Debian Package Tracker — Copyright 2013-2025 The Distro Tracker Developers
Report problems to the tracker.debian.org pseudo-package in the Debian BTS.
Documentation — Bugs — Git Repository — Contributing