2026-05-08-cleanup-bundled-misans.md 9.2 KB

Cleanup Bundled MiSans Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: Remove the unused jar-bundled MiSans font path and keep Docker runtime system MiSans as the single PDF font source.

Architecture: The Playwright PDF generator will no longer accept or reference bundled font loaders. Runtime PDF rendering continues to rely on the existing CSS font stack and the Docker image installing MiSans-VF.ttf into the OS font cache.

Tech Stack: Java 17, Spring Boot 3.3.5, Maven multi-module project, Playwright Java, Docker runtime image.


File Structure

  • Delete abilities/exam-sprint/infrastructure/src/main/resources/fonts/MiSans-VF.ttf: unused classpath font resource.
  • Delete abilities/exam-sprint/infrastructure/src/main/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/BundledOutlookReportFonts.java: unused bundled font loader.
  • Delete abilities/exam-sprint/infrastructure/src/test/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/BundledOutlookReportFontsTest.java: tests for deleted loader.
  • Modify abilities/exam-sprint/infrastructure/src/main/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/PlaywrightExamSprintReportPdfGenerator.java: simplify constructors and remove Supplier<BundledOutlookReportFonts> dependency.
  • Modify abilities/exam-sprint/infrastructure/src/test/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/PlaywrightExamSprintReportPdfGeneratorTest.java: update test-only constructor usage.
  • Modify docs/superpowers/plans/2026-05-07-playwright-pdf-generator.md: replace stale bundled-font wording with runtime-system-font wording.

Task 1: Simplify Playwright Generator Constructors

Files:

  • Modify: abilities/exam-sprint/infrastructure/src/main/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/PlaywrightExamSprintReportPdfGenerator.java
  • Modify: abilities/exam-sprint/infrastructure/src/test/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/PlaywrightExamSprintReportPdfGeneratorTest.java

  • [ ] Step 1: Update the test constructor call

In PlaywrightExamSprintReportPdfGeneratorTest.java, replace the constructor call in constructorDoesNotLaunchChromiumBeforeFirstGenerate() from:

try (PlaywrightExamSprintReportPdfGenerator generator = new PlaywrightExamSprintReportPdfGenerator(
        BundledOutlookReportFonts::load,
        1,
        1)) {

to:

try (PlaywrightExamSprintReportPdfGenerator generator = new PlaywrightExamSprintReportPdfGenerator(1, 1)) {
  • Step 2: Run the targeted compile/test to verify the expected failure

Run:

mvn -pl abilities/exam-sprint/infrastructure -am -Dtest=PlaywrightExamSprintReportPdfGeneratorTest test

Expected: compilation fails because PlaywrightExamSprintReportPdfGenerator(double, double) does not exist yet.

  • Step 3: Simplify the production class constructors

In PlaywrightExamSprintReportPdfGenerator.java, remove this import:

import java.util.Objects;
import java.util.function.Supplier;

Add back only this import if Objects is still needed by another statement:

import java.util.Objects;

Then replace the constructors:

public PlaywrightExamSprintReportPdfGenerator() {
    this(BundledOutlookReportFonts::load, DEFAULT_LAUNCH_TIMEOUT_MILLIS, DEFAULT_RENDER_TIMEOUT_MILLIS);
}

PlaywrightExamSprintReportPdfGenerator(
        Supplier<BundledOutlookReportFonts> bundledFontsSupplier,
        double launchTimeoutMillis,
        double renderTimeoutMillis) {
    Objects.requireNonNull(bundledFontsSupplier, "bundledFontsSupplier");
    this.launchTimeoutMillis = launchTimeoutMillis;
    this.renderTimeoutMillis = renderTimeoutMillis;
}

with:

public PlaywrightExamSprintReportPdfGenerator() {
    this(DEFAULT_LAUNCH_TIMEOUT_MILLIS, DEFAULT_RENDER_TIMEOUT_MILLIS);
}

PlaywrightExamSprintReportPdfGenerator(double launchTimeoutMillis, double renderTimeoutMillis) {
    this.launchTimeoutMillis = launchTimeoutMillis;
    this.renderTimeoutMillis = renderTimeoutMillis;
}

Keep this line in generate(String htmlContent) unchanged, so java.util.Objects remains required:

Objects.requireNonNull(htmlContent, "htmlContent");
  • Step 4: Run the targeted generator test

Run:

mvn -pl abilities/exam-sprint/infrastructure -am -Dtest=PlaywrightExamSprintReportPdfGeneratorTest test

Expected: the test compiles and passes, assuming local Playwright Chromium is installed and available.

Task 2: Delete Bundled Font Loader and Resource

Files:

  • Delete: abilities/exam-sprint/infrastructure/src/main/resources/fonts/MiSans-VF.ttf
  • Delete: abilities/exam-sprint/infrastructure/src/main/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/BundledOutlookReportFonts.java
  • Delete: abilities/exam-sprint/infrastructure/src/test/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/BundledOutlookReportFontsTest.java

  • [ ] Step 1: Delete the classpath font resource

Delete:

abilities/exam-sprint/infrastructure/src/main/resources/fonts/MiSans-VF.ttf
  • Step 2: Delete the unused bundled font loader

Delete:

abilities/exam-sprint/infrastructure/src/main/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/BundledOutlookReportFonts.java
  • Step 3: Delete the loader test

Delete:

abilities/exam-sprint/infrastructure/src/test/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/BundledOutlookReportFontsTest.java
  • Step 4: Verify no production/test references remain

Run:

rg "BundledOutlookReportFonts|/fonts/MiSans-VF.ttf|src/main/resources/fonts/MiSans-VF.ttf" abilities/exam-sprint/infrastructure

Expected: no matches.

Task 3: Update Stale Plan Documentation

Files:

  • Modify: docs/superpowers/plans/2026-05-07-playwright-pdf-generator.md

  • [ ] Step 1: Replace the stale bundled-font bullet

In docs/superpowers/plans/2026-05-07-playwright-pdf-generator.md, replace this line:

  - Injects bundled MiSans as `MiSans`, `MiSans VF`, and `ReportFont` through a `file:` URL `@font-face` block when the bundled font is available.

with:

  - Relies on the runtime Docker image installing MiSans as a system font so Chromium can resolve the report font stack (`'MiSans VF', MiSans, ReportFont, sans-serif`).
  • Step 2: Verify the docs no longer describe bundled font injection

Run:

rg "bundled MiSans|@font-face|/fonts/MiSans-VF.ttf|BundledOutlookReportFonts" docs/superpowers/plans/2026-05-07-playwright-pdf-generator.md

Expected: no matches.

Task 4: Final Verification

Files:

  • No source file changes.

  • [ ] Step 1: Run targeted infrastructure tests

Run:

mvn -pl abilities/exam-sprint/infrastructure -am -Dtest=PlaywrightExamSprintReportPdfGeneratorTest test

Expected: build exits with code 0 and PlaywrightExamSprintReportPdfGeneratorTest passes.

  • Step 2: Run broader PDF/report related tests if time allows

Run:

mvn -pl abilities/exam-sprint/infrastructure -am -Dtest='*Report*Test,*Pdf*Test' test

Expected: build exits with code 0. If Playwright Chromium is missing locally, install it with the existing project command before rerunning:

mvn -pl abilities/exam-sprint/infrastructure exec:java -Dexec.mainClass=com.microsoft.playwright.CLI -Dexec.args="install chromium"
  • Step 3: Verify the Docker runtime font remains available in source

Run:

rg "MiSans-VF.ttf|fc-match \"MiSans VF\"" deploy/ability-center/runtime

Expected: matches remain in deploy/ability-center/runtime/dockerfile and the only remaining source font file is deploy/ability-center/runtime/fonts/MiSans-VF.ttf.

  • Step 4: Inspect git diff

Run:

git diff --stat && git diff -- abilities/exam-sprint/infrastructure/src/main/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/PlaywrightExamSprintReportPdfGenerator.java abilities/exam-sprint/infrastructure/src/test/java/cn/yunzhixue/ability/center/examsprint/infrastructure/report/pdf/PlaywrightExamSprintReportPdfGeneratorTest.java docs/superpowers/plans/2026-05-07-playwright-pdf-generator.md

Expected: diff only removes bundled font artifacts, simplifies the Playwright generator constructor, updates the related test call, and fixes stale documentation.

Self-Review

  • Spec coverage: The plan deletes the jar-bundled font, removes the unused loader and tests, simplifies the only production constructor reference, updates the stale documentation, and preserves Docker runtime system font handling.
  • Placeholder scan: No TBD, TODO, or undefined implementation instructions remain.
  • Type consistency: The new test call uses PlaywrightExamSprintReportPdfGenerator(double, double), which Task 1 defines as a package-private constructor matching the current test package.
  • Commit policy: No commit step is included because the current session has not received an explicit request to create a git commit.