Files
mmd-pdf/HANDOVER-mmd-pdf-20260827-151853.md
kua-agentandClaude Opus 5 e02d219736 docs: product documentation, design working files, and the failed design review
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>
2026-08-27 13:25:29 +02:00

170 lines
8.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.** `.pdf` UserChoice 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.cs` now 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/wintest` on 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
1. **Read** `docs/mmd-pdf/SIGNOFFS.md` for the eleven findings, then
`BACKLOG.md` for what is ⛔.
2. **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.
3. **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 with `python3
build.py`, render each `.dc.html` locally and look at it.
4. **Re-run the independent review** with the prompt in
`docs/mmd-pdf/TEST-CASES.md` under "To review a design". Give the reviewer
the **complete** palette this time, including `#FAFAF8` and `#C9C6BC` — my
incomplete brief caused half of finding 4.
5. **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.
6. **Then** re-derive `Themes/MMD.xaml` from the signed-off design and merge
`design/official-logo-and-tokens-20260827`.
7. **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;
branch `design/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 output
`C:\src\bin\Release\net48\MmdPdf.exe`; .NET SDK at `C:\build\dotnet`.
- Graph for Intune/Entra: **MMD-CIO-Agent client secret** at
`~/mmd-projects/entra-cio-agent/secret.env`, helper `graphlib.mjs`. The
certificate in `~/.config/mmd/certs` is 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 1624px 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
1. **`Stop-Process` over WinRM against a running GUI app hangs the session.**
Launch GUI apps with a *new* scheduled-task name instead.
2. **`freerdp2-x11` does not exist on Debian 13.** It is `freerdp3-x11`, and the
binary is `xfreerdp3`, not `xfreerdp`.
3. **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.
4. **`redplate.css` belongs to another session.** It is lifted verbatim from
their `build.mjs`. I edited it once chasing a review finding and reverted it.
Do not edit it; raise a discrepancy with the owning session instead.
5. **A `/login` mid-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.
6. **`Ctrl+A` inside an inline text edit selects all annotations**, not the
text. Use `End` + `BackSpace`. `Enter` commits, `Escape` cancels — the status
bar now says so because both were guessed wrong.
7. **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.
8. **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.