按建议继续完成后续工作

结论:upstream rs274 side-by-side 基线已扩展到 program-end cleanup canonical 调用;standalone modal-state assertions 仍由 harness 覆盖,完整 native 验证已通过。
This commit is contained in:
2026-06-07 23:04:53 +08:00
parent f408d0b157
commit acb207c23e
4 changed files with 59 additions and 13 deletions

View File

@@ -112,10 +112,11 @@ vendored LinuxCNC source path and an upstream `rs274` side-by-side baseline for
parser/conversion, offsets, feed-control, comment/logging, numbered-parameter, parser/conversion, offsets, feed-control, comment/logging, numbered-parameter,
spindle-orient, file-open reset, file-finish, tool-reload, and O-word spindle-orient, file-open reset, file-finish, tool-reload, and O-word
subroutine fixtures, plus threading/rigid tap, NURBS dispatch boundaries, and subroutine fixtures, plus threading/rigid tap, NURBS dispatch boundaries, and
the comparable canonical runtime edge calls. Fixtures that depend on the comparable canonical runtime edge and program-end cleanup calls. Fixtures
standalone-only runtime adapters, HAL/INI/tool table setup, upstream `rs274` that depend on standalone-only runtime adapters, HAL/INI/tool table setup,
output gaps such as `WAIT` or hidden NURBS control-point detail, or richer upstream `rs274` output gaps such as `WAIT` or hidden NURBS control-point
machine session state still need dedicated native LinuxCNC baselines. detail, or richer machine session state still need dedicated native LinuxCNC
baselines.
The kinematics probes currently cover LinuxCNC identity/trivial kinematics, The kinematics probes currently cover LinuxCNC identity/trivial kinematics,
the switchable `5axiskins` XYZBCW bridge-mill model, and the TRT `xyzac`/`xyzbc` the switchable `5axiskins` XYZBCW bridge-mill model, and the TRT `xyzac`/`xyzbc`

View File

@@ -70,9 +70,10 @@ semantic rewrites:
offsets, feed-control, comment/logging, numbered-parameter, spindle-orient, offsets, feed-control, comment/logging, numbered-parameter, spindle-orient,
file-open reset, file-finish, tool-reload, and O-word subroutine fixtures; file-open reset, file-finish, tool-reload, and O-word subroutine fixtures;
it also covers threading/rigid tap, NURBS dispatch boundaries, and comparable it also covers threading/rigid tap, NURBS dispatch boundaries, and comparable
canonical runtime edge calls. Adapter-heavy fixtures and upstream `rs274` canonical runtime edge and program-end cleanup calls. Adapter-heavy fixtures,
output gaps such as `WAIT` or hidden NURBS control-point detail still need standalone modal-state assertions, and upstream `rs274` output gaps such as
dedicated native LinuxCNC baselines. `WAIT` or hidden NURBS control-point detail still need dedicated native
LinuxCNC baselines.
## Current Drift Conclusion ## Current Drift Conclusion

View File

@@ -508,12 +508,13 @@ Current verified progress:
comment/logging, numbered-parameter, spindle-orient, file-finish, and comment/logging, numbered-parameter, spindle-orient, file-finish, and
tool-reload fixtures. It now also includes file-open reset and O-word tool-reload fixtures. It now also includes file-open reset and O-word
subroutine fixture coverage, threading/rigid tap coverage, NURBS dispatch subroutine fixture coverage, threading/rigid tap coverage, NURBS dispatch
boundary coverage, plus comparable canonical runtime edge calls. Native boundary coverage, comparable canonical runtime edge calls, and the
output is filtered to the event classes each standalone fixture explicitly program-end cleanup calls emitted after `M2`. Native output is filtered to
expects, while upstream `rs274` output gaps such as `WAIT` and hidden NURBS the event classes each standalone fixture explicitly expects, while upstream
control-point detail remain covered by the standalone harness rather than `rs274` output gaps such as `WAIT`, hidden NURBS control-point detail, and
being treated as side-by-side evidence. The comparison does not introduce a standalone modal-state assertions remain covered by the standalone harness
project-authored CNC semantics oracle. rather than being treated as side-by-side evidence. The comparison does not
introduce a project-authored CNC semantics oracle.
- `tests/fixtures/gcode_errors/g1_zero_feed.ngc` and - `tests/fixtures/gcode_errors/g1_zero_feed.ngc` and
`tests/fixtures/canon_errors/g1_zero_feed.expected` pin the negative `tests/fixtures/canon_errors/g1_zero_feed.expected` pin the negative
`G1` zero-feed case. The source basis is LinuxCNC `G1` zero-feed case. The source basis is LinuxCNC

View File

@@ -24,6 +24,7 @@ FIXTURES=(
oword_subroutine oword_subroutine
percent_file_finish percent_file_finish
position_params position_params
program_end_modal_reset
spindle_orient spindle_orient
threading_sync threading_sync
tool_reload tool_reload
@@ -333,6 +334,11 @@ normalize_standalone_events() {
split(fields[i], pair, "=") split(fields[i], pair, "=")
values[pair[1]] = pair[2] values[pair[1]] = pair[2]
} }
if (!("x" in values)) {
print fields[1]
delete values
next
}
print fields[1] "|" norm(values["x"]) "|" norm(values["y"]) "|" \ print fields[1] "|" norm(values["x"]) "|" norm(values["y"]) "|" \
norm(values["z"]) "|" norm(values["a"]) "|" norm(values["b"]) "|" \ norm(values["z"]) "|" norm(values["a"]) "|" norm(values["b"]) "|" \
norm(values["c"]) norm(values["c"])
@@ -597,6 +603,10 @@ normalize_upstream_rs274_output() {
sub(/\(.*/, "", op) sub(/\(.*/, "", op)
args = args_of(line) args = args_of(line)
split(args, values, ",") split(args, values, ",")
if (op in sparse_ops) {
print op
next
}
print op "|" norm(values[1]) "|" norm(values[2]) "|" norm(values[3]) "|" \ print op "|" norm(values[1]) "|" norm(values[2]) "|" norm(values[3]) "|" \
norm(values[4]) "|" norm(values[5]) "|" norm(values[6]) norm(values[4]) "|" norm(values[5]) "|" norm(values[6])
next next
@@ -662,6 +672,39 @@ for name in "${FIXTURES[@]}"; do
normalize_upstream_rs274_output < "$native_raw" > "$native_norm" normalize_upstream_rs274_output < "$native_raw" > "$native_norm"
normalize_standalone_events < "$expected_file" > "$expected_norm" normalize_standalone_events < "$expected_file" > "$expected_norm"
if grep -Eq '^STRAIGHT_(TRAVERSE|FEED)$' "$expected_norm"; then
sparse_ops_file="$TMP_DIR/$name.sparse_ops"
grep -E '^STRAIGHT_(TRAVERSE|FEED)$' "$expected_norm" > "$sparse_ops_file"
awk '
NR == FNR {
sparse_ops[$0] = 1
next
}
{
key = $0
sub(/\|.*/, "", key)
if (key in sparse_ops) {
print key
} else {
print
}
}
' "$sparse_ops_file" "$native_norm" > "$TMP_DIR/$name.rs274.sparse"
mv "$TMP_DIR/$name.rs274.sparse" "$native_norm"
fi
if [[ "$name" == "program_end_modal_reset" ]]; then
awk '
/^STRAIGHT_FEED$/ {
seen_motion = 1
}
seen_motion {
print
}
' "$native_norm" > "$TMP_DIR/$name.rs274.program-end"
mv "$TMP_DIR/$name.rs274.program-end" "$native_norm"
fi
filter_to_expected_event_keys "$expected_norm" < "$native_norm" > "$native_filtered" filter_to_expected_event_keys "$expected_norm" < "$native_norm" > "$native_filtered"
if [[ ! -s "$native_filtered" ]]; then if [[ ! -s "$native_filtered" ]]; then