Skip to content

CI only, do not merge: full stack #5-#10 against main - #11

Closed
glenntosco wants to merge 33 commits into
mainfrom
claude/project-thread-5e0lug-sheet-layouts
Closed

glenntosco wants to merge 33 commits into
mainfrom
claude/project-thread-5e0lug-sheet-layouts

Conversation

@glenntosco

Copy link
Copy Markdown
Collaborator

Requested by Glenn · project thread

Draft PR that exists only so the Build workflow (which runs on PRs into main) tests the whole stack #5 → #6 → #7 → #8 → #9 → #10 on Windows now, instead of one PR at a time as each retargets. Do not merge. Merge the individual PRs in order; this one will be closed.


Generated by Claude Code

claude added 30 commits October 24, 2026 13:11
…a job

Adds a UI-free decoder for the three ~HS host status strings, a status
reader for TCP and (best effort) the Windows spooler, and an opt-in check
in PrintService: a blocking fault (head open, paper out, ribbon out, head
too hot, diagnostics mode, buffer full, paused) stops the job before any
byte is sent, an unknown status never blocks, and a verification after the
job reports finished, fault after job or could not verify as a notice.
…ter settings

Adds a per-transport switch (on for network printers, off for Windows
printers), a Check printer status button that shows the decoded ~HS reply,
plain-language messages for a held-back job and for the verification after
it, and a single verification after the last job of a batch print. All new
texts are in English and Spanish.
Reads the ~HS status of an allowed Windows printer and returns what stops
it from printing in plain words. It sends a command to the printer, so it
needs the printing permission (allowPrinting and allowedPrinters), but no
confirmation token because nothing is printed.
…achable

Windows retries a refused TCP connection for about two seconds, so a closed
port often ends in the timeout instead of a SocketException. Report that as
Unreachable, not NoReply.
Three 5 ms polls took longer than the 300 ms verification limit on a busy CI
runner. These tests count polls, so they now use a 30 s limit; the scripted
reader still ends them after the expected reply.
…cing

Add StationConfigLoader (station.json next to the labels, a folder, a
single label or the ProgramData policy file), validated with
StationConfig.* message keys; StationPin (PBKDF2-SHA256 hash and
constant-time verify); and the UI-free ScanSequencer that turns Enter,
Tab and Shift+Tab into field moves, print and label selection.
A locked, print-only station window with label tiles and search, large
prompt fields with scanner input, quantity limits, live preview and a
big plain-words printer status. Printing goes through IPrintService with
the status check on, then the prompts reset keeping the configured
values. Exit is PIN-gated with a lockout. Entry points: --station,
--station-pin and two File menu items. Strings in en and es.
Add docs/print-station.md (entry points, station.json schema, problem
keys, status meanings, PIN), a decisions entry, the README feature rows
and sections in English and Spanish, and the changelog entry.
Rotula.Files.Policy reads SOFTWARE\Policies\P4Software\Rotula from HKLM and
HKCU (the computer wins, value by value) behind IPolicySource. Policies fix the
language and the update check, suggest a default printer, keep user-folder
add-ons from loading, and switch MCP printing or database access off. The MCP
server applies them on top of its settings file and can only be restricted,
never widened. ADMX with en-US and es-ES ADML ship in packaging/policies; tests
check the template value names against PolicyNames.
Settings fixed by a policy are disabled with a "Managed by your organization"
note. Help > Check for updates once a day is off by default; when the user or a
policy switches it on, Rotula sends at most one anonymous GET of the GitHub
latest-release API a day and shows a non-modal notice linking to the release
page. Nothing is downloaded or installed. Version compare, schedule, parsing and
the checker are UI-free with tests; HTTP is behind IReleaseFeed.
A WiX Toolset v5 project (packaging/msi, build tool only, not in Rotula.sln)
installs Rotula per machine to Program Files with a Start menu shortcut, the
.rotula association, ARP metadata and a fixed UpgradeCode with MajorUpgrade.
build-installer.ps1 builds it from the signed stage folder, signs and verifies
it like the setup exe, and publishes it. The Inno installer now accepts
/ALLUSERS and /CURRENTUSER on the command line.
The installer manifest offers the per-user Inno installer and the machine-scope
MSI (ProductCode read from the signed MSI, fixed UpgradeCode). Adds a Spanish
locale manifest.
New docs/deployment.md covers silent installs, the MSI, exit codes, Intune,
Group Policy, Configuration Manager and the policy settings. CONTRIBUTING and
decisions now state the update-check rule precisely: no network traffic unless
the user or an administrator enables it, and nothing is sent about the user.
…I runner

