Adds the required doc set under docs/mmd-pdf/ - PRD, feature backlog with status and sign-off per feature, screens with wireframes, test cases with the test data and the agent-tasking prompts, and the sign-off log. The sign-off log records the independent design review of 2026-08-27: DESIGN-FAIL, three blockers and five major findings, which is why every design feature in the backlog is blocked and the logo/token branch is unmerged. Design working files live in docs/mmd-pdf/design/ so the next agent can regenerate and re-render them. redplate.css there is the MMD shell design system lifted verbatim from the session that owns it - do not edit it. Also carries the session handover. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
8.3 KiB
HANDOVER — MMD PDF (Windows PDF editor for staff)
Written 2026-08-27 15:18:53 +04 (11:18 UTC)
Session mmd-projects-87 · Repo gitea.baobab-ts.com/mmd-it/mmd-pdf
What this is
MMD staff had no sanctioned way to write inside PDF documents. PDFgear was blocked on 2026-07-20 for forging the Windows default-PDF registry setting. This session picked a replacement, proved it, forked it, and started turning it into an MMD product.
MMD PDF = GPL-3.0 fork of KillerPDF 1.7.5, staying GPL-3.0, FORK-NOTICE.md
in the repo records what changed.
What was done
Chosen and proven (this part is solid)
- Surveyed open-source Windows PDF editors. No MIT-licensed app does true inline PDF text editing — the only genuinely MIT desktop option (every-pdf) can only stamp text on top of a page. KillerPDF (GPL-3.0) was picked; GPL restricts forking and redistribution, not internal deployment to staff.
- Passed the check that killed PDFgear.
.pdfUserChoice ProgId and Hash identical before and after install and after opening a PDF; the protective deny ACE intact; one signed executable, no helper binary. Read live from the registry on our own machine. - Found and fixed a real defect. Editing existing text left the original
glyphs in the file — a delivery note corrected from 12 to 17 tonnes returned
both figures from
pdftotext.Services/PdfRedactText.csnow walks the page content stream, tracks the CTM and text matrix, and blanks every show-text operator whose origin sits inside the cover rectangle, before any new content is appended. Proven: after the fix the saved file contains only the new figure, every other line intact and still searchable. - Built the test rig that found it.
/opt/mmd-wintest/winteston the hypervisor: Xvfb + xfreerdp3 + xdotool, so every action is a real pointer or key event with no scripting back door. This is how user testing is done from now on.
Dedicated Windows test machine
VM 203 on mmd-fsn-03 renamed mmd-win-test-01, onboot=1, described in
Proxmox. Windows Server 2022, 20 cores / 72 GB, guest 10.10.20.22. Its DNS was
broken (no internet at all) — fixed. .NET SDK 8 installed for builds.
It still also carries the Mali plant-station build, so it is shared.
Design — failed review, not accepted
The rebrand and the new MMD shell design system ("red plate") were applied and merged before any design existed, which is the wrong order and Ben called it. Redone properly afterwards: design system pulled from the Claude Design project, red-plate stylesheet lifted verbatim from the session that owns it, seven screens composed at 800×600, then put through an independent adversarial review — the gate that was missing.
Verdict: DESIGN-FAIL. 3 blockers, 5 major, 3 minor. All eleven findings and
the fix state are in docs/mmd-pdf/SIGNOFFS.md.
Current live / verified state
| Thing | State |
|---|---|
main |
carries the rebrand + the redaction fix (PR #1, merged) |
design/official-logo-and-tokens-20260827 |
bfb9845, pushed, NOT merged — official logo + design-system values. Unaccepted: the design failed review. |
| Build | dotnet build -c Release, 0 errors, on mmd-win-test-01 |
| App | runs; opens, edits and saves correctly, keyboard-and-mouse tested |
| Design | DESIGN-FAIL, no re-review run, no Ben sign-off |
| Scanning | not written |
| Signing / Intune | not started |
Claude Design project 446a3931-c345-48da-a3ac-246af02a2e52 ("Design System"):
the repo's live CDS 0.3.40 was pushed into mmd-portal/ (its mirror was stale
at 0.3.11), and round-1 design pages into mmd-pdf/. Round 2 was not pushed
— it failed review.
Two artifact links exist from before Ben's /login and are dead
(65c7726d…, e47d705f…). Live under the current account:
7d8d6b56-ef36-4729-8e88-a3fb1392707e (round-1 canvas) and
a7a974e8-aff4-49e6-b4cc-f80414769515 (status page). Both are round-1 and both
predate the review — do not present either as reviewed.
Resume steps
- Read
docs/mmd-pdf/SIGNOFFS.mdfor the eleven findings, thenBACKLOG.mdfor what is ⛔. - Get Ben's toolbar pick — A, B or C on the Directions board. The independent reviewer recommends C (three tabs; nothing hidden, every tool named). Nothing else in the design can be finished without it.
- Apply the seven unapplied findings — 1, 6, 7, 8, 9, 10, 11 — the big one
being the rebuild of Main / EditText / PageRail / Nothing onto Direction C.
Working files:
docs/mmd-pdf/design/build.py, regenerate withpython3 build.py, render each.dc.htmllocally and look at it. - Re-run the independent review with the prompt in
docs/mmd-pdf/TEST-CASES.mdunder "To review a design". Give the reviewer the complete palette this time, including#FAFAF8and#C9C6BC— my incomplete brief caused half of finding 4. - Only after DESIGN-PASS, publish the canvas and hand Ben the link for annotation. His annotation closes the gate; the reviewer's PASS does not.
- Then re-derive
Themes/MMD.xamlfrom the signed-off design and mergedesign/official-logo-and-tokens-20260827. - Then scanning (NAPS2.Wia, MIT, .NET Framework 4.6.2 — compatible with this net48 codebase), then signing, then Intune.
Key facts, commits, addresses
- Repo
gitea.baobab-ts.com/mmd-it/mmd-pdf;main= PR #1 merged; branchdesign/official-logo-and-tokens-20260827=bfb9845. - Hypervisor mmd-fsn-03 — Hetzner dedicated, Falkenstein FSN1-DC16, auction
#3049905, public 168.119.88.172, tailnet 100.64.0.19, Proxmox VE 9.2.10.
Reach it with
ssh -i ~/.ssh/id_ed25519_mmd_fsn03_rescue root@100.64.0.19. - Test machine mmd-win-test-01 (VM 203), guest 10.10.20.22. Humans reach it
in a browser at
https://plantpc.baobab-ts.com(Guacamole, Entra SSO). - Source on the VM at
C:\src; build outputC:\src\bin\Release\net48\MmdPdf.exe; .NET SDK atC:\build\dotnet. - Graph for Intune/Entra: MMD-CIO-Agent client secret at
~/mmd-projects/entra-cio-agent/secret.env, helpergraphlib.mjs. The certificate in~/.config/mmd/certsis Exchange PowerShell only — do not reach for it and then conclude the agent lacks Intune access.
Open items
- Ben: pick the toolbar direction. Blocks everything else in the design.
- Ben: the 16–24px app icon. No official small MMD mark exists anywhere. The icon crops the lockup's baobab disc, which reads from 32px and is muddy below it. An agent must not draw a simplified one. Commission or accept muddy.
- Seven design findings unapplied; no re-review run.
- Scanning not written. Signing not started. Intune not started.
- mmd-win-test-01's Windows evaluation licence — a restart reset it to 180 days, but it needs a real licence before it is a standing fixture.
- Design round 2 not pushed to the Claude Design project (it failed review).
Gotchas
Stop-Processover WinRM against a running GUI app hangs the session. Launch GUI apps with a new scheduled-task name instead.freerdp2-x11does not exist on Debian 13. It isfreerdp3-x11, and the binary isxfreerdp3, notxfreerdp.- The word-mark was two literal
<Run Text="Killer">elements, not the product-name token — a global rename misses it. Check the title bar visually after any rename. redplate.cssbelongs to another session. It is lifted verbatim from theirbuild.mjs. I edited it once chasing a review finding and reverted it. Do not edit it; raise a discrepancy with the owning session instead.- A
/loginmid-session orphans artifacts published earlier under the old account. Republishing the same file path keeps mapping to the dead one — copy the file to a new path to claim a fresh URL. Ctrl+Ainside an inline text edit selects all annotations, not the text. UseEnd+BackSpace.Entercommits,Escapecancels — the status bar now says so because both were guessed wrong.- Flatten is not redaction's friend. It removes the old text by turning the page into a picture, destroying every searchable word. That is why the content-stream fix exists.
- The design gate is not closed by a reviewer's PASS. Only Ben's annotation closes it, and design that never went through the proper lane is an automatic fail however good it looks.