Commit Graph
61 Commits
Author SHA1 Message Date
spencerm 3147fedf24 Merge pull request 'Build Seth's changes C1 to C11' (#54) from seth-changes into main
ci / server (push) Failing after 25s
ci / frontend (push) Successful in 53s
ci / image (push) Skipped
ci / e2e (push) Skipped
Reviewed-on: #54
2026-10-30 23:22:33 +00:00
spencermandClaude Opus 5.5 70a97398f1 Build Seth's changes C1 to C11 (Gitea issues 1, 8, 18, 23, 24, 25, 27, 31, 32, 33, 36)
ci / server (pull_request) Successful in 12m48s
ci / frontend (pull_request) Successful in 54s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Successful in 4m38s
- C1 (issue 1): over target follows VISUAL ticket hours, not the timer.
- C2 (issue 24): a Q.C. reject always needs a reason; accept needs an NCR number after a reject without one.
- C3 (issue 25): an incomplete unit ITP blocks filing.
- C4 (issue 27): prints open the print dialog on the page, no new tab.
- C5 (issue 31): filing is blocked while VISUAL shows a work order open; the feed sets vclosed on VISUAL packets.
- C6 (issue 8): the data book leaves out the history pages.
- C7 (issue 18): the supervisor approves each received short; accept and filing wait for it.
- C8 (issue 23): per-department checklists, edited by the department supervisor or Admin, frozen at START.
- C9 (issue 32): Q.C. and Clerical may run the stamp check.
- C10 (issue 33): the PM screen and reports are for PS-ProjectMgmt and Admin only.
- C11 (issue 36): the Stall screen lists the packets assigned to the welder, at the supervisor's stall.

Migration 0011. Docs: PLAN (also issue 9 confirmed, issue 4 asked), POLICY, SECURITY, SCHEMA, FEED, README, CHANGELOG.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 16:36:49 -06:00
spencerm 150c507a31 Merge pull request 'Record Seth's 2026-10-28 answers (changes C6 to C11)' (#53) from seth-answers-3 into main
ci / server (push) Successful in 11m47s
ci / frontend (push) Successful in 54s
ci / image (push) Successful in 16s
ci / e2e (push) Successful in 4m25s
Reviewed-on: #53
2026-10-30 22:36:22 +00:00
spencermandClaude Opus 5.5 1ae6819289 docs: record Seth's 2026-10-28 answers (issues 7, 8, 11, 13, 17, 18, 23, 30, 32 to 36; changes C6 to C11)
ci / frontend (pull_request) Successful in 52s
ci / server (pull_request) Successful in 11m18s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Successful in 4m13s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:35:17 -06:00
spencerm 58f1be8871 Merge pull request 'Record Seth's answers on issues 1, 21, 24, 25, 27, 31 (changes C1 to C5)' (#52) from seth-answers-2 into main
ci / frontend (push) Successful in 50s
ci / server (push) Successful in 11m14s
ci / image (push) Successful in 58s
ci / e2e (push) Successful in 4m29s
Reviewed-on: #52
2026-10-28 17:13:12 +00:00
spencermandClaude Opus 5.5 29528bb8b3 docs: record Seth's answers on issues 1, 21, 24, 25, 27, 31 (changes C1 to C5)
ci / frontend (pull_request) Successful in 49s
ci / server (pull_request) Successful in 11m12s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Successful in 4m1s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 15:49:19 -06:00
spencerm ae51eaeee2 Merge pull request 'Record Gitea answers: Seth's keep-as-built (6, 10, 14, 15, 16, 22, 26, 28, 29), archive (7), VMs (37)' (#51) from seth-keep-answers into main
ci / frontend (push) Successful in 48s
ci / server (push) Successful in 11m8s
ci / image (push) Successful in 13s
ci / e2e (push) Successful in 4m14s
Reviewed-on: #51
2026-10-27 21:45:44 +00:00
spencermandClaude Opus 5.5 226f505648 docs: test moves to its own native VM as well; docker-1 keeps CI (Gitea issue 37)
ci / frontend (pull_request) Successful in 49s
ci / server (pull_request) Successful in 11m3s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Successful in 4m15s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 15:16:07 -06:00
spencermandClaude Opus 5.5 d9aab10987 docs: production on its own Linux VM, natively (Gitea issue 37)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 15:15:18 -06:00
spencermandClaude Opus 5.5 b2f3213e16 plan: archive location on the QNAP NFS share (Gitea issue 7)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 15:13:17 -06:00
spencermandClaude Opus 5.5 20ee7a8130 docs: issue 6 keeps every tightening row, Shipping filing included
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 15:03:12 -06:00
spencermandClaude Opus 5.5 8e69b38e0b docs: record Seth's keep-as-built answers (Gitea issues 6, 10, 14, 15, 16, 22, 26, 28, 29)
ci / frontend (pull_request) Successful in 47s
ci / server (pull_request) Successful in 11m33s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Successful in 4m10s
Issue 6 keeps every tightening row except filing for packets routed to
Shipping, which is still asked on the issue.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 14:57:34 -06:00
spencerm 9764e5d11c Merge pull request 'Config review: record Gitea answers on issues 2 and 12' (#50) from config-review into main
ci / frontend (push) Successful in 48s
ci / server (push) Successful in 11m26s
ci / image (push) Successful in 13s
ci / e2e (push) Successful in 4m8s
Reviewed-on: #50
2026-10-27 20:55:47 +00:00
spencerm 288804d5f5 Merge pull request 'Phase 9: Admin completion, reconcile, notifications, integrity, backups' (#49) from phase-9 into main
ci / frontend (push) Successful in 50s
ci / server (push) Successful in 11m18s
ci / image (push) Successful in 51s
ci / e2e (push) Successful in 4m13s
Reviewed-on: #49
2026-10-27 20:54:46 +00:00
spencerm 13e948ebea Merge branch 'phase-9' into config-review
ci / server (pull_request) Successful in 11m3s
ci / image (pull_request) Skipped
ci / frontend (pull_request) Successful in 51s
ci / e2e (pull_request) Successful in 4m16s
2026-10-27 14:35:32 -06:00
spencermandClaude Opus 5.5 8528e38448 ci: re-run after two e2e jobs collided on the CI stack name
ci / frontend (pull_request) Successful in 51s
ci / server (pull_request) Successful in 11m12s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Successful in 4m7s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 14:18:52 -06:00
spencerm f15d8c5fb0 Merge branch 'phase-9' into config-review
ci / server (pull_request) Successful in 11m9s
ci / frontend (pull_request) Successful in 49s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Failing after 27s
2026-10-27 14:05:20 -06:00
spencermandClaude Opus 5.5 7a43236630 deps: pypdf 6.21.1 to 6.21.2
ci / frontend (pull_request) Successful in 52s
ci / server (pull_request) Successful in 11m16s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Failing after 34s
The CI dependency scan flags GHSA-6c7f-9265-g8fw, GHSA-jr96-gvgh-j3r4
and GHSA-gmh7-3g9r-mjh5 against 6.21.1, all fixed in 6.21.2.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 14:05:18 -06:00
spencermandClaude Opus 5.5 9cbfe4b996 docs: record config answers from Gitea issues 2 and 12
ci / frontend (pull_request) Successful in 59s
ci / server (pull_request) Failing after 1m39s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Skipped
Issue 2 (SethD, 2026-10-26): the PIN is enough for every sign-off,
Q.C. accept and filing included. Issue 12: SethD left the gone and
suspect-batch numbers to Spencer; the defaults stay.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 13:25:18 -06:00
spencermandClaude Opus 5.5 a82e056b6a Phase 9: Admin completion, reconcile, notifications, integrity, backups
ci / frontend (pull_request) Successful in 1m11s
ci / server (pull_request) Successful in 12m2s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Successful in 6m1s
Admin: Departments (name and stations; add shows the three groups IT must
create), Profiles (welder stamp, station limits, active) with a CSV import
that previews and applies only when clean, Checklists (weld and plain),
Security (session, lockout and rate-limit settings with bounds, alerts for
the last 24 hours, the integrity result), Access log with filters and a
guarded CSV, Who is in, Stamp check, Notifications, and the employeeID
flags. Every Admin change is audited.

Worker: ad-reconcile (nightly and on "refresh from AD now"), session-refresh
(15 minutes), integrity (seals, asset hashes, missing and orphan files, the
audit chain), backup-check, notify-send and notify-digest. Notifications
route per event type to AD groups, users, mailboxes or the department
Supervisor group, immediately or in a daily digest, over STARTTLS verified
against the PESCO CA, with dry run on the test stack.

Backups: scripts/backup/ps-backup.sh and ps-restore.sh with a systemd timer
at 02:00 America/Denver. Restore rehearsed on the test stack 2026-10-21.
CI: pip-audit and npm audit. pypdf 6.21.1 and certifi 2026.10.19.

Migration 0010. Closes the app part of I6, M3, O1, O2 and S3.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 18:27:09 -06:00
spencerm ce28d2f3c6 Merge pull request 'Work-order codes no longer overlap, Materials before Heat map, 60 min idle for Admin and Clerical (#42, #44, #45)' (#48) from issues-42-44-45 into main
ci / frontend (push) Successful in 52s
ci / server (push) Successful in 11m7s
ci / image (push) Successful in 1m26s
ci / e2e (push) Successful in 5m13s
Reviewed-on: #48
2026-10-21 20:39:27 +00:00
spencermandClaude Opus 5.5 9f354a0647 tests: /me session shape includes lock_minutes
ci / frontend (pull_request) Successful in 50s
ci / server (pull_request) Successful in 11m16s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Successful in 4m22s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 14:22:12 -06:00
spencermandClaude Opus 5.5 de5b361d85 Work-order codes no longer overlap (#42), Materials before Heat map (#44), 60 min idle for Admin and Clerical (#45)
ci / frontend (pull_request) Successful in 54s
ci / server (pull_request) Failing after 12m12s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Skipped
- Traveler: each work-order line shrinks, then clips, to fit its own box; 18 pt gap between boxes
- Work orders tab: card text wraps inside the card, smaller work order, wider cards
- Packet tabs: Materials before Heat map
- Sessions: SESSION_DESK_MINUTES (60) for Admin and Clerical lock and sign-out; /me answers
  lock_minutes and the browser's idle lock follows it

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 13:16:26 -06:00
spencerm b0f6a09173 Merge pull request 'drawings: VISUAL's rev is the source of truth; attach it when M-Files holds it Effective or Retired' (#47) from visual-rev-is-truth into main
ci / frontend (push) Successful in 42s
ci / server (push) Successful in 10m49s
ci / image (push) Successful in 38s
ci / e2e (push) Successful in 4m6s
Reviewed-on: #47
2026-10-19 23:21:34 +00:00
spencermandClaude Opus 5.5 ca407a2db3 drawings: VISUAL's rev is the source of truth; attach it when M-Files holds it Effective or Retired
ci / frontend (pull_request) Successful in 43s
ci / server (pull_request) Successful in 11m3s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Successful in 3m52s
When M-Files' Effective rev differs from the rev VISUAL calls, the drawing
job looks that rev up (MFilesKit DrawingLookup.revision). If M-Files has
it as Effective or Retired, the job copies it into drawing_revisions and
attaches it to the draft with no flag and no Clerical approval, so the
draft can auto-release. Past draft, already attached or with a hand
drawing: unchanged, no flag and no change order.

Any other status, or no document at that rev, still flags rev_mismatch
with a note saying why. Packet Station only ever attaches Effective or
Retired drawings. rev_approve stays for that case only.

This replaces the "Use rev V as VISUAL calls it" choice from #46: the
use=called path in rev-approve and its button are removed. A packet that
already kept the rev that way keeps it, since that rev is now used anyway.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 16:05:57 -06:00
spencerm c5bf48ac50 Merge pull request 'drawings: on a rev mismatch, Clerical can keep the retired rev VISUAL calls (#41)' (#46) from issue-41-retired-rev into main
ci / frontend (push) Successful in 43s
ci / server (push) Successful in 10m50s
ci / image (push) Successful in 47s
ci / e2e (push) Successful in 3m46s
Reviewed-on: #46
2026-10-19 21:05:14 +00:00
spencermandClaude Opus 5.5 f2f66db6ed deps: pin mfileskit 0.1.3 in requirements-pesco.txt too
ci / frontend (pull_request) Successful in 42s
ci / server (pull_request) Successful in 11m31s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Successful in 4m8s
CI and the image install from server/requirements-pesco.txt, which still
pinned 0.1.2 while pyproject asked for 0.1.3, so pip check failed. Its
runtime dependencies are unchanged from 0.1.2.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 13:54:24 -06:00
spencermandClaude Opus 5.5 bb8eb17748 drawings: on a rev mismatch, Clerical can keep the retired rev VISUAL calls (#41)
ci / server (pull_request) Failing after 17s
ci / frontend (pull_request) Successful in 42s
ci / image (pull_request) Skipped
ci / e2e (pull_request) Skipped
When VISUAL calls a rev that M-Files has retired, the draft is still
flagged rev_mismatch, but the drawing job now also copies the rev VISUAL
calls (MFilesKit 0.1.3 DrawingLookup.revision) into drawing_revisions and
visual.called. A Clerical Supervisor picks either rev on the packet:
"Use latest rev N" as before, or "Use rev V as VISUAL calls it"
(rev-approve with use=called), with a reason and a signature.

The kept rev holds while M-Files' Effective rev stays the one chosen
against: no flag, no change order. A newer Effective rev flags the
packet again; a new VISUAL rev clears the choice.

Migration 0009 adds drawing_revisions. Needs mfileskit 0.1.3.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 13:39:14 -06:00
spencermandClaude Opus 5.5 4c0cba4da5 frontend: find bar project filter is an All projects / All units select pair (#40)
ci / frontend (push) Successful in 43s
ci / server (push) Successful in 10m46s
ci / image (push) Successful in 34s
ci / e2e (push) Successful in 4m3s
The find bar reused the New Packet two-step picker, which put a project
search and a list of project cards inside the bar. It now has two selects
like the old build: All projects or one active project, then All units or
one of its units. A saved pick no longer in the active list still shows.

Closes #40

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 12:29:06 -06:00
spencermandClaude Opus 5.5 77d40f6c05 docs: apply the closed Gitea decisions 3, 19, 20 and 38
ci / frontend (push) Successful in 44s
ci / server (push) Successful in 10m45s
ci / image (push) Successful in 33s
ci / e2e (push) Successful in 3m58s
- Issue 3 (Q4b): the registered-device cookie stays; no device certificate.
- Issue 19 (Q22): upload limits stay; ClamAV stays off in both stacks,
  the workstations run Microsoft Defender.
- Issue 20 (Q23): the storage alert stays at 85 percent; phase 9 mails
  it to PS-Admins.
- Issue 38 (OPS2): the test stack stays under ~/packetstation/test on
  docker-1. test.env.example, the compose header, README, CLAUDE.md,
  DEPLOY.md and SECURITY.md give that path and the actual modes. The
  production layout is asked on issue 38.

All four confirm the built defaults, so no code changed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 08:11:06 -06:00
spencermandClaude Opus 5.5 ba0720eb2e scripts: vsql rollback selection consults RestartPending again
ci / frontend (push) Successful in 1m5s
ci / server (push) Successful in 12m25s
ci / image (push) Successful in 13s
ci / e2e (push) Failing after 4m12s
b7c22e1 shipped without the RestartPending check in the snapshot selection:
a mutation test on the tests' own predicate failed to restore the file before
the commit. A snapshot is open again while an instance is unrestored or its
restart has not succeeded, so -Rollback -RestartInstances retries it.

Pester green on this exact file: PowerShell 7.6 (63) and 5.1 (62, 1 skipped).
The three retry tests fail without the check (mutation run on a copy).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 21:59:07 -06:00
spencermandClaude Opus 5.5 b7c22e1988 scripts: vsql certificate script recovery paths from the second review
ci / frontend (push) Successful in 41s
ci / server (push) Successful in 11m2s
ci / image (push) Successful in 57s
ci / e2e (push) Failing after 4m25s
- A rollback record now says which restarts succeeded. A snapshot stays open
  while an instance is unrestored or its restart failed (or was declined), so
  -Rollback -RestartInstances retries exactly those instead of reporting done
  or stepping back to an older deployment.
- Running dependents (SQL Server Agent) are written to dependents-<service>.json
  before the stop and removed once they run again, so a failed restart does not
  leave Agent stopped for good.
- GetRegValue returns $null only for a value confirmed absent; a missing key or
  read error throws, so it is never snapshotted or verified as absent.
- Instances come from the value names of Instance Names\SQL; the 'PS*' filter
  dropped names such as PSREPORTING.

Tests for each, including the real registry operations on an HKCU test key.
Pester green on PowerShell 7.6 (63) and Windows PowerShell 5.1 (62, 1 skipped).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 21:50:34 -06:00
spencermandClaude Opus 5.5 90adcebc44 scripts: vsql certificate script fixes the six review findings, with a Pester suite on PowerShell 5.1 and 7
ci / frontend (push) Successful in 43s
ci / server (push) Successful in 11m3s
ci / image (push) Successful in 12s
ci / e2e (push) Failing after 4m2s
- Admin check uses -not (IsAdmin); the old call passed -eq $false as arguments.
- Named instances: WQL filter Name='MSSQL$DEV' unescaped, lookup errors surface.
- SANs decoded from the raw extension (DER walk) and matched as whole names.
- Immutable deploy-, request- and rollback- records; already-bound instances
  get no snapshot; -Rollback takes the newest snapshot not yet rolled back,
  -Snapshot picks one.
- certreq -new, -submit, -accept and the key grants go through ShouldProcess;
  a declined or failed prerequisite binds nothing.
- Rollback and automatic restore work per instance, read back, report failures.

Also found while testing: PowerShell 7 returns RSACng for a CSP key, so the
provider check now reads CERT_KEY_PROV_INFO; ForEach-Object member form returned
nothing under -WhatIf; stderr capture under Stop threw on 5.1; LocalSystem and
NetworkService accounts go to icacls as SIDs; SQL Agent is started again after
a restart; signature checked by OID.

DEPLOY.md gains the run procedure: preflight, DEV, docker-1 checks, production, rollback.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 21:41:03 -06:00
spencermandClaude Fable 5.1 850e1da3a9 scripts: vsql certificate request uses the legacy SChannel CSP with an exchange key, validates before binding, scopes key access, saves bindings for rollback, resumes pending requests
ci / frontend (push) Successful in 42s
ci / server (push) Successful in 11m30s
ci / image (push) Successful in 13s
ci / e2e (push) Failing after 9s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-18 21:19:39 -06:00
spencermandClaude Fable 5.1 fdfb8ae40f scripts: Request-VsqlServerCertificate.ps1 requests and installs a SQL Server TLS certificate from PESCO-PSYLOCKE-CA
ci / frontend (push) Successful in 42s
ci / server (push) Successful in 11m13s
ci / image (push) Successful in 13s
ci / e2e (push) Failing after 3m50s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-18 21:15:49 -06:00
spencermandClaude Fable 5.1 b420f77410 DEPLOY: vsql serves a weak self-signed certificate; what IT needs for VISUAL_ENCRYPT=yes
ci / frontend (push) Successful in 42s
ci / server (push) Successful in 11m16s
ci / image (push) Successful in 13s
ci / e2e (push) Failing after 4m8s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-18 21:12:15 -06:00
spencermandClaude Fable 5.1 3623dca77b scripts: gitea_issues.py drives the tea CLI; 38 decision issues opened on Gitea
ci / frontend (push) Successful in 43s
ci / server (push) Successful in 11m6s
ci / image (push) Successful in 14s
ci / e2e (push) Failing after 4m3s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-18 20:50:34 -06:00
spencermandClaude Fable 5.1 5ca83f48c3 scripts: gitea_issues.py opens one Gitea issue per open decision in PLAN.md
ci / frontend (push) Successful in 43s
ci / server (push) Successful in 11m2s
ci / image (push) Successful in 14s
ci / e2e (push) Failing after 4m6s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-18 20:25:29 -06:00
spencermandClaude Fable 5.1 6b6db0230f Phase 8: Project Management, find bar, presence and motion
ci / frontend (push) Successful in 43s
ci / server (push) Successful in 11m6s
ci / image (push) Successful in 38s
ci / e2e (push) Successful in 3m55s
The Project Management screen (/pm, view only) with Overview, Projects & units, Bottlenecks & aging, Hours vs target,
Quality & issues and Find jobs, the period picker, health per unit and per project, drill down, Excel (CSV) per table
and for all, and the PESCO production status report PDF with the controlled-copy stamp; every export logged as
"report exported". The find bar on every home screen: the full search set, the dropdowns, quick flags with Mine, the
flag kinds, Board and List with sorts, filters saved per browser; every filter applied by the server on the list and
the boards, with facets. Presence in packets with role, lock and revoke drop; the motion switch with reduced motion
honoured, card glides, glow and count-up; Back restores the scroll spot; sheet placement and the iPad layout pass. The
data book compared page by page with the old build and six layout differences fixed. Tests for the PM aggregates,
search, filters, presence and exports; Playwright scenarios for the PM screen, the find bar and presence at desktop and
iPad viewports. Docs updated; PLAN.md questions 38 to 42.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-18 15:08:34 -06:00
spencermandClaude Fable 5.1 904437153d Phase 7: close, file, PDFs and prints
ci / frontend (push) Successful in 40s
ci / server (push) Successful in 10m56s
ci / image (push) Successful in 48s
ci / e2e (push) Successful in 2m44s
Clerical close and file: the VISUAL observed state beside the close confirm, a 409 with a second confirm when the
feed still shows work orders open, filing with a signature and the HMAC seal, the data book built on the server
and stored on the seal in the filing transaction, admin reopen keeping the broken seal with its data book.

Server PDFs with reportlab, pypdf and pypdfium2: the manufacturing data book page for page after the old build
(cover, index, drawings with VOID stamps, traceability and heat map rasters, weld maps and welding records, Q.C.
inspections, Q.C. and test documents, MTRs, record history), the job traveler with work order QR codes, the ITP
PDF filed automatically at sign-off, every print kind with the PRINTED COPY stamp, the controlled-copy stamp
signed with the seal key, PDF metadata, the traceability CSV with the formula guard, and the append-only
print_log with an audit row for every print and export (migration 0008).

Frontend: the close and file panel, the print menu and its entry points, the printed copies list on the History
tab, the ITP PDF buttons. Tests: server (close, file, reopen, seal, the builders, prints, CSV, stamps), frontend,
and the Playwright close and print scenarios. Docs updated; SECURITY closes M2, S6, S7 and S8.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-17 23:49:14 -06:00
spencermandClaude Fable 5.1 00531cb329 Phase 6: Q.C. inspection, project folders, packet documents and the digital ITP
ci / frontend (push) Successful in 37s
ci / server (push) Successful in 9m18s
ci / image (push) Successful in 35s
ci / e2e (push) Successful in 2m17s
The Q.C. screen (KPIs, boards, project folders), the Q.C. tab on the packet
page (check items from the qc_check_items settings row, visual exam per weld,
NDE, hardness with the NACE label, notes), accept with a route and a
signature gated by qc_missing_empty, reject with a reason or an NCR number
closing the inspection into qc_history, Q.C. folder documents per project and
unit with superseding revisions, packet documents as a closed set with
take-out reasons, the digital ITP per unit from the frozen template (line
initials with CAS, unsign, N/A, customer codes, rejects with NCR, block
signatures, sign-off with the PDF hook, admin reopen, the ITP log), hold-point
warnings by department page group, the scoped policy check for unit and
project writes, migration 0007, tests, Playwright scenarios and docs.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-17 20:08:53 -06:00
spencermandClaude Fable 5.1 8bb1f7ae4d DEPLOY: docker-1 subnet pool limit broke the CI e2e job; note and the lasting fix
ci / frontend (push) Successful in 34s
ci / server (push) Successful in 7m33s
ci / image (push) Successful in 14s
ci / e2e (push) Successful in 1m38s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-17 16:11:55 -06:00
spencermandClaude Fable 5.1 ae185f7913 Boards: column frame about three cards tall (700 px cap)
ci / frontend (push) Successful in 34s
ci / server (push) Successful in 19m49s
ci / e2e (push) Failing after 19s
ci / image (push) Successful in 32s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-17 15:39:29 -06:00
spencermandClaude Fable 5.1 3a78dc8dd6 Boards: columns scroll inside a screen-high frame with a sticky heading
ci / frontend (push) Successful in 35s
ci / server (push) Successful in 7m22s
ci / e2e (push) Failing after 18s
ci / image (push) Successful in 32s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-17 15:25:47 -06:00
spencermandClaude Fable 5.1 e9dd3f205b Referrer-Policy same-origin: Firefox sent Origin: null under no-referrer and sign-in was refused as cross-origin
ci / frontend (push) Successful in 34s
ci / server (push) Successful in 7m35s
ci / e2e (push) Failing after 16s
ci / image (push) Successful in 32s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-17 12:32:44 -06:00
spencermandClaude Fable 5.1 b638f0c2f2 DEPLOY: run doctor with compose run, not exec; test stack first start notes
ci / frontend (push) Successful in 37s
ci / server (push) Successful in 7m32s
ci / image (push) Successful in 13s
ci / e2e (push) Failing after 6s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-17 12:26:46 -06:00
spencermandClaude Fable 5.1 fea7cc8839 DEPLOY: SHA-1 certificate issue resolved; CA switched to SHA-256 and the DC and relay certificates reissued
ci / frontend (push) Successful in 34s
ci / server (push) Successful in 7m30s
ci / image (push) Successful in 13s
ci / e2e (push) Failing after 6s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-17 12:21:15 -06:00
spencermandClaude Fable 5.1 94008ceed0 scripts: Export-PescoCaBundle.ps1 exports the PESCO CA chain from Windows and copies it to docker-1
ci / frontend (push) Successful in 35s
ci / server (push) Successful in 18m3s
ci / image (push) Successful in 13s
ci / e2e (push) Successful in 1m44s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-17 12:04:10 -06:00
spencermandClaude Fable 5.1 c244a684b2 DEPLOY: the internal CA and the DC and relay certificates are SHA-1; test stack layout under the home folder
ci / frontend (push) Successful in 35s
ci / server (push) Successful in 16m49s
ci / image (push) Successful in 16s
ci / e2e (push) Successful in 1m50s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-17 12:00:17 -06:00
spencermandClaude Fable 5.1 5a4174e0c2 Phase 5: Supervisor and Stall screens, weld map, heat table, clock and CO verification
ci / frontend (push) Successful in 34s
ci / server (push) Successful in 7m15s
ci / image (push) Successful in 39s
ci / e2e (push) Successful in 2m4s
The shop at parity with the old build. Supervisor screen (department chips, CO headline, numbers, Change orders
on hold, station grid with clocks and CO tags, boards) and Stall screen (station picker, hero, My packets,
Submitted). Shop steps on the packet page: assign with station, welder picker and stamp; pull back; Start, Pause,
Resume; Submit with a PIN signature and the missing steps as links; review with Send to Q.C., Return to station
and Skip Q.C. route; a lead's read-only review. Weld map (pdf.js viewer with pan, pinch, zoom, full screen; marks
with leader lines; weld sheet; weld record with field CAS; carried marks). Heat map (heat table placed, dragged,
sized, removed; legacy amber tags; borrowed heat map read-only). Checklist tab with templates from settings.
VOID stamps on voided pages. Change orders: CO-n labels, supervisor verify with signature, approval copies the
heat table to the new sheet and the BOM merge keeps the shop's values. Server clock of record with VISUAL ticket
hours beside it. Presence per packet over SSE. Migration 0006 (bfx, bfy, carried_from, checklist_templates).
New endpoints /api/shop/board, /api/shop/stations, /api/shop/stall, /api/departments/{code}/people.

Tests: policy oracle for every shop action, role and status; clock arithmetic; concurrent inserts; CO apply;
frontend geometry, heat table, clock, checklist, weld sheet, screens; seven Playwright scenarios. Docs updated.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-16 22:46:56 -06:00
spencermandClaude Fable 5.1 39a4eb5213 Phase 4: Warehouse screen, pull table, shorts, MTRs and the upload pipeline
ci / frontend (push) Successful in 30s
ci / server (push) Successful in 4m30s
ci / image (push) Successful in 35s
ci / e2e (push) Successful in 1m40s
The Warehouse home with the numbers, the Open shorts table, the find bar and the five-column task board
(waiting, being pulled, on hold, pulled, released in the last 3 days) with buttons, hold reasons and drag.
Every role sees the warehouse stage on a packet as the WH pill and the line under it. The pull table on the
Materials tab: Pulled with auto-start, issued, location, heat with Enter to the next line, shorts with
receipts, N/A, MTR per line with a viewer. Send back to Clerical with a reason. Release to supervisor stays
blocked until every line is pulled or short and every pulled line has a heat.

Server: the heats_recorded precondition on WH_RELEASE, receive by custody, server-validated hold and short
reasons, the old packet history texts, GET /api/warehouse/board, cards with the warehouse stage and pull
counts. Uploads typed by content per kind (drawing, mtr, document, bom with XLSX and CSV), limits per kind,
optional ClamAV behind the clamav compose profile, a storage quota alert on the new notification_events
table (migration 0005) shown on the Admin Storage tab.

Tests: every warehouse action as every role, the release gate, the short-receive exception, the heat
pattern, upload sniffing and limits, the ClamAV path with a fake scanner, the quota alert; frontend board
and pull table tests; Playwright scenarios for the board and the pull flow. Verified on docker-1 in the CI
stack: 3557 server tests, 106 frontend tests, 17 Playwright scenarios. Docs updated; D5 closed.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-16 17:13:31 -06:00
spencermandClaude Fable 5.1 591fe90076 Phase 3: VISUAL feed and M-Files drawings in the worker
ci / frontend (push) Successful in 30s
ci / server (push) Successful in 4m12s
ci / image (push) Successful in 46s
ci / e2e (push) Successful in 1m24s
Migration 0004 (VISUAL and drawing caches, go-live ignored list, resource
map, job tables, order-derived columns with provenance; work order key
includes the operation sequence). The real worker on APScheduler with
settings re-read each fire, pause, run now, advisory locks, job_runs and a
heartbeat. The visual-feed job (five VisualKit reads, COPY and MERGE cache,
suspect-batch guard, the apply in one transaction: drafts, change orders,
retire-moved, work order gone, closed and cancelled observed, projects and
units from order links, auto-release) and the fingerprint. The drawing-lookup
job (queue, budget, download on version change, sha256 into assets, decision
table, staging for rev approval, drawing-origin change orders). Clerical From
VISUAL panel, flags, rev approval, hand uploads, change-order review; Admin
Feed settings and resource map. Synthetic fixture generator and a
fixture-driven worker in CI with a Playwright scenario. Docs updated.

Verified: 3249 server tests and 13 Playwright scenarios on the docker-1 CI
stack, 76 frontend tests, doctor at 0004; one feed and one drawing run
against VISUAL DEV and the vault from the developer machine (counts in the
changelog).

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-16 14:45:38 -06:00
spencermandClaude Fable 5.1 16950055e3 CI: run the image job after the registry secrets were saved
ci / image (push) Canceled after 0s
ci / e2e (push) Canceled after 0s
ci / server (push) Canceled after 1m56s
ci / frontend (push) Canceled after 17s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-16 11:02:13 -06:00
spencermandClaude Fable 5.1 0b4b5dab80 CI: run the image job with the registry secrets in place
ci / frontend (push) Successful in 24s
ci / server (push) Successful in 2m38s
ci / image (push) Successful in 56s
ci / e2e (push) Successful in 1m12s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-16 11:00:43 -06:00
spencermandClaude Fable 5.1 6ac62c0bd0 Docs: the Gitea runner runs the full workflow, e2e included; open question 15 resolved
ci / frontend (push) Successful in 25s
ci / server (push) Successful in 2m41s
ci / image (push) Failing after 8s
ci / e2e (push) Successful in 1m12s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-16 10:56:09 -06:00
spencermandClaude Fable 5.1 0dfe856f17 Runner: reachable actions cache on docker0:8088, allow the workspace bind in valid_volumes
ci / frontend (push) Successful in 1m6s
ci / server (push) Successful in 3m46s
ci / e2e (push) Successful in 1m48s
ci / image (push) Failing after 2m34s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-16 10:48:02 -06:00
spencermandClaude Fable 5.1 c5b0c11c0c Runner: host-directory job workspace (bind_workdir) so the e2e compose stack can bind-mount the checkout
ci / frontend (push) Successful in 10m10s
ci / server (push) Successful in 12m54s
ci / e2e (push) Failing after 43s
ci / image (push) Failing after 2m57s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-16 10:29:47 -06:00
spencermandClaude Fable 5.1 0df0ea62e9 Gitea Actions runner for docker-1 (deploy/runner), DEPLOY.md and PLAN.md notes
ci / frontend (push) Successful in 10m18s
ci / server (push) Successful in 13m14s
ci / e2e (push) Failing after 39s
ci / image (push) Failing after 3m5s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-16 10:05:40 -06:00
spencermandClaude Fable 5.1 37d9a0cb50 Phase 2: core domain, policy engine, packet API, Clerical screen
Migration 0003: projects, aliases, renumbers, units, packets and every child table,
change orders, assets, documents, ITPs, station limits, department weld flag.
Policy package: Principal, PacketState, Action rules, custody, preconditions,
CO hold, order of checks, can/blocked/holder on reads. docs/POLICY.md with the
tightenings table for Seth. Write pipeline: FOR UPDATE, CAS on status and dept,
If-Match row versions, server-assigned numbers, field CAS, version bump, packet
log, audit, NOTIFY, signatures, IT reasons, filed lock and HMAC seal.
API: /api/packets (header, transitions, work orders, pages, docs, move, remove,
BOM, shorts, welds, heat tags, heat table, stage, checklist, clock, warehouse
stage, Q.C., change orders, log, seal), /api/projects, /api/units, /api/assets,
/_blob. Frontend: Clerical home, projects and units, packet page with pdf.js
and QR codes, hand draft, heat map, send to warehouse, department or Q.C.
Tests: policy matrix, API, concurrency, schema, projects; Playwright Clerical
draft scenario. Verified on docker-1 with the CI stack and the Samba DC.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-16 09:31:45 -06:00
spencermandClaude Fable 5.1 97b0973130 Phase 1: identity, sessions, audit, frontend shell
AD sign-in over LDAPS (search with the service account, bind as the user,
nested groups through LDAP_MATCHING_RULE_IN_CHAIN, disabled accounts refused),
roles as the union of PS-* groups mapped by a table derived from the seeded
departments. Server-side sessions with idle, lock and absolute timeouts, Origin
and X-Requested-With check, step-up unlock. Optional Argon2id PIN set with the
domain password; PIN sign-in by employee ID on registered devices only; five
wrong attempts disable the PIN, three wrong at unlock or signature end the
session. Rate limits per account and per address before any bind. Devices,
signatures table and sign helper, audit rows for every identity event, SSE over
LISTEN/NOTIFY with presence. Account settings and Admin APIs and screens
(AD view, devices, PIN clearing, group map with missing-group flags, refresh
from AD now). CLI ad-groups --list and ad-refresh. Migration 0002.

Frontend: real sign-in (password tab, PIN keypad on registered devices), lock
screen, role switcher, Account settings, Admin shell, screen placeholders.

CI: Samba AD DC container (PSTEST.LOCAL) with a generated CA, 49 of the 50
groups plus one extra, 17 test users; wired into the CI compose overlay and
the Gitea workflow; Playwright sign-in scenario.

Verified on docker-1: 171 server tests green inside the CI stack against
PostgreSQL and the Samba DC, 48 frontend tests, 8 Playwright scenarios against
the live stack (password and PIN sign-in, lock and unlock, Admin group map).
Findings recorded in the docs: the DC needs CAP_SYS_ADMIN, a hidden tab locks
only after a minute as the old build did,
and the app uses the alias ps-app for Playwright because "app" is on
Chromium's HSTS preload list.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-16 07:40:29 -06:00
spencermandClaude Fable 5.1 0b663bb2b2 Phase 0: repo skeleton, image, compose stacks, doctor, migration runner, frontend shell
New repo for the Packet Station rebuild (Python 3.12, FastAPI, PostgreSQL 16,
React, VisualKit, MFilesKit, Docker Compose on docker-1). Nothing is migrated
from the M: install.

- CLAUDE.md with the safety rules, README, CHANGELOG, docs (BRIEF, PLAN,
  SECURITY rewritten for the server with the requirement ID table, DEPLOY,
  stubs for FEED, POLICY, SCHEMA, GO-LIVE, PAPER-FALLBACK).
- packetstation CLI: app, worker (heartbeat stub), migrate, doctor, version,
  healthcheck. Settings from the environment with secret files. Stack guard
  (test never points at VISUAL production). Security headers and CSP.
  Trusted proxy resolved by name. JSON logs with redaction.
- Migration runner and 0001_base: settings, append-only audit_events with
  hash chain, ps_notify, grants for ps_app.
- Multi-stage Dockerfile (ODBC Driver 18, PESCO libraries from the Gitea
  index only), compose base, proxy overlay for npm_default, CI overlay,
  postgres initdb roles, env examples, NPM proxy host notes, Gitea Actions.
- Frontend: Vite, React, TypeScript, the PESCO dark theme ported with
  self-hosted fonts, placeholder sign-in and home.
- Verified on docker-1: image builds, CI stack comes up healthy, doctor
  database checks pass, 77 server tests pass against PostgreSQL.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-15 23:08:47 -06:00