postgres.exe exits at once when the account has administrative rights,
which is the case on the GitHub Windows runner, so Start-TestServers failed
with "The server stopped right after starting". pg_ctl starts the server
with those rights removed. Start/timeout errors now also print the last
lines of the server log, since Stop-TestServers deletes it in CI.

Claude-Session: https://claude.ai/code/session_01M3Pqt8Ubw3fJwBV3ztYKQV
The gate reads the first coverage.cobertura.xml under coverage/raw, and the
folders are random GUIDs. Rotula.Data.Packs.Tests also produced a report,
with Rotula.Core almost uncovered, so the gate failed whenever that one
sorted first (0.54% on PR #4). Drop its coverlet.collector, the same as
Rotula.Data.Integration already does.

Claude-Session: https://claude.ai/code/session_01M3Pqt8Ubw3fJwBV3ztYKQV
Every key of Strings.en.resx, with the same placeholders, access keys
and technical tokens (ZPL commands, GS1 AIs, extensions, product name).
Every key of Strings.en.resx, following OQLF usage: courriel, and a
non-breaking space before : ; ! ? and inside guillemets. Placeholders,
access keys and technical tokens are kept as in English.
Loc.SupportedLanguages now lists en, es, pt-BR and fr-CA by full culture
name, and LanguageCode returns that name. On first run any Portuguese
desktop gets pt-BR, any French one fr-CA, Spanish es and the rest
English; saved en/es settings keep their meaning. View > Language lists
each language in its own name.

The parity tests now check every Strings.*.resx against English (keys,
placeholders, access keys, no empty value, French typography), and the
key-coverage tests run over Loc.SupportedLanguages instead of en/es.
README (en/es), CONTRIBUTING, the PR checklist, the changelog and the
design decisions now say every new string needs en, es, pt-BR and
fr-CA. The installer offers Brazilian Portuguese and French.
pt-BR and fr-CA for the 137 keys the printer status check, the print
station and the managed settings / update check added.
The Language policy reads every shipped language case-insensitively and
hands on the canonical culture name; the ADMX enum, both ADML files and
docs/deployment.md list all four. The managed lock covers the new menu
entries, and the tests of the earlier branches that looped over en/es
now use Loc.SupportedLanguages.
…utral status test

Archivo and Ayuda both took Alt+A, so Alt+A never reached Help. Help is now
Ay_uda (Alt+U). The printer-status text test now accepts the French « » quotes.
The Preview window opens on "As printed" for a label set to ^POI or ^PMY, explains why the picture is turned and offers an "As designed" switch. The renderer flips the whole label inside LabelRenderer.Draw; only LabelDocumentAdapter.AsPrinted sets it, so the canvas and PNG/JPEG/PDF exports stay as designed. The status bar names a label that prints upside down or mirrored. Adds renderer pixel tests, importer round-trip tests, a golden file and view-model tests; marks ^PO and ^PM as previewed in the command catalogue.
pt-BR and fr-CA for the 14 keys of the As printed / As designed preview
and the status bar note.
A UI-free model of label sheets for office printers (paper, margins, label
size, grid, pitch), validation with message keys, a small set of generic
Letter and A4 templates described by their dimensions, and the imposition
that fills sheets in order with a start position.
MergeBatch labels and LabelPrintRun now expose the resolved values of
every label (same record iteration and serial numbers as the ZPL), and the
renderer can draw a label from those values without resolving counters
again. SheetExporter places the labels on sheets at their physical size
and writes one PDF page per sheet, with optional crop marks or outlines.
An optional root "sheet" object; older builds ignore it, so it does not
raise the format version. A section that makes no sense is dropped.
File > Export > Label sheets (PDF) and a button in the Print dialog open a
dialog to pick a generic sheet template or type a custom layout, see the
positions, start at a later position on a partly used sheet and save the
labels (or the ticked records) as a PDF at the sheet's real size. Serial
numbers are reserved and confirmed as for printing; the chosen layout is
saved with the label. English and Spanish texts.
pt-BR and fr-CA for the 66 keys of the Label sheets dialog, its enums
and its layout checks.
The main window applies the saved language when it opens, which put the test
back in English before the sheet dialog built its template names.
@glenntosco
glenntosco force-pushed the claude/project-thread-5e0lug-sheet-layouts branch from a31abde to d2a5ed4 Compare October 24, 2026 14:15
@glenntosco glenntosco closed this Oct 24, 2026
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.

2 participants