docs: put the contributor surfaces on the 2.x vocabulary - #476
Merged
Conversation
Several documents still described an architecture that shipped out of the repository in 2.0, and a contributor following them wrote code that does not compile. CONTRIBUTING routed template authors to BusinessTheme, InvoiceTemplateV2 and ProposalTemplateV2, and its engine-primitive section described entities, container-growth markers and Breakable. None of those seven types exist in src/main. Both sections now describe what is there: the layered preset stack with create(BrandTheme), and the NodeDefinition pipeline where pagination is declared by the definition and a splittable node compiles through SplittableLeafCompiler. A dead link to ComputedPositionTest points at a test that exists. CONTRIBUTING, SECURITY and the architecture overview called the pptx module a semantic exporter. Its primary backend is fixed-layout, in document.backend.fixed.pptx, alongside the older semantic manifest — and a new fragment kind has to register a handler with both fixed-layout backends, or it renders in one output and silently vanishes from the other. The semantic wording is left in place everywhere it is still accurate. ROADMAP described 2.1 as in development and 2.0 as current stable, four days after 2.1.0 shipped. The README release-status block described 2.1.1 with 2.1.0's headline. docs/README listed five superseded 1.x upgrade guides on the main path and omitted the 2.0 migration guide entirely. The bug-report template asked for a v1.6-era version and offered a reproduction with no try-with-resources and no render call, so a repro pasted from it produced nothing. It now asks for the backend, the classpath, the font source and the generated artifact or layout snapshot. The feature-request template pointed at BusinessTheme; the pull-request template offered a lane that does not exist and required updating a count by hand. A new issue-template config routes usage questions to Discussions. Four places stated four different example totals — 63, 63, 54 and "26+" — where the runner invokes 94. The numbers are removed rather than synchronised; they have drifted every release since June. The release runbook grepped the README for a test-count claim the README does not make, so that gate always passed; it compared the gallery row count against the example file count, two numbers long diverged; and three items pointed at a migration path that moved. The gallery check is now a ShowcaseMetadata coverage check, and a new item covers ROADMAP. canonical-legacy-parity.md is refreshed rather than archived: eight live documents link it, and its three "Planned for v1.6" rows had all shipped. In the README, the comparison block moves below Architecture so it stops separating the first example from the next step, What's new in 2.0 compresses to its links, and the documentation catalogue collapses to four routes.
The README advertised v2.1.1 as latest stable behind a release link that 404s, while the changelog carried v2.1.1 as Planned, the roadmap named 2.1.0 as the current stable line, and the showcase metadata said 2.1.0. Four surfaces, three answers. The false one was the README, and it was false on purpose. cut-release.ps1 did not rewrite the release-status block, so the post-release commit that would fix it lives on develop and never reaches main — the v1.6.9 lesson recorded in the runbook. The mitigation was a pre-cut hand-edit, enforced by a Step 0 gate that demanded the block already name the version being cut. To leave main correct after the tag, develop had to be wrong for the whole cycle. The block is script-owned now. Step 1 promotes the in-development half to latest stable, rewriting both the link text and the tag URL, and opens the next patch line; Assert-ReleaseMetadata verifies the result after the mutation. Step 0 no longer demands a hand-edit — it checks the block still exists in the shape the rewrite matches, so a reflowed blockquote aborts loudly instead of being skipped in silence. What the maintainer owns is the prose, not the version tokens. SECURITY.md's supported-versions table jumped from 2.1.x straight to 1.9.x, leaving 2.0.x uncovered — a regression introduced when the 1.9.x row was added. The showcase page still stated a count in three places while the JSON-LD beside them declared numberOfItems: 51 and the visible heading said "50+ generated PDFs". Replacing one number with another moves the problem to the next release, so the counts are gone; the page loads its catalogue from examples.json and can say what it renders without claiming how many. The runbook still told the maintainer that PackageMapGuardTest scans the gitignored docs/private/ and can fail a local run CI cannot reproduce. That stopped being true when the exclusion landed; its guard list was also missing CiGuardListGuardTest. The README API table sent anyone adding a visual primitive to PdfFragmentRenderHandler alone, while CONTRIBUTING now requires registering with both fixed-layout backends — a handler registered with one renders in one output and vanishes from the other.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
A contributor following
CONTRIBUTING.mdwrites code that does not compile.Its "new built-in template" section routes authors to
BusinessTheme,InvoiceTemplateV2andProposalTemplateV2; its engine-primitive section tells them to add a container-growth marker andBreakableto anEntity, with geometry inEntityBoundsand propagation inParentContainerUpdater. All seven types were removed in 2.0 — checked one by one againstsrc/main, none survive. The linkedComputedPositionTestdoes not exist either.The same drift runs through the release-facing surface.
ROADMAP.mdstill described 2.1 as "in development ondevelop, building toward the 2.1.0 minor" and 2.0 as the current stable line, five days afterv2.1.0was tagged and published.docs/README.mdlisted five superseded 1.x minor-to-minor upgrade guides on its main path and did not linkmigration/v2.0.0-modules.mdat all — the only migration guide that applies to anyone arriving today.And the example catalogue is stated four times with four different numbers:
examples/README.mdsays 63 twice,CONTRIBUTING.mdsays 54, the release runbook expects "26+Generated:lines".GenerateAllExamplesinvokes 94.What changed
Retired API. The two template-authoring paths collapse to the one that exists: the layered stack, every preset a
final classwith acreate(BrandTheme)factory, reference implementations named. The engine-primitive section describes the real pipeline — aNodeDefinitionthat prepares and measures, pagination declared on the definition rather than by a marker, continuation throughSplittableLeafCompiler, and container growth as a consequence of what children report duringpreparerather than a separate signal. The "Keep the entity core thin" block is deleted outright; every bullet in it named an absent type.PPTX backend location.
CONTRIBUTING.md(repository map and package roots),SECURITY.md(in-scope list) anddocs/architecture/overview.md(package roots) described the pptx module as a semantic exporter. Its primary backend is fixed-layout —document.backend.fixed.pptx, consuming the same resolvedLayoutGraphas the PDF backend — alongside the older semantic manifest skeleton, and both are now named. The handler-registration rule gains its second half: a new fragment kind must register withPdfFixedLayoutBackendandPptxFixedLayoutBackend, or it renders in one output and silently vanishes from the other.This is deliberately not a sweep.
PptxSemanticBackendstill exists andrender-pptx/README.md,docs/architecture/package-map.mdandrender-pptx/pom.xmldescribe it correctly; only the places calling it the module's primary surface are touched.Release surface — one source of truth. Four surfaces gave three answers: the README advertised v2.1.1 as latest stable behind a tag URL that 404s, the changelog carried v2.1.1 as
Planned,ROADMAP.mdnamed 2.1.0 as current stable, and the site metadata said2.1.0. The README was the false one, and it was false by design:cut-release.ps1did not rewrite the release-status block, so the post-release commit that would fix it is develop-only and never reachesmain— the v1.6.9 lesson recorded atrelease-process.md:309. The mitigation was a pre-cut hand-edit enforced by a Step 0 gate demanding the block already name the version being cut, sodevelophad to be wrong for a whole cycle to leavemainright after the tag.The block is script-owned now. Step 1 promotes the in-development half to latest stable — link text and tag URL both — and opens the next patch line;
Assert-ReleaseMetadataverifies it after the mutation; Step 0 checks only that the block still exists in the shape the rewrite matches, so a reflowed blockquote aborts loudly instead of being skipped in silence. The maintainer owns the prose, not the version tokens. Pre-release state now readsLatest stable: v2.1.0 · In development: v2.1.1, and all four surfaces agree.ROADMAP.mdpromotes 2.1 to current stable, demotes 2.0 to history, and points## Nowat what follows.docs/README.mdleads with the guides that apply and folds the historical ones behind a<details>.SECURITY.md's supported-versions table jumped from2.1.xto1.9.x, leaving2.0.xuncovered — a regression this branch introduced when it added the1.9.xrow, now fixed.Templates and routing.
bug_report.mdis rewritten: the reproduction now uses try-with-resources and callsbuildPdf()— as shipped, a repro pasted from the template rendered nothing — and## Environmentasks for the output backend, the modules on the classpath and the font source rather than a hardcodedPDFBox: 3.0.7, with a new## Generated artifactsection accepting alayoutSnapshot().feature_request.mdswapsBusinessThemeforBrandThemeand lists each anchor with its package (all verified present).pull_request_template.mdgets the lanes the repository actually has and stops requiring a hand-updated gallery count. A newISSUE_TEMPLATE/config.ymlroutes usage questions to Discussions, which are enabled and were not linked from anywhere.Counts removed, not synchronised.
examples/README.md,CONTRIBUTING.mdand the release runbook. On the showcase page the first pass swapped50+for80+, which only moves the problem to the next release — and leftnumberOfItems: 51in the JSON-LD beside it and50+ generated PDFsin the visible heading. All of them are gone: the page loads its catalogue fromexamples.jsonand can describe what it renders without claiming how many. A number in prose has no owner and no guard.Runbook. One gate grepped
README.mdfor[0-9]+ green tests— the README makes no such claim, so it always passed. Another comparedexamples/README.mdgallery rows against*Example.javafiles: 48 against 100, already failing. Three items pointed atdocs/migration-v1-N-to-v1-M.md, a path that moved todocs/migration/. The gallery gate becomes aShowcaseMetadatacoverage check, and a new item coversROADMAP.md.README structure. The comparison block moves below
## Architecture— same file, no discovery lost — so it stops sitting between the first working example and the next step.## What's new in 2.0compresses from thirteen lines to its two links. The documentation catalogue collapses from four sub-lists to four routes, gainingROADMAP.mdandSUPPORT.md, which the landing page never linked. 372 → 362 lines.Three places fixed beyond the original scope, because #474 made them stale an hour before this branch:
CONTRIBUTING.md:32listed the pre-#474 guard names with no-plscope,:73claimed a docs-only PR "runs the guards only", andrelease-process.md:36still warned thatPackageMapGuardTestscans the gitignoreddocs/private/and can fail a local run CI cannot reproduce — the exclusion #474 added is exactly what stopped that being true.The README API table sent anyone adding a visual primitive to
PdfFragmentRenderHandleralone, whileCONTRIBUTING.mdnow requires registering with both fixed-layout backends.PptxFragmentRenderHandlerexists; the row names both.Verification
BUILD SUCCESS, 13/13 modules, 2:01, zero failures.Claims were checked rather than assumed:
src/main— all absentComputedPositionTestis a dead linkfind— absent; repointed atLayoutInsetsTestCanvasLayerNode,ListBuilder.addItem(String, …),DocumentTableCell.node(DocumentNode)all presentgenerate()invocations, 100*Example.javafiles, 48 gallery rowssrc/mainCONTRIBUTING.mdBUILD SUCCESS#anchorin the restructured README, resolvesv2.1.0→v2.1.1in link text and tag URL, in-developmentv2.1.1→v2.1.2cut-release.ps1numberOfItems2.1.0/2.1.1, CHANGELOGv2.1.1 — Planned, ROADMAPCurrent stable — 2.1, sitesoftwareVersion 2.1.0, install pin2.1.0The documented qa command was run on a warm
~/.m2, which is exactly its trap: a standalone-f qa/pom.xmlresolves itsgraph-compose-*dependencies from the local repository rather than the reactor, so without a priorinstallit quietly tests the last artifacts you installed instead of your working tree. That precondition is now part of the instruction.One decision to confirm
ISSUE_TEMPLATE/config.ymlsetsblank_issues_enabled: false. That is what forces the routing — every report goes through a template or a contact link — but it removes the blank-issue escape hatch, and it is the only behavioural change here rather than a textual one. Happy to flip it totrueand keep just the contact links.Not in scope
docs/contributing/implementation-guide.mdstill describes the removed execution layer and carries dead source links. Rewriting it is its own change; this PR demotes it from "read these files first" to background reading and addspackage-map.mdin its place.Nothing here is machine-checked: no guard scans
SECURITY.md,SUPPORT.md,ROADMAP.mdor.github/**, and none of the retired symbols are on a forbidden-token list, so every correction in this PR can silently return. Closing that is the next change in this series.