Verified: Authoring for Logix (experimental)
Each claim the Authoring for Logix (experimental) page makes, with the tests that
prove it in the last green CI run: 31 of 52 verified.
The claims live in docs/claims/logix-authoring.yaml.
Last green CI run 16 Oct 2026, 14:48 UTC on c7618d3 · all runtime claims
LGA-001 verified
The manifest tags a program names become controller-scope Logix tags carrying their initial values and descriptions; a tag no program names is not written, unless `target.logix` sets `all-tags: true`, and then every manifest tag with a type the subset carries is a controller tag, named or not.
- pass
TestManifestInitsAndDescriptionsLandOnControllerTagsinlogix/writer - pass
TestImplicitTagsBecomeControllerTagsinlogix/writer - pass
TestAllTagsWritesTagsNoProgramNamesinlogix/writer(3 of 3 passed) - pass
TestAllTagsSkipsWhatLogixCannotCarryinlogix/writer - pass
TestLogixDeployAllTagsAndControllerScopedincmd/naut
LGA-002 verified
`VAR_EXTERNAL` is optional: a ladder or ST program that names a manifest tag it did not declare still gets its controller tag, typed from the manifest. A manifest tag with no `role:` stops `naut logix deploy` and `naut logix write` with an error naming the tag.
- pass
TestImplicitTagsBecomeControllerTagsinlogix/writer - pass
TestImplicitTagsInSTinlogix/writer - pass
TestImplicitTagsLadderMembersAndLiteralsinlogix/writer - pass
TestLogixDeployTypesUndeclaredTagsFromTheManifestincmd/naut - pass
TestLogixDeployRefusesATagWithNoRoleincmd/naut
LGA-003 verified
The task becomes a periodic Logix task at the task's scan rate, the program a Logix program and its rungs the `MainRoutine`.
- pass
TestTaskSchedulesThePrograminlogix/writer - pass
TestDemoLineMatchesTheRealExportinlogix/writer - pass
TestLogixDeployNamesTheTaskProgramAndRoutineincmd/naut
LGA-004 verified
`side.heartbeat` adds a second Logix program, `Nautilus`, scheduled after the user's, that counts task scans in the named DINT and never touches the user's routine.
- pass
TestSideCodeHeartbeatinlogix/writer
LGA-005 verified
The Logix target takes one task running one ladder or structured text program; a multi-task project and FBD or SFC programs are refused.
LGA-006 verified
Contacts `X` `/X`, branches (nesting kept) and coils `( X )` `( S X )` `( R X )` are written as `XIC` `XIO`, `[ , ]` and `OTE` `OTL` `OTU`.
- pass
TestNeutralTextSpellinginlogix/writer
LGA-007 verified
Edge contacts and edge coils (`+X`, `-X`, `( P X )`, `( N X )`) are written as `ONS` and `OSF` with generated storage bits.
- pass
TestEdgeCoilsinlogix/writer - pass
TestEdgeAtBranchLegHeadinlogix/writer - pass
TestGolden/subsetinlogix/writer
LGA-008 verified
Compares become the Logix compare instructions (an expression operand becomes `CMP`), and `{ y := expr }` becomes `MOVE`, `ADD`, `SUB`, `MUL` or `DIV` for one operation on plain operands, `ABS` for `ABS(x)`, and `CPT` for anything else (`MOD`, unary `-`, `SQRT` as `SQR`, `**` or `EXPT`, nested expressions).
- pass
TestAssignmentsAndExpressionComparesinlogix/writer - pass
TestGolden/subsetinlogix/writer - pass
TestLEIsAPlainCompareinlogix/writer
LGA-009 verified
In ladder, `TON`, `TOF` and `CTU` blocks are written as the Logix instructions on `TIMER` / `COUNTER` tags; in ST, as `TONR(t)` (with `t.Reset := NOT IN`), `TOFR(t)` and `CTUD(c)` on `FBD_TIMER` / `FBD_COUNTER` tags. Either way `t.Q` is written as `t.DN`, `t.ET` as `t.ACC` and `c.CV` as `c.ACC`.
- pass
TestNeutralTextSpellinginlogix/writer - pass
TestCounterEndsItsRunginlogix/writer - pass
TestOutputCapturesAndResetConditionsinlogix/writer - pass
TestGolden/subsetinlogix/writer - pass
TestStructuredTextinlogix/writer - pass
TestSTTOFAndCounterValueinlogix/writer
LGA-010 verified
`Word.3` is written as bit 3 of the word, as Logix spells it.
- pass
TestBitAccessPassesThroughinlogix/writer
LGA-011 verified
An array of timers or counters (`ARRAY [0..3] OF TON`) becomes one Logix `TIMER` or `COUNTER` tag with the array's dimension (`TIMER[4]`).
- pass
TestArraysOfBlocksinlogix/writer
LGA-012 verified
TIME becomes a DINT of milliseconds where it feeds a preset, and the elementary types BOOL, SINT, INT, DINT, REAL, LREAL map to the same Logix types.
- pass
TestTimerPresetLandsInTheTaginlogix/writer - pass
TestGolden/subsetinlogix/writer
LGA-013 verified
STRUCT types in a library become UDTs.
- pass
TestUserDefinedTypesinlogix/writer
LGA-014 verified
Enumerations become `DINT` tags, and a member, plain or qualified (`Run`, `Mode#Run`), is written as its integer value.
- pass
TestEnumerationsAreDINTinlogix/writer
LGA-015 verified
A user FUNCTION_BLOCK, in ladder or ST, becomes an Add-On Instruction.
- pass
TestAddOnInstructionFromLadderBlockinlogix/writer - pass
TestAddOnInstructionPowerAndSTinlogix/writer
LGA-016 verified
An ST program's assignments, IF, CASE, FOR, WHILE, REPEAT, EXIT, operators and maths are written as Logix ST, close to as written.
- pass
TestStructuredTextinlogix/writer - pass
TestStructuredTextLoopsAndExitinlogix/writer
LGA-038 partly verified
An ST conversion is written as Logix that computes nautilus's result: a narrowing wraps in integer arithmetic, an integer meets REAL as `(v * 1.0)` where it would otherwise divide as integers, a BOOL becomes a number through an `IF`, and REAL to an integer as the whole right-hand side into a tag of that integer type is a plain store, which the controller rounds halves to even as nautilus does.
- pass
TestConversionsWritteninlogix/writer - pass
TestGoldenConversionsinlogix/writer - pass
TestNarrowingWrapMatchesNautilusinlogix/writer - pass
TestRealToIntegerStoresinlogix/writer(10 of 10 passed) - pass
case 1, xd = 70000, xr = 2.5inlogix/writer/testdata/conformance/conversions - pass
case 10, xd = 5, xr = 3.5inlogix/writer/testdata/conformance/conversions - pass
case 11, xd = -5, xr = -3.5inlogix/writer/testdata/conformance/conversions
LGA-017 partly verified
What the target cannot express is a `naut check` diagnostic that names the construct, and the alternative where Logix has one, carries a stable `logix/<rule>` ID and a line, and stops the writer from emitting any document.
- pass
TestRejectionsinlogix/writer(31 of 31 passed) - pass
TestStructuredTextRejectionsinlogix/writer(9 of 9 passed) - pass
TestUserDefinedTypeRejectionsinlogix/writer(6 of 6 passed) - pass
TestRefusalsTheTableNamesinlogix/writer(4 of 4 passed) - pass
TestSTAndTypeRefusalsHaveALineAndWriteNothinginlogix/writer(3 of 3 passed) - pass
TestRefusalsNameTheAlternativeinlogix/writer(13 of 13 passed)
LGA-039 verified
`logix/conversion` refuses what the controller would compute differently: REAL to an integer inside an expression or into a tag of another type, an integer `/` whose quotient meets a REAL (stored into a REAL, beside a REAL operand, compared with a REAL), and unsigned, bit-string, LINT, LTIME and STRING conversions; an all-integer division is written unchanged. On a rung the same integer `/` is refused in a DIV or CPT into a REAL, a CPT beside a REAL and a CMP against a REAL; into an integer it is written as DIV or CPT.
- pass
TestConversionsRefusedinlogix/writer(33 of 33 passed) - pass
TestIntegerDivisionUnchangedinlogix/writer(10 of 10 passed) - pass
TestLadderIntegerDivisioninlogix/writer(18 of 18 passed) - pass
minus seven by two truncates toward zeroinlogix/writer/testdata/conformance/division
LGA-040 verified
In an ST call to a user block, each input must be a tag, a member or element of one, or a literal; an expression bound to an input is refused by `logix/fb-pin` at check time. A negative number is written as one (`-5`), and a conversion that is a plain store (`DINT_TO_REAL(a)` into a REAL input) is written as its argument.
- pass
TestSTBlockCallInputsinlogix/writer(16 of 16 passed)
LGA-018 verified
A project with a `target: logix` section gets the Logix rules from `naut check` without asking, and `naut check --target logix` applies them to any project.
LGA-019 partly verified
`dialect: logix` adds a `TONR` block to every program in the project, with `Reset` clearing it while TRUE, and a free-running pulse spelled `t:TONR(PT := T#1S, Reset := t.Q)`; the default dialect adds nothing.
- pass
TestLogixLibraryParsesAndIsDeclarationsOnlyininternal/dialect
LGA-020 verified
In ladder the writer emits a `TONR` as a `TON` with a `RES(t)` rung ahead of the timer's rung; in ST, as `TONR(t);` on an `FBD_TIMER` whose `.Reset` is TRUE while `Reset` is TRUE or `IN` is FALSE.
- pass
TestTONRinlogix/writer
LGA-021 verified
A tag's `alias:` is written as a Logix alias tag (`AliasFor`) and the program names the tag; the nautilus runtime ignores the binding, so the same source runs in simulation.
- pass
TestAliasTagsinlogix/writer - pass
TestAliasedTagsRunInSimulationAndDeployAsAliasesincmd/naut
LGA-052 partly verified
With `target.logix.hardware` set, the writer puts that L5X's `<Modules>` section into the project unchanged, in place of the generated controller module. An alias of a rack point whose module the configuration lacks (a slot of `Local` or of an adapter, or a module by name), or with no configuration at all, stops `naut logix write` and `naut logix deploy` with `logix/io-module` naming the alias and the module; a configuration whose `Local` module is not the target's processor at its revision stops them with `logix/hardware`. A project written with a configuration imports and builds in Logix Designer with its aliases resolved.
- pass
TestHardwareModulesWrittenVerbatiminlogix/writer(3 of 3 passed) - pass
TestIOModuleRuleinlogix/writer(11 of 11 passed) - pass
TestHardwareMustMatchTheTargetinlogix/writer(3 of 3 passed) - pass
TestRackPointinlogix/writer - pass
TestAliasedTagsRunInSimulationAndDeployAsAliasesincmd/naut - pass
TestLogixImportHardwareRoundTripincmd/naut - skip
TestSDKConvertAndBuild/iolineinlogix/writer
LGA-022 verified
`naut logix import --project` writes a nautilus project from a full export: the manifest with `target: logix` filled from the controller (and `dialect: logix` when the export uses its idioms), the tags with their descriptions, UDTs as IEC types, every ladder routine as a PROGRAM and every AOI as a FUNCTION_BLOCK in `lib/`.
- pass
TestLogixImportProjectincmd/naut - pass
TestDemoLineImportsAndWritesBackinlogix/importer - pass
TestUDTConformanceImportsAndWritesBackinlogix/importer - pass
TestAOIConformanceImportsAndWritesBackinlogix/importer - pass
TestDialectAndAliasImportinlogix/importer - pass
TestEveryLadderRoutineBecomesAPrograminlogix/importer
LGA-053 verified
`naut logix import --project` of an export with I/O modules writes `hardware.L5X`, the export's `<Modules>` section unchanged, and names it in the manifest (`target.logix.hardware`), so the write-back carries the same modules with the alias tags on them; an export whose only module is the controller's own gets no hardware file.
- pass
TestImportCarriesHardwareinlogix/importer - pass
TestLogixImportHardwareRoundTripincmd/naut - pass
TestParseModulesinlang/l5x
LGA-023 verified
A rung with no nautilus form is kept as a comment and reported, never guessed at.
- pass
TestRefusalsKeepTheProgramValidinlogix/importer - pass
TestVarietyReportsWhatItCannotCarryinlogix/importer
LGA-024 verified
Alias tags and rack points the logic names directly become tags with `alias:`, and a `RES` on a timer run by `TON` imports as `dialect: logix` `TONR`. A rung that names an alias tag comes in like any other: the tag takes its target's type, whether the target is a tag, a member of a UDT or Add-On Instruction instance, an array element, a bit or a rack point's bit. An alias the export cannot type, such as one of a whole rack word with no module definition, is refused by name.
- pass
TestDialectAndAliasImportinlogix/importer - pass
TestEveryLadderRoutineBecomesAPrograminlogix/importer - pass
TestAliasTagsInRungsImportAndRoundTripinlogix/importer - pass
TestAliasTagsTheExportCannotTypeAreRefusedByNameinlogix/importer
LGA-044 verified
An imported project writes back with the export's tags where the export had them: a controller-scoped timer, counter or Add-On Instruction instance, declared in its program, is listed under `target.logix.controller-scoped` with its description and written back at controller scope, and with `all-tags: true` a controller tag no imported routine names is written back too, the tag file typing each tag. A tag with no nautilus type, or one the subset lacks, is reported. On the public yardstick (`examples/batch-skid/line/Line.L5X`) the logic comparison finds no differences.
- pass
TestLogixRoundTripYardstickCLIincmd/naut - pass
TestRoundTripPublicYardstickinlogix/importer - pass
TestImportTypesEveryControllerTaginlogix/importer - pass
TestControllerScopedVarBecomesAControllerTaginlogix/writer - pass
TestControllerScopedAOIInstanceinlogix/writer - pass
TestControllerScopedRefusesWhatIsNotAProgramVarinlogix/writer - pass
TestLogixDeployAllTagsAndControllerScopedincmd/naut
LGA-045 partly verified
An import carries each UDT's description and its members' into the project, as the declarations' trailing comments, and a write puts them back on the `<DataType>` and its `<Member>`s; the written file claims the Logix Designer release of the target's own revision (36.00 for a v36 controller, 38.01 for v38).
- pass
TestLogixRoundTripYardstickCLIincmd/naut - pass
TestRoundTripPublicYardstickinlogix/importer - pass
TestUDTDescriptionsinlogix/writer - pass
TestUDTDescriptionsRoundTripinlogix/writer - pass
TestSoftwareRevisionFollowsTheTargetinlogix/writer - pass
TestTypesCarryDescriptionsinlang/l5x - pass
TestRenderCommentsinlang/stgen
LGA-026 not run in CI
On a corpus of 52 real production exports, 97.9% of rungs import, 81% of ladder routines import whole, and most complete routines write back identically or equivalently.
- skip
TestCorpusinlogix/importer
LGA-027 partly verified
`naut logix deploy` with no flag writes the project, has logixd import and build it, and says whether the running controller could take the change as an online edit or needs a download.
- pass
TestBuildOnlyReportsWhatTheControllerNeedsinlogix/deploy - pass
TestEmptyControllerNeedsADownloadinlogix/deploy - pass
TestDeployBuildsAnAOIProjectInTwoStepsinlogix/deploy
LGA-028 partly verified
`naut logix deploy --online` replaces the routine's rungs in the running program and finalizes them, leaving the controller's mode, and is refused when the tag set changed because an online edit cannot create tags.
- pass
TestOnlineEditReplacesTheRungsAndVerifiesinlogix/deploy - pass
TestOnlineEditRefusesATagChangeinlogix/deploy - pass
TestSessionEditsWithoutReopeninginlogix/deploy - pass
TestSessionRefusesATagChangeinlogix/deploy
LGA-029 partly verified
`naut logix deploy --download` refuses without `--yes`, and the controller must already be in Program mode or `--program-mode` passed.
- pass
TestLogixDeployRefusalsincmd/naut(5 of 5 passed) - pass
TestDownloadVerifiesinlogix/deploy
LGA-030 partly verified
Every deploy path ends by uploading the controller's program again and comparing its logic with what was sent.
- pass
TestOnlineEditReplacesTheRungsAndVerifiesinlogix/deploy - pass
TestDownloadVerifiesinlogix/deploy
LGA-047 partly verified
`naut logix deploy --download` keeps the controller's tag values: it uploads the running controller before the build and writes into the project the value of every tag with the same name, scope, type and dimensions on both sides (a UDT's or Add-On Instruction's definition the same too) that the project does not mark constant; a TIMER's or COUNTER's preset comes from the project, its accumulator from the controller. A tag whose type, dimensions or definition changed starts at the project's value and is reported, as are new and removed tags. `--reset-values` starts every tag at the project's value.
- pass
TestKeepValuesCarriesEveryKindOfValueinlogix/deploy - pass
TestKeepValuesTakesPresetsFromTheProjectinlogix/deploy - pass
TestKeepValuesResetsWhatChangedinlogix/deploy - pass
TestKeepValuesMatchesNamesWithoutCaseinlogix/deploy - pass
TestKeepValuesLeavesTheLogicAloneinlogix/deploy - pass
TestDownloadKeepsTheControllersValuesinlogix/deploy - pass
TestBuildReportsTheValuePlaninlogix/deploy - skip
TestHardwareDownloadKeepsValuesUnlessResetinlogix/deploy
LGA-031 verified
A program the target cannot express is refused before anything is written: `naut logix deploy` stops on the diagnostic before the agent is called.
- pass
TestSubsetDiagnosticsStopEverythinginlogix/deploy
LGA-032 partly verified
`naut logix mode [--yes run|program] <project-dir>` reads or changes the controller's mode; a change takes `--yes`.
LGA-033 verified
`naut logix write program.ld` writes an L5X without a project.
- pass
TestLogixWriteincmd/naut
LGA-034 partly verified
`naut test --target logix` runs the project's acceptance tests against the controller over EtherNet/IP: `given` writes go to the controller, `advance:` is wall time, `until`, `hold` and `always` are checked on every poll, and it waits on the `side.heartbeat` scan counter.
- pass
TestLiveSealInAndAlarminacceptance - pass
TestLiveUntilHoldAndAlwaysinacceptance - pass
TestLiveScansWaitOnTheHeartbeatinacceptance
LGA-035 verified
The logixd agent URL comes from `target.logix.agent` and `NAUTILUS_LOGIXD_URL` overrides it; the token comes only from `NAUTILUS_LOGIXD_TOKEN`.
- pass
TestClientDefaultsFromEnvironmentinlogix/logixd - pass
TestLogixDeployFindsTheAgentincmd/naut
LGA-036 verified
Anything outside the subset is refused, not approximated.
- pass
TestRejectionsinlogix/writer(31 of 31 passed) - pass
TestStructuredTextRejectionsinlogix/writer(9 of 9 passed) - pass
TestRefusalsTheTableNamesinlogix/writer(4 of 4 passed) - pass
TestLogixTargetRefusesSFCAndASecondTaskincmd/naut(4 of 4 passed) - pass
TestCheckTargetLogixRefusesOtherLanguagesincmd/naut
LGA-037 not run in CI
An online edit keeps every value the controller holds; a download keeps the values of the tags it can match and still stops the controller.
- skip
TestHardwareDownloadKeepsValuesUnlessResetinlogix/deploy
LGA-046 partly verified
The written project's `Local` module is Logix Designer's own for the ControlLogix 5580 (1756-L8xE), CompactLogix 5370 (1769-L30ER to 1769-L36ERM) and CompactLogix 5380 (5069-L306ER to 5069-L3100ERM) processors; for any other processor it is the 1756-L85E's, and `naut logix write` and `naut logix deploy` warn that it is, and a download from the editor reports the same warning in its progress.
- pass
TestLocalModulesMatchExportsinlogix/writer - pass
TestLocalModuleinlogix/writer - pass
TestLogixRoundTripYardstickCLIincmd/naut
LGA-041 partly verified
With `naut logix serve --project`, an online edit from the editor is the same online edit `naut logix deploy --online` makes, and its progress and result reach the editor as they happen; a change it cannot carry is refused with the way to download it.
- pass
TestDeployStreamOnlineEditinlogix/facade - pass
TestDeployStreamRefusalinlogix/facade - pass
TestProgramPlaneDeploysAnOnlineEditinlogix/facade
LGA-042 partly verified
A download from the editor is refused unless the request says yes; it sends the project with the Program-mode choice made, re-reads nautilus.yaml for it, releases the online session first and opens it again afterwards, so the next online edit is warm.
- pass
TestDeployStreamDownloadinlogix/facade - pass
TestLogixServePlaneDownloadRewarmsTheSessionincmd/naut - pass
TestLogixServePlaneReleasesTheSessionBeforeADownloadincmd/naut - pass
TestDeployStreamReportsADownloadBeforeItsWarmUpinlogix/facade
LGA-048 partly verified
A download from the editor keeps the controller's tag values as the CLI does unless the request says resetValues (the extension sends it when nautilus.logix.resetValuesOnDownload is on), and its result carries how many values were kept and which tags were reset, and why.
- pass
TestDeployStreamDownloadinlogix/facade
LGA-049 partly verified
A download from the editor reports as soon as it has verified: the online session for the next edit opens after the report, its progress following on the same stream, and an edit pushed meanwhile waits for that session and says so. Every result's time is the whole wait from the request, and a warm edit's progress reaches the editor as it happens.
- pass
TestDeployStreamReportsADownloadBeforeItsWarmUpinlogix/facade - pass
TestDeployStreamWarmsOnlyAfterADownloadinlogix/facade - pass
TestDeployStreamFlushesAtOnceinlogix/facade - pass
TestDeployStreamElapsedIsTheWholeWaitinlogix/facade - pass
TestLogixServePlaneDownloadRewarmsTheSessionincmd/naut - pass
TestLogixServePlaneEditWaitsForTheWarmUpincmd/naut
LGA-050 partly verified
A plain download refused because the controller is in Run is answered with what to do — "Switch to Program Mode and Download" — instead of the SDK's raw RxE_INVALID_START_STATE, which stays available underneath; the editor offers the Program-mode download.
- pass
TestDownloadInRunSaysToSwitchToProgramModeinlogix/deploy - pass
TestDeployStreamStartStateRefusalinlogix/facade
LGA-051 partly verified
A plain download to a controller in Run (or Remote Run) is refused as soon as the controller's mode is read, before the project is imported or built, with the same answer as the SDK's late refusal; asking for Program mode skips the check, and a mode read that fails does not block the download. An online edit's done event carries no download-only fields (valuesKept, resets).
- pass
TestDownloadInRunRefusedBeforeBuildinlogix/deploy - pass
TestDownloadProgramModeSkipsTheModeCheckinlogix/deploy - pass
TestDownloadModeReadFailureFallsThroughinlogix/deploy - pass
TestLogixServePlaneRefusesADownloadInRunUpFrontincmd/naut - pass
TestDeployStreamOnlineEditinlogix/facade
LGA-043 verified
Only one deploy runs at a time, and a deploy whose base is not what the controller runs is refused before anything is sent.
- pass
TestDeployStreamUpfrontRefusalsinlogix/facade