Problem
pan-os-php is an open-source, community-supported toolkit for bulk PAN-OS and Panorama config work; it is published in the PaloAltoNetworks GitHub org, and current releases come from its maintainer's fork. It lists actions and filters per type, but valid combinations and argument details mostly live in the source. Building a correct command by hand is slow, and an unused-object cleanup done in the wrong order can break rules.
What I built
- A parser that reads the pan-os-php source and extracts a command matrix: 80 command types, of which 33 config types (objects, rules, network and device) carry 526 actions and 1,098 filter operators; the other 47 are stand-alone utilities. It is pinned to one upstream release (extracted Apr 2026).
- An Excel builder with no macros for the 33 config types. Cascading dropdowns (type, action, arguments, filter) assemble a complete command line.
- A 41 KB cleanup guide (rules first, then overrides, objects and tags) that ends with a 19-row table citing source files and lines.
Example output ("show unused address objects"), placeholder names:
pan-os-php in=pano-lab.xml location=DG-Example template=any type=address 'actions=display' 'filter=(object is.unused.recursive)' out=Pan_pano-lab_DG-Example_any_address_unused.xml

How AI was used
AI agents wrote the parser, the workbook generator and the guide (April 2026; current builder July 2026). I picked the problem from field work. The model used for those sessions is not on record.
Results
In Oct 2026 the workbook was rebuilt from the matrix in a temp copy (an AI evidence task): clean exit, 11 sheets, 372 named ranges. The address type alone has 57 actions and 111 unique filter expressions.
The cleanup playbook is in the guide library: pan-os-php cleanup of unused objects.
Status and limits
Working build, small, pinned to one upstream release (extracted Apr 2026). The README still names an older sheet, the builder expects the exported config to be named after the Panorama, and I have no recorded use on a real config yet. The guide assumes Panorama's default object precedence (descendant objects win); its line citations were not re-checked against the latest upstream.
What I learned
Parsing the tool's own source gave a map that follows the code rather than the docs (two orphan entries are still unassigned), and the guide's key steps point to the source behind them.