Releases: Portwood-Global-Solutions/Portwood
Release list
v3.56.0 — Set the label size on a chart
Install: Production · Sandbox · 04tVx0000010fnNIAQ
Free, no installation key. Upgrades in place from any 3.x.
Set the label size on a chart
Chart labels were drawn at a fixed size. A chart placed in a small frame came out with text too small to read, and there was nothing you could do about it — making the chart bigger only made the text smaller relative to the frame.
There is now a Label size box in the Canvas chart properties, and fontSize= on a chart tag for everything else:
{Chart:Contacts:Department:bar:width=520&fontSize=16}
The title and value labels scale with it, so the chart keeps its proportions instead of one piece of text growing on its own. It works the same whether the document is generated by a person, a Flow, or a batch job.
Bold that tells the truth
Setting Bold on text in Arial Unicode MS looked switched on and printed regular — that font has no bold face in the PDF engine. The control is now disabled for it, so the canvas and the finished document agree.
Thanks to @ssk42 for finding and fixing this one, including reading the font resources out of a rendered PDF to prove which families genuinely register bold. The obvious fix — disabling bold everywhere — would have been wrong; the generic families are unaffected.
Upgrading from v3.53 or earlier? Check the Type picklist
If you want the Canvas designer, check Setup → Object Manager → Portwood Template → Type for a Canvas value before you go looking for it.
Canvas arrived in v3.54. An org that already had Portwood installed before that never receives the value, and no later upgrade brings it:
| Org was on | After upgrading | |
|---|---|---|
| v3.48 | Canvas missing | ❌ |
| v3.53 | Canvas missing | ❌ |
| v3.54 | Canvas present | ✅ |
| v3.55 | Canvas present | ✅ |
Fresh installs always have it. If yours is missing, add it once by hand — Type → New → Canvas, spelled exactly — on both Portwood Template and Portwood Template Version. It persists through every future upgrade. Full steps in §15.12.
1,961 Apex tests, 78% coverage. Fresh install and upgrade both verified, and the chart label size measured in a PDF generated by this build — every word 9.4pt → 23.4pt at fontSize 12 → 30.
Full detail in CHANGELOG.md; triaged findings that are not fixed, and why, in docs/known-issues.md.
v3.55.0 — Element linking, named blocks, and charts on big datasets
Install: Production · Sandbox · 04tVx0000010fXFIAY
Free, no installation key. Upgrades in place from any 3.x — verified from 3.53 and 3.48.
Elements that travel together
A Canvas block can now be set to follow another one. Put a summary, a note or a signature panel under a table and it stays under it — however many rows the merge produces, and onto whatever page the table ends on, instead of being printed straight through.
Links chain, so a summary → note → signature set moves as one, and any block can be kept from splitting across a page break. The picker will not offer a target that would create a loop, and a dashed tether shows the group on the artboard.
Named blocks
Give a block a name and that is what the properties panel, the element list and every other block's Follows picker call it. Without one Portwood derives a label from the content, which works right up until two blocks start with the same few words.
Charts on the Canvas, and on datasets that used to be too big
Charts are now a Canvas element with a live preview while you design.
Separately, PowerPoint and Excel documents assemble in the browser the way Word always has. The 6 MB synchronous Apex heap that used to refuse a template over a few thousand child records is no longer the ceiling — tested to 30,000 — and charts on that path render with Chart.js. Flow and batch generation have no browser and continue to use the server-side renderer.
Fixed
- A
<style>block inside<body>had its CSS eaten, printing a line of bare selectors at the top of the document —@page body h1 … .docgen-body-content .tab. Every{...}pair is merge-tag syntax, so each declaration resolved to nothing and left its selector as text. Google Docs and Notion put<style>in the body as standard, and so does re-uploading a previously generated document. The stylesheet is now lifted into<head>before the merge, so the CSS still applies and only the stray text goes. .docx/.pptx/.xlsxdownloads failed in orgs with Lightning Web Security enabled.- A save could silently re-point every element link to a different block.
- A chart title containing a double quote could break an element link, because the attribute closed early and everything after it was lost.
- A Flow validating signature tokens in bulk hit a governor limit and lost the whole batch; it now returns what it could validate and marks the rest.
- A long verification URL ran off the edge of the signature Certificate of Completion.
Upgrading
One change does not travel with the upgrade. Type__c on Portwood Template Version no longer defaults to Word, but Salesforce does not push a removed picklist default to an org that already has the package — measured on orgs upgraded from 3.53 and 3.48, both still report Word.
It only matters if you create template versions from a script or integration without setting the type. To clear it: Setup → Object Manager → Portwood Template Version → Type → edit the Word value → untick Default. New installs already have it.
1,957 Apex tests, 78% coverage. Full detail in CHANGELOG.md; triaged findings that are not fixed, and why, in docs/known-issues.md.
v3.54.0 — Canvas designer (Beta): design a document in the browser
Design a document in the browser. No Word, no HTML, nothing to upload — drag a box onto a page and that is where it prints.
Install
sf package install --package 04tVx0000010Y4LIAU --wait 10 --target-org <your-org>Install in Production | Install in Sandbox
Build 3.54.0-1, ancestor 3.53.0, coverage 78%. Free, no installation key.
The Canvas designer (Beta)
Creating a template has always meant bringing a file — a Word document you styled, or HTML from somewhere else. That works, but it means the layout fight happens somewhere other than Salesforce, and Word styles are a blunt instrument for "put this here."
Choose Start from a blank canvas in the template wizard and you get an artboard the exact size of your page. Drag a box where you want it. That is where it prints.
What you can put on it
- Text — with a real rich-text editor inside each box, including tables
- Tables driven by your data — a row per related record
- Images from your Asset Library, the same shared images the rest of Portwood uses
- Shapes, for rules, panels and colour blocks
- QR codes and barcodes from any field
- Signature placements, so a canvas document can go out for e-signature
Tables that grow with your data. A table row repeats once per related record, and each row can carry its own nested list underneath — an opportunity's products beneath each opportunity — with totals that add themselves up. That two-level shape is normally the hardest thing to get right in a Word template.
Show a box only when it applies. Attach a condition to any box and it appears only for records that meet it — a payment-terms panel only on invoices over a threshold, a compliance notice only for certain record types.
Already have an HTML template? Import it and keep working on it as boxes.
Plus undo/redo, layering, duplicate page, an element list for reaching a box hidden behind another, and custom page sizes.
Canvas templates always produce a PDF.
Why it says Beta
It is installed and working — this release went out only after a real install was confirmed end to end. Beta is about what is still coming, not about whether it works: running headers and footers, multi-select and alignment, keyboard nudging, and box locking are all on the list. The feature is safe to build real templates on.
Nothing about existing templates changes. Word, HTML, Excel, PowerPoint and PDF templates behave exactly as before.
Worth knowing: symbols and non-Latin text in PDFs
This applies to every template type, not just Canvas, and it is the kind of thing that costs an afternoon.
Characters like ✓ ✔ ☑ ☐ ✗ ● ★ → √ ≤ ≥, and any Chinese, Japanese, Korean, Greek, Cyrillic or Hebrew text, render as nothing at all in PDF output under the default fonts. No glyph, no empty box, no warning — the line simply comes out short, which is easy to miss on a page of otherwise correct text.
They draw correctly, in regular, bold and italic, if you name the font:
font-family: 'Arial Unicode MS';The Canvas designer's Symbols control inserts them with the font already attached, so it is handled for you there. Wingdings and other symbol fonts remain unavailable.
Also in this release
Multi-currency totals were adding the wrong number. A total across related records in more than one currency added the raw amounts together and stamped a single currency symbol on the result — so 1,000 USD + 1,000 EUR came out as €2,000. The total was wrong, nothing reported a problem, and the document looked entirely normal. Totals across mixed currencies are now handled correctly.
Canvas documents in every path. Signature requests, bulk generation, charts and large-dataset documents all understand the new template type, rather than treating a Canvas body as a Word file.
Validation
- e2e-01..08 + 07-syntax1..5 — all
PASS / FAIL: 0(269 assertions) - 1,905 Apex tests, 100% pass, org-wide coverage 78%
sf code-analyzer— 0 violations across the workspaceslds-linter— 0 errors- Installed into a fresh subscriber org and rendered end to end before promotion, then confirmed working by hand
Full detail in CHANGELOG.md.
v3.53.0 — Excel files save as .xlsx + output format honored from Flow
Two document-generation fixes for documents produced outside the runner UI — from a Flow, from a bulk job, or saved to a record in the background.
Install
sf package install --package 04tVx0000010BvlIAE --wait 10 --target-org <your-org>Install in Production | Install in Sandbox
Build 3.53.0-1, ancestor 3.52.0, coverage 78%. Free, no installation key.
Excel templates produced a file named .docx
An Excel template generated from a Flow, a bulk job, or a background save came out as a valid workbook under a .docx name — which neither Word nor Excel will open. Excel now saves as .xlsx.
Generating from the runner was never affected: the browser assembles Office documents there and picked the right extension already.
A template set to PDF still produced a Word file from Flows
A template whose Output Format read PDF generated a PDF from the runner but a .docx from a Flow — same template, same record, two different results.
The two paths were reading different places for the format: the runner reads what is on the template, while a generated document reads the format saved with the template's active version. Saving a template's details updated the first and left the second behind, so a template created as Native and later switched to PDF kept producing Word files everywhere except the runner. Those two now stay in step.
One step for existing templates
Upgrading stops new templates from drifting, but it does not retroactively repair one that is already in this state. If a template has been generating the wrong format, open it in Template Manager and click Save once — that re-points it, and it stays fixed. Saving a new version has always fixed it too. Templates already producing the right format need nothing, and the Excel fix needs no step at all.
Validation
- e2e-01..08 + 07-syntax1..5 — all
PASS / FAIL: 0 - 1,892 Apex tests, 100% pass, org-wide coverage 78%
sf code-analyzer— 0 violations across the workspace- Both fixes reproduced before the change and confirmed after, end to end through the Flow action and click-verified in Template Manager + Flow Builder
Full detail in CHANGELOG.md. Reported by a customer generating documents from a Flow with JSON Data — thank you.
v3.52.0 — Runner on any page + Save & Download toggle
Install: Production · Sandbox
sf package install --package 04tVx000000zz6bIAA --wait 10 --target-org <your-org>No action required. Existing record-page placements of the runner behave exactly as before. Both changes are opt-in configuration.
Both come from Birte at Jedesto — thank you.
Put the runner on any Lightning page
The document runner used to need a record page to know what to generate from. It can now go on a Lightning app page or its own tab, with two ways to tell it which record to use:
- Record Search Object API Name — set it to an object (
Account,Opportunity,My_Object__c) and the runner shows a search box. The user finds the record they want, and the rest of the runner appears scoped to it. Useful for a "generate a document" landing page that isn't tied to browsing to a record first. - Record ID (fixed) — for a page that always produces a document from the same record. When set, the search box doesn't appear.
Screen flows get the same search option, for the case where no record Id is passed in.
Everything works from the chosen record: Create Document (download, save to the record, or both), Document Packet, and Combine PDFs — including the large-dataset path for records with thousands of related rows.
Not offered on Experience Cloud placements. The record search resolves records through Salesforce's UI API, which guest users can't call, so a guest would get a search box that silently returned nothing. Community pages continue to bind {!recordId} from page context.
Show Save & Download
Save & Download — the option that files a copy on the record and downloads one in a single generation — has always appeared whenever Download and Save to Record were both enabled, with no way to turn it off on its own. It's now its own checkbox in the Lightning App Builder, next to the other output options.
It still requires Download and Save to Record to both be on, because it's the combination of the two rather than a separate destination: the new checkbox can only remove it, never reintroduce a destination you deliberately turned off.
Also
Three new interface strings, translated into all ten shipped languages.
Validation
| Check | Result |
|---|---|
| E2E suite (14 scripts) | 266 PASS / 0 FAIL |
| RunLocalTests | 1890 / 1890 Pass, 78% org-wide coverage |
| Code Analyzer (Security + AppExchange) | 0 violations |
| Package build coverage | 78%, coverage met |
Full detail in CHANGELOG.md.
v3.51.0 — Smarter AI template authoring
Install: Production · Sandbox
sf package install --package 04tVx000000zxWDIAY --wait 10 --target-org <your-org>No action required. Nothing about existing templates or generated documents changes. This release improves what the AI knows when it writes a template for you.
The AI now knows Portwood's full tag vocabulary
Ask for numbered rows, a separate table for each product family, a chart, or a section that only appears when there is something to put in it — and you get a template that works the first time instead of a near miss. The prompt now spells these out rather than leaving the model to guess:
{RowNumber}— 1-based row counter inside any loop, including how it restarts per nested loop and per{#GroupBy}group{#GroupBy Rel by Field}— a complete worked example: its own table and header row per group,{GroupName}as the heading, and a per-group subtotal- Conditionals —
{^Field}inverse blocks, and{#IF …}comparisons withAND/OR/NOT, parentheses and nesting, plus the{#IF Rel.totalSize != 0}"only show this section if there are rows" idiom {Chart:Rel:Field:style:opts}— the one-line chart tag with all nine styles and every modifier. The prompt previously described only the hand-authored{#ChartBucket}loop, which is now correctly presented as the fallback for layouts the one-liner cannot produce.- Images —
{%FieldName}and{%Image:N}, including that the:WxHsize token (not CSS) is what actually sizes them - Also — rich-text passthrough,
{PageNumber}/{TotalPages}flagged header/footer-only so they stop landing in the body, the:Initials/:DatePick/:inlinesignature types, and the{#Signatures}variable-signer loop
This applies whether you generate inside Salesforce with Agentforce or use Copy AI Prompt with your own assistant — both share one prompt.
Fixed: the prompt advertised code39 barcodes. The engine supports only code128 and qr; anything else rendered as nothing, silently.
Agentforce Extension v1.1.0 — now free, no installation key
Install extension · 04tVx000000zxUbIAI
v1.0.0 required an installation key. v1.1.0 does not — it is free for everyone, on the same terms as Portwood itself. Prerequisites are unchanged: Portwood 3.46 or later, and Einstein / Prompt Builder enabled in your org.
Validation
| Check | Result |
|---|---|
| E2E suite (14 scripts) | 266 PASS / 0 FAIL |
| RunLocalTests | 1890 / 1890 Pass, 78% org-wide coverage |
| Code Analyzer (Security + AppExchange) | 0 violations |
| Package build coverage | 78%, coverage met |
Full detail in CHANGELOG.md.
v3.50.0 — Renamed to Portwood
Install: https://login.salesforce.com/packaging/installPackage.apexp?p0=04tVx000000zxCrIAI
Sandbox: https://test.salesforce.com/packaging/installPackage.apexp?p0=04tVx000000zxCrIAI
04tVx000000zxCrIAI (build 3.50.0-1, promoted 2026-07-31, ancestor 3.49.0). Build
coverage 78%.
No functional change. No action required. This release renames what you see in
Setup and in the app. Nothing about how the package works changed, and nothing you
have built on top of it needs updating.
Changed — the product is now called Portwood
"DocGen" is gone from the interface. The app, its tabs, its objects, and its
permission sets now read Portwood:
| Before | After |
|---|---|
| DocGen Template / Templates | Portwood Template / Templates |
| DocGen Job, DocGen Error Log, DocGen Asset | Portwood Job, Portwood Error Log, Portwood Asset |
| DocGen Signature Request / Signer / Audit | Portwood Signature Request / Signer / Audit |
| DocGen Settings, DocGen Setup, DocGen Runner | Portwood Settings, Portwood Setup, Portwood Runner |
| DocGen Template Manager, DocGen Admin Guide | Portwood Template Manager, Portwood Admin Guide |
| Portwood DocGen Admin / User (permission sets) | Portwood Admin / Portwood User |
| Portwood DocGen Button Manager / Guest Signature | Portwood Button Manager / Portwood Guest Signature |
Documents your signers receive changed too: the signing certificate appended to a
signed PDF and the footer of signature invitation and reminder emails now say
Portwood. If you set a Company Name in settings, your own name is used and this
does not apply to you — it only affects orgs that left that field blank.
Unchanged — every API name stays DocGen_*
This is deliberate and permanent, not an unfinished rename. In a released managed
package, API names are frozen forever: renaming one would break every org that has
the package installed, and Salesforce will not let a global Apex member be renamed
or removed after release.
So the following are exactly as they were, and will not change in any future
release:
- objects and fields —
DocGen_Template__c,DocGen_Job__c,DocGen_Button__mdt,
and every field on them - Apex —
DocGenService,DocGenController,DocGenAiProvider, and the rest - permission set API names —
DocGen_Admin,DocGen_User(only the labels
changed, so existing assignments are untouched) - the
portwoodglobalnamespace
What this means in practice: your Flows, reports, list views, integrations,
custom Apex, and permission set assignments all keep working with no edits. You
will still see DocGen_Template__c in the API, in Workbench, in report type names,
and in Apex. That is the frozen API name sitting underneath the new label.
Two scheduled job names also stay as they were, because they are matched by name in
orgs that already have them scheduled — renaming them would leave your existing job
orphaned and running alongside a duplicate:
DocGen Signature RemindersDocGen Chart CV Reaper
If you schedule either for the first time, keep using those exact strings; the
documentation still shows them.
Note on your own documentation
If you maintain internal runbooks or onboarding material that tells admins to
"assign the Portwood DocGen Admin permission set" or "open DocGen Settings", those
labels have changed. The permission sets themselves are the same records with the
same API names — only the display names moved.
v3.49.0 — Bulk sort order, {RowNumber}, Save & Download
Install: Production · Sandbox
sf package install --package 04tVx000000zvz3IAA --wait 10 --target-org <your-org>
A release about document order — plus one silent-content bug found while validating it.
Bulk generation: sort order
Bulk jobs had no sort at all. Records were processed in whatever order Salesforce returned them — effectively creation order — and nothing in the runner or the Flow action could change it. That is invisible when you generate one file per record, but it decides the page order of a combined PDF: 200 Opportunities merged into one packet came out in creation order, with no way to group them by Account.
- Sort By picker in the bulk screen, listing every sortable field on the object plus fields on related records — so "order these Opportunities by Account name" is one click, shown as
Account > Account Name, with no SOQL to write. - Sort Order input on the
Generate Bulk DocumentsFlow action, taking the same thing as a clause (Account.Name ASC, up to three fields). An unknown or unsortable field fails the action with a message on Error Message instead of faulting the whole Flow. - Blank values sort to the end, so records missing the sort field don't open the packet. Records tied on the sort field fall back to name order, so re-running the same job produces the same packet rather than a reshuffle.
If your Flow passes a Record IDs collection: SOQL does not preserve that collection's order, so sorting it in the Flow never affected the document. Use Sort Order. The input's description now says so.
Numbered table rows — {RowNumber}
Inside any loop, {RowNumber} is the row's position, starting at 1:
| # | Product | Qty |
| {#OpportunityLineItems}{RowNumber} | {Product2.Name} | {Quantity}{/OpportunityLineItems} |
It counts rendered rows, so it reflects whatever your WHERE/ORDER BY/LIMIT actually returned. Nested loops each count their own rows, numbering restarts per group inside {#GroupBy}, and it counts continuously through very large tables — a 30,000-row document numbers 1…30,000 straight through, not per page.
Save & Download
You no longer have to choose between filing a document and keeping a copy. A new Save & Download option does both from a single generation, and appears whenever the page leaves both destinations enabled.
For PDF it keeps the same background generation that Save to Record uses, then hands your browser the saved file — so there is no size limit on either half, and very large PDFs work exactly as they do with Save to Record.
Also: when a page leaves only one destination enabled, the selector now hides entirely instead of showing a single button that does nothing.
Fixed — the Designer could load an old version of a template body
Found by the release test suite, not by the features above.
If two versions of a template body were saved within the same second, DocGen picked between them arbitrarily instead of taking the newer one. The Designer could open showing stale content, and saving from there overwrote the newer version. There was no error and nothing in the log.
Compatibility
Upgrade in place from v3.48.0. No template changes required — sort order and {RowNumber} are opt-in, and every existing job, template, and Flow behaves as before if you don't use them.
Validation
| End-to-end suite | 265 assertions, 0 failures |
| Apex tests | 1,890 · 100% pass · 78% org-wide coverage |
| Code Analyzer (Security + AppExchange) | 0 violations |
| Runner UI suite | 78/81, 0 blockers |
| Subscriber install | verified in a fresh org with two non-admin users |
Full changelog: CHANGELOG.md · Compare: v3.48.0...v3.49.0
v3.48.0 — Bulk generation: conditionals, charts, sorting, Designer access
Install: Production · Sandbox
sf package install --package 04tVx000000zgS9IAI --wait 10 --target-org <your-org>
A bulk-generation release. Most of what follows was silent wrong output — jobs that reported success while producing documents that were subtly or completely wrong.
Bulk generation
- Conditional sections and filtered loops now behave in bulk as they do for one record. A loop given a custom Tag name resolved to nothing in bulk, so
{#Tag}rendered blank and{^Tag}rendered its opposite branch. Affected V3 query configs only, which is why it looked intermittent. - A related-list row limit was applied per job instead of per record —
LIMIT 10returned ten rows for the entire job, so the first few records consumed them and everything after got nothing. {Field:label}failed in bulk only, and{#Approvals}never populated.- Charts render in bulk for the first time, rasterized entirely in Apex. Keep chart templates at batch size 1.
- PowerPoint and Excel are no longer offered a combined-PDF mode they cannot produce — that combination previously emitted a PDF of blank pages and reported success. Run them as Individual Files for one native file per record.
- The bulk screen no longer refuses jobs the Flow action would run. Its pre-flight estimates are advisory now; only genuine platform ceilings block a job.
- Bulk Flow action accepts a Template API Name (#256).
Template Designer
- Users who are not System Administrators could open a template and see an empty page. The Designer now loads for anyone with the DocGen Admin permission set.
- A template body can no longer be replaced by an empty document if the editor fails to load it.
- Cloning brings every file with it — HTML body and images included. Cloned templates previously opened blank, and their images went to the wrong template.
- Related lists can be sorted by more than one column, with a field-and-direction picker instead of a typed clause.
Upgrade notes
No action required. Existing templates, Flows, and scheduled jobs are unaffected.
Optional: to reap transient chart files from interrupted bulk jobs, schedule
System.schedule('DocGen Chart CV Reaper', '0 0 * * * ?', new DocGenChartCvReaper());
Full detail in CHANGELOG.md.
v3.47.0 — PowerPoint table loops, GUID preservation, split-run merge tags
Install: https://login.salesforce.com/packaging/installPackage.apexp?p0=04tVx000000zMTRIA2
sf package install --package 04tVx000000zMTRIA2 --wait 10 --target-org <your-org>
PowerPoint templates now work with related lists. Put merge tags in a slide table row and that row repeats once per related record — an opportunity's products, a project's tasks, an account's contacts — the same way it already works in Word.
Two further PowerPoint fixes ship alongside it: a merge tag broken up by formatting (a stray spell-check underline was enough) now resolves instead of coming out blank, and slide tables keep the exact style you designed rather than falling back to a default.
Word, HTML, Excel, and PDF output are unchanged.
Technical detail
Three PowerPoint-only defects, all surfaced from a single "the table is not expanding" report. All three predate any recent release — they went unnoticed because PowerPoint templates have no installed base yet.
-
{#Loop}never cloned a DrawingML<a:tr>. Container auto-expansion inprocessXmlhad candidates for Word<w:tr>, numbered<w:p>, HTML<tr>/<li>, and Excel<row>— but none for PowerPoint. The fallback repeated the raw span between the tags, which includes the intervening</a:tc><a:tc>markup, so N records produced one row holding 4N<a:tc>against 4<a:gridCol>and only the first record rendered. -
OOXML GUIDs were consumed as merge tags.
<a:ext uri="{0D108BD9-…}">,<a:tableStyleId>{…}</a:tableStyleId>, and<a16:creationId id="{…}">are brace-delimited and indistinguishable from a merge tag, so they resolved to empty — every generated PPTX shipped with blankeduri=""on its column, row, and creation ids, and an authored custom table style was silently swapped for the hardcoded default. -
Split-run merge tags never de-fragmented for PowerPoint.
mergeRunsInTagsCorealready matched<a:t>, but its call site was gated to Word — and PowerPoint always takes that branch, since the pre-decomposed path is Word→PDF only.
Also in this release
Docs — UserGuide §4 now warns against select-all when assigning DocGen_User. The permission set carries read-only View All on DocGen Template (v3.29+). Chatter Free, Identity, and Community licenses cannot hold View All Records on a custom object, so a blanket assignment blocks the org's next package upgrade — Salesforce re-validates every existing assignment against its user license when the permission set changes. The guide documents the exact install error, a diagnostic SOQL query, and the remediation.
Validation
Real customer template rendered end-to-end against an Opportunity with 3 line items — 4 rows, 16 cells, correct values, valid .pptx confirmed opening and rendering. 9 new tests. RunLocalTests 1786/100%/78%, namespaced pre-flight 1839/100%/78%, e2e-07-syntax1..4 PASS FAIL 0, sf code-analyzer 0 violations.
Package: 04tVx000000zMTRIA2 (build 3.47.0-1, ancestor 3.46.0.5)