Ports the 14 applicable round-2 fixes from the internal PRizm review to the
external afv-library source. (plugin.json finding #13 is internal-only and
does not apply here.)
Accepted fixes:
1 bdt_analyze.py select_definition: isinstance(index, int) -> type(index) is int
(reject bool subclass of int).
2 bdt_analyze.py cmd_formula: precompute upstream fields_produced map to
eliminate O(consumed x upstream) recomputation.
3 bdt_analyze.py topo_order: replace sort-on-every-iteration with deque-based
Kahn (preserves deterministic order).
4 test_bdt_analyze.py test_all_subcommands_work_on_api_input: wrap loop in
self.subTest for per-iteration failure reporting.
5 test_bdt_analyze.py test_invalid_json_raises: register addCleanup BEFORE
write_text so cleanup runs even if write fails.
6 SKILL.md: remove misleading "strip __c suffix" field-trace troubleshooting
advice; replace with source-DMO passthrough guidance.
7 SKILL.md: rewrite cycle error message to direct user to Data Cloud viewer
(re-export will not fix a cycle in the BDT definition).
8 SKILL.md: add explicit --definition N flag documentation and list every
subcommand that accepts it.
9 SKILL.md: refine I2 routing guidance — pick the earliest formula/
computeRelative node, not the output mapping.
11 bdt-function-catalog.md: clean floor() wording ("always rounds down on the
number line").
12 bdt-node-catalog.md: businessType enum — assert list is canonical/complete;
instruct skill to surface+flag any unknown value.
14 append_and_split.json: change split subject from fragile
CustomerFullName__c split-on-space to ChannelOrderKey__c split-on-hyphen;
avoids name-parsing pitfall (middle names / multi-space).
15 window_and_aggregate.json: use the computed OrderRank__c via a new
FIRST_ORDER_AMOUNT formula node (case when rank=1 then amount else 0)
feeding AGG_BY_ACCOUNT; illustrates the rank+formula+aggregate idiom.
16 joins_and_filters.json: add explicit IS_NOT_NULL filter expression on
GrandTotalAmount__c (defense-in-depth beyond GREATER_THAN 0).
Rejected finding (rationale posted as PR comment):
10 bdt-node-catalog.md split section — reviewer claimed split is a
pipeline-branching node. Canonical sources (core-262
SplitParametersInputRepresentation.java + Salesforce help DITA
c360_a_batch_transform_split.xml) both describe split as a
string-splitting operation. Current docs are correct; not changing.
Tests: 92/92 passing.
Scaffolds the explaining-batch-data-transform skill directory and delivers
the full, production-grade SKILL.md body. 194 lines.
Directory layout established (skills/explaining-batch-data-transform/):
- SKILL.md — the entry point this commit adds
- scripts/ — parser lands in commit 2
- references/, assets/ — reference docs + samples land in commit 3
- tests/ — unit tests + fixtures land in commit 4
SKILL.md frontmatter:
- name, description, tier, and owner fields matching the library's CI
validator schema.
- Description covers the full production surface: "Explain, audit, and
trace Salesforce Data Cloud Batch Data Transform (BDT) JSON — sources,
sinks, stages, lineage, field traces, formulas, multi-definition
payloads, and dual input shapes (editor export + Connect API)."
SKILL.md body (12 sections):
1. When to use this skill
2. Inputs you accept (editor export, Connect API single-definition,
Connect API multi-definition payloads)
3. Mode A — structural survey (summary / sources / outputs / stages)
4. Mode B — per-node explanation (nodes / node)
5. Mode C — lineage + field trace
6. Mode D — formulas and windows
7. Question routing table (user phrasing -> CLI subcommand)
8. Multi-definition payload handling (--definition flag semantics)
9. Troubleshooting (malformed JSON, unknown node refs, broken upstream)
10. Non-goals as explicit "Do not" directives (no execution, no schema
inference beyond what the JSON states, no speculation about runtime)
11. References + sample BDTs index
12. Exit-code + error-class contract surfaced from bdt_analyze.py
Structure passes the repo's skill-validator (npm run validate:skills):
single top-level H1, required sections present, frontmatter schema
aligned, no broken internal links.
@W-22196528@