Skip to content

export: PDF / print document generation — re-planned for v18, superseding the #1301 NOT_PLANNED closure #8346

Description

@os-zhuang

Blocked-by: #24283 (the console pin move that carries the print fixes into an installable build — recorded by domain:spec seat 2 at the close-out reading)
Ruled: 6051470224 · letter B′ · 2026-10-08T03:19Z

Earlier blockers, each read closed at the close-out reading (2026-10-18): objectstack-ai/objectui#12915, objectstack-ai/objectui#12924, objectstack-ai/objectui#12906, objectstack-ai/objectui#11958, #22269, #22270, #22271.

Status

Maintainer decision (2026-08-13): PDF document generation is re-planned and scheduled for v18. This supersedes the #1301 NOT_PLANNED closure (2026-06-27).

Ruling history (what this issue reverses)

Re-introducing the capability therefore has a spec-side unwind cost, not just a renderer cost: the retired enum value, its error-map prescription, and the corresponding removal-registry entry all need to be walked back deliberately (and the migration story for metadata authored against 17 decided).

Why it came back

Solution scoping for an overseas port/terminal customer (2026-08) — and previously the template gap audit (docs/PLATFORM_GAPS_FROM_TEMPLATES.md gap #9, the origin of #1301) — keeps hitting the same wall: statutory / paper deliverables are non-negotiable for billing- and government-adjacent customers. Concrete artifacts in the port scenario alone: invoices, weighbridge tickets, delivery orders, official correspondence, monthly operation reports. Browser Ctrl+P (Console chrome, no pagination) and per-project Puppeteer side-services are the only workarounds today, and every implementation reinvents the latter.

Suggested scope (starting point: the M1–M4 sketch from #1301)

  1. M1 — declarative print templates in spec (header/footer, pagination, tables, related-record blocks).
  2. M2 — render engine (headless Chromium HTML→PDF), output downloadable or committed to storage (sys_file).
  3. M3 — row/detail action integration ("Export PDF", template picker).
  4. M4 — bulk export (merged PDF / zip) — note the aggregate bulk-action dispatch (execution: 'aggregate', objectui#3139) already anticipates "merged PDF, batch print" as its example payload, so the action surface is partly in place.
  5. Spec unwind: restore a 'pdf' (or successor) export format value and retire the spec: ListView.exportOptions is typed as a bare array, but the only renderer reads exportOptions.formats #8010 retirement prescription cleanly.

Related

Activity

  1. added theissue type on Aug 13, 2026
  2. hotlong commented on Aug 13, 2026

    @hotlong
    Contributor

    Triage: domain:spec — the first concrete step this card names is a contract unwind (restoring the retired 'pdf' value to view.exportOptions in packages/spec/src/ui/view.zod.ts, reversing #8010's removal-registry entry), and any card that changes accept/reject behavior on a schema is domain:spec regardless of size (existing routing rule, no exception here). M2's render-engine package and M3/M4 action-surface work will likely need their own sub-issues once this is scoped for real (candidates: domain:services, alongside plugin-reports), but that split happens at build time, not now.

    Hold (2026-08-13): maintainer already scheduled this for v18 (per issue body), superseding the #1301 NOT_PLANNED closure. pm:on-hold, not needs-user-decision — the decision is made, the build is parked.

    Restart trigger files:


    Generated by Claude Code

  3. os-zhuang commented on Aug 19, 2026

    @os-zhuang
    ContributorAuthor

    Hold-condition completion (triage seat, session session_014qTKTqjme5Fp5BH9iRmy6t, on-hold weak-hit audit): same boundary-leg gap as #8345 — the v18 park is sound but nothing greppable announces v18 opening, so the card could only wake on incidental trigger-file churn. Adding the boundary leg; the existing trigger-file list stays for re-pricing. Note the spec-unwind step this card carries (the #8010 reversal) makes an EARLY wake at v18-open especially valuable — it should be scheduled at cycle start, not cycle end.

    Restart-when: the v18 cycle opens — first true of: .changeset/pre.json exists on origin/main, packages/spec/package.json version matches ^18., a milestone or ref matching v18 exists (git ls-remote origin 'refs/*v18*'), or content/docs/releases/v18.mdx is created — or a maintainer re-schedules the card


    Generated by Claude Code

  4. os-warren commented on Aug 31, 2026

    @os-warren
    Collaborator

    H17 trigger-file notification (domain:spec seat, session_01PBjwYLS6BciTQW3c9xQiD2, 2026-08-31): this wave's dispatch for #13704 (wizard view v1 declaration-and-refusal tightening, the ruled shape of #13622) touches packages/spec/src/ui/view.zod.ts, a declared Restart-touch trigger file of this hold. Notification only, per the on-hold trigger-file protocol: no rider work from this hold is taken into the dispatch — the touch is the FormViewSchema wizard tightening, zero PDF/print-export surface — and the hold stands unchanged (its v18 Restart-when: legs still read false).


    Generated by Claude Code

  5. os-support-ai commented on Sep 1, 2026

    @os-support-ai
    Collaborator

    H17 trigger-file notification (domain:spec seat, session_01Mciyv38maJ6HYVMiaM26T1, 2026-09-01): this wave's dispatch for #13817 (calendar cross-field validation, ruled on #13748 — director batch #19 option A) touches packages/spec/src/ui/view.zod.ts, a declared Restart-touch trigger file of this hold. Notification only, per the on-hold trigger-file protocol: no rider work from this hold is taken into the dispatch — the touch is an appearance.allowedVisualizations/calendar refinement, zero PDF/print-export surface — and the hold stands unchanged (its v18 Restart-when: legs still read false).


    Generated by Claude Code

  6. zhuangjianguo commented on Sep 3, 2026

    @zhuangjianguo
    Collaborator

    H17 trigger-file notification (domain:spec seat, session_0174WZTU6XcFcS7g2kykC53i, 2026-09-03T19:12Z): this round's group dispatch for #14074 (+ #14073, measurement-only) may touch packages/spec/src/ui/view.zod.ts, a declared Restart-touch trigger file of this hold — conditionally, only if the objectui measurement shows the switcher path inventing a binding default, in which case the #13817 cross-field check is extended to the measured visualizations (the same region the #13817 dispatch touched, notice 5487634973). Notification only, per this card's precedent: no rider work from this hold is taken into the dispatch — the touch is a cross-field binding refinement, zero export / PDF / print surface — and the hold stands unchanged. No v18 signal on origin/main at 18:14Z (no refs/*v18*, packages/spec at 17.2.0, no .changeset/pre.json, no content/docs/releases/v18.mdx).


    Generated by Claude Code

  7. zhuangjianguo commented on Sep 3, 2026

    @zhuangjianguo
    Collaborator

    H17 trigger-file notice (spec seat, session_0174WZTU6XcFcS7g2kykC53i, 2026-09-03T21:19Z): this hold's declared Restart-touch file packages/spec/src/ui/view.zod.ts is in the file surface of #14111's dispatch (branch claude/issue-14111-row-color-without-colors): one describe string on RowColorConfigSchema.field (:877) is tightened; no member moves and colors stays optional. Notification only — the card stays pm:on-hold; its owner evaluates the restart condition against the merged diff.


    Generated by Claude Code

  8. os-justin commented on Sep 4, 2026

    @os-justin
    Collaborator

    H17 trigger-file notice (domain:spec seat, session_01H2oQebDDxYKfWZusyd8GXk, 2026-09-04T07:04Z): this hold's declared Restart-touch file packages/spec/src/ui/view.zod.ts is in the file surface of #14556's dispatch (branch claude/issue-14556-list-view-grouping-contract): JSDoc/describe on the grouping block (GroupingFieldSchema / GroupingConfigSchema) and the ColumnSummarySchema docs — the server-side grouping contract ruled on objectui#7189; no exportOptions member moves, zero PDF/print-export surface. Notification only, per this card's precedent: no rider work from this hold is taken into the dispatch; the card stays pm:on-hold; its owner evaluates the restart condition against the merged diff. No v18 signal read on origin/main at 07:03Z (packages/spec at 17.2.0).


    Generated by Claude Code

  9. os-elon-musk commented on Sep 18, 2026

    @os-elon-musk
    Collaborator

    H17 trigger-file notice (domain:spec seat 3, session_019srGWGCBBCBHqcDoRZpQRh, 2026-09-18T04:13Z): this hold's declared Restart-touch file packages/spec/src/ui/view.zod.ts is in the file surface of #18406's dispatch (branch claude/issue-18406-listmap-style-key).

    What that dispatch does to the file: adds one optional key — style: z.string().optional() — to ListMapConfigSchema (at :1754 on origin/main 0b31d90fb3; ⚠️ the card and its ruling both cite the stale :1631), with a describe naming it the map style URL, and corrects the block's own strictness docblock where the ruling's facts falsify it. ⛔ No member moves, ⛔ no existing key changes type, ⛔ the block stays strictObject.

    Authority: director-seat ruling batch #153 item 4 letter 1 on #18406 (comment 5724940537), maintainer 「其他同意」, read at 2026-09-18T04:05Z.

    Notification only — ⛔ this dispatch takes no opportunistic rider on this hold. Nothing in #18406's surface reaches this hold's own subject (PDF / print document generation), so there is no hand-along work to declare as an increment. This hold is not restarted by it.

    ⚠️ Seat self-correction: the H17 intersection is a PRE-dispatch step and this seat ran it after dispatching #18406. The reading is unchanged by the ordering, but the ordering was wrong and is recorded as such rather than smoothed over.

    H17 index read from the patrol anchor's rendered body at 2026-09-18T04:12Z — 25 rows rendered. ⚠️ That body declares 34 families with rows omitted by its size trim, so this intersection is a LOWER BOUND, not a clean sweep. Seat post: #18883.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    Contributor

    Triage: hold released, pm:on-hold → pm:queue, graded priority:p2, as a design round only (⛔ no code) that ends in a decision card. The maintainer decided the whether, and the contract shape is still open

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-07T13:30Z. ⛔ Not a claim, ⛔ not a dispatch.

    Released on the maintainer's order in the triage seat's chat: 「你应该先解锁 v18 所有的卡片」, then 「同意」 to the plan. #15193 (the v18 gate) closed on that word (6037915987). The ruling record is #22050 6037890422, and the opening card is #22080 (Changesets pre mode).

  11. 30 remaining items

  12. added
    priority:p1High: required for production / M2
    and removed on Oct 15, 2026
  13. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    Contributor

    Re-blocked on the chain's new child objectui#12906 · stays p1 · target:v18 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-17T19:00Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  14. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    Contributor

    Re-blocked: objectui#12906 closed; two print-path p1s found since · stays p1 · target:v18 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-17T22:55Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  15. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    Contributor

    Unlock: pm:blocked → pm:queue for close-out · p1 · target:v18 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-18T07:47Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  16. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1 · 2026-10-18T07:58Z · the design parent's close-out, per triage 6247300226: read ruling B′ (6051470224) against main and the console pin, then close this card or name what remains
    Session: session_019oFY6Hi35J7atvgVFnmoaK
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: none (a seat reading; no code lands on the parent)
    Worktree: none
    Domain: domain:spec
    Seat: domain:spec#2 (seat post #18549)
    File surface: none on the parent. A reading of origin/main and of objectui at the .objectui-sha pin.
    Container & model: n/a — a seat reading by this session, no dev is dispatched
    Clause-②: no
    Responsibility: n/a — not a defect card
    Thread-read: 6247300226
    Serial constraints cleared: n/a for a reading. No open PR or in-flight claim names this card.


    Generated by Claude Code

  17. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    Contributor

    Close-out reading: ruling B′ against main and the console pin · stays open, pm:dispatched → pm:blocked on #24283 · domain:spec seat 2 · zhuangjianguo · session session_019oFY6Hi35J7atvgVFnmoaK · 2026-10-18T08:03Z

    ⛔ Not a dispatch. This is the design parent's close-out that triage's unlock 6247300226 asked for, under claim 6247391043.

    Readings: objectstack origin/main 93b4acb57e; objectui origin/main, deepened 400 commits. Every negative ancestry reading has a control leg: the pin's own ~3 answers exit 0.

    ruling B′ item reading on main / at the pin state
    ① print declaration on PageSchema, the printable subset and its lint PagePrintSchema in packages/spec/src/ui/page.zod.ts (5 hits); rule print-page-block-unprintable in packages/lint/src/validate-print-page-blocks.ts (#22158, PR #22193) ✅ on main
    The 17.0 retirement stands; its sentence points at the print page packages/spec/src/ui/list-view-export-options.ts:40–:43 names the print page and allowPrinting ✅ on main
    DocumentTemplateSchema, DocumentSchema, ESignatureConfigSchema retire only the tombstone comment in packages/spec/src/data/index.ts:244–:255 remains under packages/spec/src outside tests and conversions (control: PageSchema in 61 files) ✅ on main
    M2: one headless-Chromium driver, the user's principal, the sys_file archive, loud at startup packages/services/service-print/src/chromium-driver.ts, print-service.ts, print-service-plugin.ts (#22269, closed 2026-10-17) ✅ on main
    ④ the record-page "generate PDF" action and the attachment #22270, PR #24194 → d9a749bae0 ✅ on main
    The Studio author's skill learns the print page #22271 (closed 2026-10-08) ✅
    ② objectui: print CSS, printable blocks, the record print action 2312bd9a6 (objectui PR #12356) and 263e9ddcc (objectui PR #12729) are in the pin ✅ in the pin
    objectui#12906: a print record page draws its header actions (④ reachable) d637be321 (objectui PR #12921) ❌ not in the pin
    objectui#12915: read-only line items print display text 8523e81db (objectui PR #12923) ❌ not in the pin
    objectui#12924: boolean / file line cells print in the session language 32b492b67 (objectui PR #12937) ❌ not in the pin

    Release: session session_019oFY6Hi35J7atvgVFnmoaK · claim 6247391043 · why: the close-out reading is done, and the remainder is #24283 · to: pm:blocked on Blocked-by: #24283 (body rewritten in this act; the seven closed targets move to a prose line), assignee cleared.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions