Skip to content

Write prescription links, and confirm a scanner accepts them - #14

Merged
bbfrederick merged 2 commits into
mainfrom
exar1-links
Sep 3, 2026
Merged

Write prescription links, and confirm a scanner accepts them#14
bbfrederick merged 2 commits into
mainfrom
exar1-links

Conversation

@bbfrederick

Copy link
Copy Markdown
Owner

The library could read a copy reference and not create one: duplicate_step
wrote empty RelationsFrom and RelationsTo entries, which is right for a
fresh scan and leaves an imported copy of a linked one silently unslaved.

link_steps

It writes the relation on the source and mirrors it onto the target as a
$ref back-pointer to the same object rather than a second copy, which is how
the console spells it. The group is checked against the menu the corpus
established, because a name outside it would put a payload in the archive that
no dialog can have produced.

The payload is an XML element whose attribute order was a guess, so the test
compares the stored string rather than decoded fields. copyparametertest
slaves eleven scans to a twelfth across all ten groups and both flags, so
stripping its links and rewriting them is an answer key rather than a sample:
all twelve come back byte for byte, Data included.

A scanner has now loaded them

An archive exercising the whole write surface at once — 54 scans: 25 sequences
that print a Special card drawn from five different exports, each carrying
one edit; and ten copy references from one source, one per menu group, on
eleven deliberately identical scans.

54 in, 54 out. Every edit survived, the six Special-card ones included.
All ten links returned with the same source, target, group and constraint, and
the eleven copies were still byte-identical. That is the one thing about
link_steps nothing could establish offline.

The console repairs a coupled set, as well as refusing one

Fifteen of the 25 came back byte-identical in ASCCONV. Nine differed only in
lScanTimeSec/lTotalScanTimeSec, the derived times Manifest.stale already
names — that is what the eja_* spectroscopy scans showing greyed during
import turned out to be, and nothing in them was damaged.

rslh_ep3d_vaso differed in three more, and they are exactly linear in the TR
that moved:

alTI[0] = 24 * TR + 10320
alTI[1] = 72 * TR + 10320
alTR[1] = 96 * TR + 20640

exact at both the old and the new value. The console recomputed a coupled set
left stale rather than refusing the protocol.

That is a second outcome beside the greyed-out scan, and it is easy to mistake
for plain success: where the sequence can derive the rest it does, and the
protocol returns consistent and changed in more places than were written.
The rule is unchanged — which outcome a given incomplete write gets is still
only knowable on a scanner, and Include Nav. = Off is the same shape and was
refused — but "rejected" and "silently repaired" are both live, and only a
diff of what came back separates them.

Testing

2349 passed, 17 skipped. Two new tests: the byte-for-byte relink against
copyparametertest, and a refusal for a group outside the console's menu.

🤖 Generated with Claude Code

bbfrederick and others added 2 commits September 3, 2026 07:02
The library could read a copy reference and not create one: duplicate_step
wrote empty RelationsFrom and RelationsTo entries, which is right for a fresh
scan and leaves an imported copy of a linked one silently unslaved.

link_steps writes the relation on the source and mirrors it onto the target
as a $ref back-pointer to the same object rather than a second copy, which is
how the console spells it. The group is checked against the menu the corpus
established, because a name outside it would put a payload in the archive
that no dialog can have produced.

The payload is an XML element whose attribute order was a guess, so the test
compares the stored string rather than decoded fields. copyparametertest
slaves eleven scans to a twelfth across all ten groups and both flags, so
stripping its links and rewriting them is an answer key rather than a sample:
all twelve come back byte for byte, Data included.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
54 scans in and 54 out. Every one of the 25 Special-card sequences kept its
edit, the six Special-card edits included, and all ten copy references came
back with the same source, target, group and constraint while their eleven
copies stayed byte-identical. So link_steps writes a link the console
accepts, which is the one thing about it nothing could establish offline.

The more interesting result is what happened to the scans that did change.
Nine differed only in the derived scan times Manifest.stale already names.
rslh_ep3d_vaso differed in three more, and they are exactly linear in the TR
we moved -- alTI[0] = 24*TR + 10320, alTI[1] = 72*TR + 10320, alTR[1] =
96*TR + 20640, exact at both the old and the new value. The console
recomputed a coupled set we had left stale rather than refusing the
protocol.

That is a second outcome beside the greyed-out scan, and worth writing down
because it is easy to mistake for success. Where the sequence can derive the
rest, it does, and the protocol returns consistent and changed in more
places than were written. Which outcome a given incomplete write gets is
still only knowable on a scanner -- Include Nav. = Off is the same shape and
was refused -- so the rule is unchanged; what is new is that "rejected" and
"silently repaired" are both live, and only a diff of what came back
separates them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@bbfrederick
bbfrederick merged commit 82b004f into main Sep 3, 2026
9 checks passed
@bbfrederick
bbfrederick deleted the exar1-links branch September 3, 2026 16:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant