packet-tracer-skill 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +42 -4
  2. package/README.md +237 -88
  3. package/docs/campus-donor-proof.md +103 -0
  4. package/docs/curated-donor-registry.md +26 -0
  5. package/docs/github-launch-ops-0.2.1.md +45 -0
  6. package/docs/github-launch-ops-0.2.2.md +42 -0
  7. package/docs/github-metadata.md +23 -6
  8. package/docs/hero-demo-plan.md +18 -10
  9. package/docs/home-iot-donor-proof.md +64 -0
  10. package/docs/launch-announcement-0.2.1.md +15 -0
  11. package/docs/launch-announcement-0.2.2.md +15 -0
  12. package/docs/packet-tracer-feature-gap-atlas.md +87 -0
  13. package/docs/post-launch-follow-up.md +39 -0
  14. package/docs/publish-preview-roadmap.md +20 -17
  15. package/docs/release-checklist.md +22 -12
  16. package/docs/{release-notes-0.2.0.md → release-notes-0.2.1.md} +7 -6
  17. package/docs/release-notes-0.2.2.md +26 -0
  18. package/docs/runtime-truth.md +31 -0
  19. package/docs/wan-security-donor-proof.md +41 -0
  20. package/docs/wireless-advanced-proof.md +60 -0
  21. package/examples/README.md +13 -10
  22. package/examples/gallery.md +10 -4
  23. package/examples/index.json +3 -3
  24. package/package.json +44 -16
  25. package/references/curated-donor-registry.json +5 -2
  26. package/references/packettracer-feature-atlas.json +133 -0
  27. package/references/scenario-fixture-corpus.json +1 -0
  28. package/scripts/build_examples_index.py +27 -16
  29. package/scripts/coverage_matrix.py +559 -23
  30. package/scripts/feature_atlas.py +229 -0
  31. package/scripts/generate_pkt.py +330 -31
  32. package/scripts/intent_parser.py +278 -7
  33. package/scripts/pkt_editor.py +174 -0
  34. package/scripts/runtime_doctor.py +83 -10
  35. package/scripts/sample_catalog.py +210 -5
  36. package/docs/screenshots/.gitkeep +0 -1
  37. package/docs/screenshots/packet-tracer-topology-cropped.png +0 -0
  38. package/scripts/__pycache__/build_examples_index.cpython-314.pyc +0 -0
  39. package/scripts/__pycache__/build_sample_catalog.cpython-314.pyc +0 -0
  40. package/scripts/__pycache__/coverage_matrix.cpython-314.pyc +0 -0
  41. package/scripts/__pycache__/donor_diagnostics.cpython-314.pyc +0 -0
  42. package/scripts/__pycache__/generate_pkt.cpython-314.pyc +0 -0
  43. package/scripts/__pycache__/install_skill.cpython-314.pyc +0 -0
  44. package/scripts/__pycache__/intent_parser.cpython-314.pyc +0 -0
  45. package/scripts/__pycache__/packet_tracer_env.cpython-314.pyc +0 -0
  46. package/scripts/__pycache__/pkt_builder.cpython-314.pyc +0 -0
  47. package/scripts/__pycache__/pkt_codec.cpython-314.pyc +0 -0
  48. package/scripts/__pycache__/pkt_editor.cpython-314.pyc +0 -0
  49. package/scripts/__pycache__/pkt_transformer.cpython-314.pyc +0 -0
  50. package/scripts/__pycache__/remote_search.cpython-314.pyc +0 -0
  51. package/scripts/__pycache__/runtime_doctor.cpython-314.pyc +0 -0
  52. package/scripts/__pycache__/sample_catalog.cpython-314.pyc +0 -0
  53. package/scripts/__pycache__/sample_selector.cpython-314.pyc +0 -0
  54. package/scripts/__pycache__/twofish_diagnostics.cpython-314.pyc +0 -0
  55. package/scripts/__pycache__/twofish_runtime.cpython-314.pyc +0 -0
  56. package/scripts/__pycache__/workspace_repair.cpython-314.pyc +0 -0
  57. package/scripts/vendor/__pycache__/twofish.cpython-314.pyc +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  This repo keeps text-based example artifacts under `examples/` and treats them as a known working scenario set, not just a screenshot folder.
4
4
 
5
- For the `0.2.0` launch-prep surface, the canonical public set is:
5
+ For the `0.2.1` public preview surface, the canonical public set is:
6
6
 
7
7
  - `complex_campus_master_edit_v4`
8
8
  - `home_iot_cli_edit_v1`
@@ -32,10 +32,10 @@ Current curated example:
32
32
  Visual snapshot of the same lab opened inside Cisco Packet Tracer.
33
33
 
34
34
  Additional curated examples:
35
- - `home_iot_cli_edit_v1.inventory.json`
36
- Home gateway and IoT registration example focused on gateway-backed device onboarding.
37
- - `screenshots/home_iot_cli_edit_v1.png`
38
- Topology snapshot for the Home IoT example.
35
+ - `home_iot_cli_edit_v1.inventory.json`
36
+ Home gateway and IoT registration example focused on donor-backed, constrained gateway device onboarding.
37
+ - `screenshots/home_iot_cli_edit_v1.png`
38
+ Topology snapshot for the Home IoT example.
39
39
  - `service_heavy_cli_edit_v1.inventory.json`
40
40
  Service-heavy server example focused on DNS, DHCP, FTP, email, syslog, AAA, and related service metadata.
41
41
  - `screenshots/service_heavy_cli_edit_v1.png`
@@ -62,11 +62,14 @@ Generated outputs:
62
62
  Gallery families:
63
63
  - `campus`
64
64
  VLAN, management, ACL, server services, and wireless edits.
65
- - `home_iot`
66
- Home gateway, IoT things, and registration-focused examples.
65
+ - `home_iot`
66
+ Home gateway, IoT things, registration, and constrained donor-backed wireless examples.
67
67
  - `service_heavy`
68
68
  Server-centric service labs with richer metadata.
69
69
 
70
- Launch-prep references:
71
- - `..\docs\hero-demo-plan.md`
72
- - `..\docs\release-notes-0.2.0.md`
70
+ Launch references:
71
+ - `..\docs\hero-demo-plan.md`
72
+ - `..\docs\release-notes-0.2.1.md`
73
+ - `..\docs\campus-donor-proof.md`
74
+ - `..\docs\home-iot-donor-proof.md`
75
+ - `..\docs\wan-security-donor-proof.md`
@@ -2,7 +2,7 @@
2
2
 
3
3
  These examples are public, text-first proof artifacts derived from donor-backed workflows and aligned with the scenario fixture corpus.
4
4
 
5
- `0.2.0` canonical public set:
5
+ `0.2.1` canonical public set:
6
6
 
7
7
  - `campus`
8
8
  - `home_iot`
@@ -12,6 +12,12 @@ Hero visual:
12
12
 
13
13
  - [complex campus screenshot](screenshots/complex_campus_master_edit_v4.png)
14
14
 
15
+ Canonical donor proof:
16
+
17
+ - [campus donor proof](../docs/campus-donor-proof.md)
18
+ - [home IoT donor proof](../docs/home-iot-donor-proof.md)
19
+ - [WAN/security donor proof](../docs/wan-security-donor-proof.md)
20
+
15
21
  | Title | Family | Capabilities | Image | Inventory |
16
22
  | --- | --- | --- | --- | --- |
17
23
  | Complex Campus | `campus` | management_vlan, telnet, acl, server_dns, server_email, server_aaa, wireless_mutation | [screenshot](screenshots/complex_campus_master_edit_v4.png) | [manifest](complex_campus_master_edit_v4.inventory.json) |
@@ -22,10 +28,10 @@ Hero visual:
22
28
  | | | `decision=known_working_example | donor_origin=donor-backed` | | |
23
29
  | | | `runtime=donor-backed example artifact` | | |
24
30
  | Home IoT | `home_iot` | iot, iot_registration, wireless_ap | [screenshot](screenshots/home_iot_cli_edit_v1.png) | [manifest](home_iot_cli_edit_v1.inventory.json) |
25
- | | | Home gateway and IoT device onboarding with gateway-backed registration state. | | |
26
- | | | `known_working_example | donor=donor-backed | capabilities=iot, iot_registration, wireless_ap` | | |
31
+ | | | Home gateway and IoT device onboarding with donor-backed registration state and constrained wireless readiness. | | |
32
+ | | | `known_working_example | donor=donor-backed | capabilities=iot, iot_registration, wireless_ap | mode=donor-backed constrained-generate` | | |
27
33
  | | | `home_iot_complex | known_working_example | family=home_iot` | | |
28
- | | | `iot=generate-ready, iot_registration=generate-ready, wireless_ap=generate-ready` | | |
34
+ | | | `iot=generate-ready, iot_registration=donor-backed constrained-generate, wireless_ap=generate-ready` | | |
29
35
  | | | `decision=known_working_example | donor_origin=donor-backed` | | |
30
36
  | | | `runtime=donor-backed example artifact` | | |
31
37
  | Service Heavy | `service_heavy` | server_dns, server_dhcp, server_ftp, server_email, server_syslog, server_aaa | [screenshot](screenshots/service_heavy_cli_edit_v1.png) | [manifest](service_heavy_cli_edit_v1.inventory.json) |
@@ -46,7 +46,7 @@
46
46
  "name": "home_iot_cli_edit_v1",
47
47
  "title": "Home IoT",
48
48
  "scenario_family": "home_iot",
49
- "summary": "Home gateway and IoT device onboarding with gateway-backed registration state.",
49
+ "summary": "Home gateway and IoT device onboarding with donor-backed registration state and constrained wireless readiness.",
50
50
  "capabilities": [
51
51
  "iot",
52
52
  "iot_registration",
@@ -59,11 +59,11 @@
59
59
  ],
60
60
  "acceptance_rank": 3,
61
61
  "acceptance_label": "known_working_example",
62
- "acceptance_excerpt": "known_working_example | donor=donor-backed | capabilities=iot, iot_registration, wireless_ap",
62
+ "acceptance_excerpt": "known_working_example | donor=donor-backed | capabilities=iot, iot_registration, wireless_ap | mode=donor-backed constrained-generate",
63
63
  "donor_origin": "donor-backed",
64
64
  "fixture_name": "home_iot_complex",
65
65
  "matrix_excerpt": "home_iot_complex | known_working_example | family=home_iot",
66
- "parity_excerpt": "iot=generate-ready, iot_registration=generate-ready, wireless_ap=generate-ready",
66
+ "parity_excerpt": "iot=generate-ready, iot_registration=donor-backed constrained-generate, wireless_ap=generate-ready",
67
67
  "decision_excerpt": "decision=known_working_example | donor_origin=donor-backed",
68
68
  "runtime_excerpt": "runtime=donor-backed example artifact",
69
69
  "inventory_json": "examples/home_iot_cli_edit_v1.inventory.json",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "packet-tracer-skill",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "private": false,
5
5
  "description": "Donor-backed Cisco Packet Tracer 9.x skill for natural-language planning, safe-open generation, editing, parity reporting, and runtime diagnostics across coding hosts.",
6
6
  "keywords": [
@@ -54,25 +54,53 @@
54
54
  "doctor": "node bin/packet-tracer-skill.js --doctor",
55
55
  "smoke:parity": "python scripts/generate_pkt.py --parity-report \"campus with VLAN DHCP ACL\""
56
56
  },
57
- "files": [
58
- "SKILL.md",
59
- "LICENSE",
60
- "LICENSES",
61
- "README.md",
57
+ "files": [
58
+ "SKILL.md",
59
+ "LICENSE",
60
+ "LICENSES",
61
+ "README.md",
62
62
  "CONTRIBUTING.md",
63
63
  "CHANGELOG.md",
64
64
  "CITATION.cff",
65
65
  "SECURITY.md",
66
- "CODE_OF_CONDUCT.md",
67
- "requirements.txt",
68
- "requirements-dev.txt",
69
- "scripts",
70
- "templates",
71
- "references",
72
- "examples",
73
- "bin",
74
- "docs"
75
- ],
66
+ "CODE_OF_CONDUCT.md",
67
+ "requirements.txt",
68
+ "requirements-dev.txt",
69
+ "bin/packet-tracer-skill.js",
70
+ "scripts/*.py",
71
+ "scripts/*.ps1",
72
+ "scripts/vendor/README.md",
73
+ "scripts/vendor/twofish.py",
74
+ "templates",
75
+ "references/*.json",
76
+ "references/*.md",
77
+ "examples/README.md",
78
+ "examples/gallery.md",
79
+ "examples/index.json",
80
+ "examples/blueprint_minimal.json",
81
+ "examples/*.inventory.json",
82
+ "examples/screenshots/*.png",
83
+ "docs/curated-donor-registry.md",
84
+ "docs/campus-donor-proof.md",
85
+ "docs/home-iot-donor-proof.md",
86
+ "docs/wan-security-donor-proof.md",
87
+ "docs/wireless-advanced-proof.md",
88
+ "docs/packet-tracer-feature-gap-atlas.md",
89
+ "docs/discovery-keywords.md",
90
+ "docs/github-discussions-setup.md",
91
+ "docs/github-launch-ops-0.2.1.md",
92
+ "docs/github-launch-ops-0.2.2.md",
93
+ "docs/github-metadata.md",
94
+ "docs/hero-demo-plan.md",
95
+ "docs/launch-announcement-0.2.1.md",
96
+ "docs/launch-announcement-0.2.2.md",
97
+ "docs/post-launch-follow-up.md",
98
+ "docs/publish-preview-roadmap.md",
99
+ "docs/release-checklist.md",
100
+ "docs/release-notes-0.2.1.md",
101
+ "docs/release-notes-0.2.2.md",
102
+ "docs/runtime-truth.md"
103
+ ],
76
104
  "engines": {
77
105
  "node": ">=18"
78
106
  }
@@ -20,7 +20,9 @@
20
20
  "acceptance_fixtures": ["campus_core_complex"],
21
21
  "acceptance_notes": [
22
22
  "Known working campus example with public screenshot and inventory artifact.",
23
- "Use when donor root contains the exported complex campus .pkt example."
23
+ "Use when donor root contains the exported complex campus .pkt example.",
24
+ "Local inventory smoke revalidated the matching campus donor artifact before the public donor proof note was added.",
25
+ "See docs/campus-donor-proof.md for the public proof note: inventory succeeds, but generalized campus prompt selection still fails on layout_reuse_too_weak."
24
26
  ],
25
27
  "provenance": "known-working-example:complex_campus_master_edit_v4"
26
28
  },
@@ -40,7 +42,8 @@
40
42
  "acceptance_fixtures": ["home_iot_complex"],
41
43
  "acceptance_notes": [
42
44
  "Known working home IoT example with gateway-backed registration state.",
43
- "Use when donor root contains the exported Home IoT showcase lab."
45
+ "Use when donor root contains the exported Home IoT showcase lab.",
46
+ "See docs/home-iot-donor-proof.md for the public proof note: constrained donor-backed generate is valid, but broad smart-home synthesis is still intentionally out of scope."
44
47
  ],
45
48
  "provenance": "known-working-example:home_iot_cli_edit_v1"
46
49
  },
@@ -0,0 +1,133 @@
1
+ {
2
+ "atlas_version": "1.0",
3
+ "target_packet_tracer_version": "9.0.0.0810",
4
+ "support_policy": "Truth-first: features start as inventory/report truth and only move to edit or generate when donor-backed acceptance evidence exists.",
5
+ "status_contract": ["not_mapped", "inventory_known", "report_supported", "edit_proven", "donor_backed_ready", "generate_ready"],
6
+ "feature_groups": [
7
+ {
8
+ "id": "ipv6_routing",
9
+ "label": "IPv6 And Routing",
10
+ "scenario_family": "ipv6_routing",
11
+ "wave": 2,
12
+ "features": [
13
+ {"id": "ipv6_slaac", "capability": "ipv6_slaac", "label": "IPv6 SLAAC", "sample_path_keywords": ["ipv6_slaac", "slaac"], "support_ceiling": "edit_proven"},
14
+ {"id": "dhcpv6_stateful", "capability": "dhcpv6_stateful", "label": "DHCPv6 stateful", "sample_path_keywords": ["stateful_dhcpv6"], "support_ceiling": "edit_proven"},
15
+ {"id": "dhcpv6_stateless", "capability": "dhcpv6_stateless", "label": "DHCPv6 stateless", "sample_path_keywords": ["stateless_dhcpv6"], "support_ceiling": "report_supported"},
16
+ {"id": "ipv6_prefix_delegation", "capability": "ipv6_prefix_delegation", "label": "IPv6 prefix delegation", "sample_path_keywords": ["prefix_delegation"], "support_ceiling": "report_supported"},
17
+ {"id": "ipv6_dns_aaaa", "capability": "ipv6_dns_aaaa", "label": "IPv6 DNS AAAA records", "sample_path_keywords": ["dns-a-and-aaaa", "aaaa"], "support_ceiling": "report_supported"},
18
+ {"id": "ipv6_tunneling", "capability": "ipv6_tunneling", "label": "IPv6 tunneling", "sample_path_keywords": ["ipv6ip tunneling", "ipv6ip_"], "support_ceiling": "report_supported"},
19
+ {"id": "isatap", "capability": "isatap", "label": "ISATAP", "sample_path_keywords": ["isatap"], "support_ceiling": "report_supported"},
20
+ {"id": "ospfv3", "capability": "ospfv3", "label": "OSPFv3", "sample_path_keywords": ["ospfv3", "ipv6_ospf"], "support_ceiling": "edit_proven"},
21
+ {"id": "eigrp_ipv6", "capability": "eigrp_ipv6", "label": "EIGRP IPv6", "sample_path_keywords": ["ipv6_eigrp"], "support_ceiling": "edit_proven"},
22
+ {"id": "ripng", "capability": "ripng", "label": "RIPng", "sample_path_keywords": ["ipv6", "rip"], "support_ceiling": "edit_proven"},
23
+ {"id": "hsrp", "capability": "hsrp", "label": "HSRP", "sample_path_keywords": ["hsrp"], "support_ceiling": "edit_proven"}
24
+ ]
25
+ },
26
+ {
27
+ "id": "l2_security_monitoring",
28
+ "label": "L2 Security And Monitoring",
29
+ "scenario_family": "l2_security_monitoring",
30
+ "wave": 3,
31
+ "features": [
32
+ {"id": "dhcp_snooping", "capability": "dhcp_snooping", "label": "DHCP snooping", "sample_path_keywords": ["dhcp_snooping"], "support_ceiling": "edit_proven"},
33
+ {"id": "dai", "capability": "dai", "label": "Dynamic ARP Inspection", "sample_path_keywords": ["dai"], "support_ceiling": "edit_proven"},
34
+ {"id": "dot1x", "capability": "dot1x", "label": "802.1X / NAC", "sample_path_keywords": ["dot1x", "port-based nac"], "support_ceiling": "report_supported"},
35
+ {"id": "lldp", "capability": "lldp", "label": "LLDP", "sample_path_keywords": ["lldp"], "support_ceiling": "edit_proven"},
36
+ {"id": "rep", "capability": "rep", "label": "REP", "sample_path_keywords": ["rep_"], "support_ceiling": "edit_proven"},
37
+ {"id": "snmp", "capability": "snmp", "label": "SNMP", "sample_path_keywords": ["snmp"], "support_ceiling": "edit_proven"},
38
+ {"id": "netflow", "capability": "netflow", "label": "NetFlow", "sample_path_keywords": ["netflow"], "support_ceiling": "edit_proven"},
39
+ {"id": "span", "capability": "span", "label": "SPAN/RSPAN", "sample_path_keywords": ["span"], "support_ceiling": "edit_proven"},
40
+ {"id": "qos", "capability": "qos", "label": "QoS", "sample_path_keywords": ["qos"], "support_ceiling": "report_supported"},
41
+ {"id": "port_security", "capability": "port_security", "label": "Port security", "sample_path_keywords": ["port security", "port-security"], "support_ceiling": "edit_proven"}
42
+ ]
43
+ },
44
+ {
45
+ "id": "security_edge_deepening",
46
+ "label": "Security Edge Deepening",
47
+ "scenario_family": "wan_security_edge",
48
+ "wave": 3,
49
+ "features": [
50
+ {"id": "asa_acl_nat", "capability": "asa_acl_nat", "label": "ASA ACL/NAT", "sample_path_keywords": ["asa_acl_nat"], "support_ceiling": "report_supported"},
51
+ {"id": "asa_service_policy", "capability": "asa_service_policy", "label": "ASA service policy", "sample_path_keywords": ["asa_service_policy"], "support_ceiling": "report_supported"},
52
+ {"id": "clientless_vpn", "capability": "clientless_vpn", "label": "Clientless VPN", "sample_path_keywords": ["clientless_vpn"], "support_ceiling": "report_supported"},
53
+ {"id": "cbac", "capability": "cbac", "label": "CBAC", "sample_path_keywords": ["cbac"], "support_ceiling": "report_supported"},
54
+ {"id": "zfw", "capability": "zfw", "label": "Zone Based Firewall", "sample_path_keywords": ["zfw", "zone based firewall"], "support_ceiling": "report_supported"},
55
+ {"id": "sniffer", "capability": "sniffer", "label": "Sniffer", "sample_path_keywords": ["sniffer"], "support_ceiling": "report_supported"}
56
+ ]
57
+ },
58
+ {
59
+ "id": "wireless_advanced",
60
+ "label": "Advanced Wireless",
61
+ "scenario_family": "wireless_advanced",
62
+ "wave": 4,
63
+ "features": [
64
+ {"id": "wlc", "capability": "wlc", "label": "Wireless LAN Controller", "sample_path_keywords": ["wlc"], "support_ceiling": "report_supported"},
65
+ {"id": "wpa_enterprise", "capability": "wpa_enterprise", "label": "WPA Enterprise / RADIUS", "sample_path_keywords": ["wpa_radius", "wpa2_enterprise"], "support_ceiling": "edit_proven"},
66
+ {"id": "wep", "capability": "wep", "label": "WEP wireless mode", "sample_path_keywords": ["wep"], "support_ceiling": "edit_proven"},
67
+ {"id": "guest_wifi", "capability": "guest_wifi", "label": "Guest Wi-Fi", "sample_path_keywords": ["guest"], "support_ceiling": "report_supported"},
68
+ {"id": "beamforming", "capability": "beamforming", "label": "Beamforming", "sample_path_keywords": ["beamforming"], "support_ceiling": "report_supported"},
69
+ {"id": "meraki", "capability": "meraki", "label": "Meraki security appliance/wireless", "sample_path_keywords": ["meraki"], "support_ceiling": "report_supported"},
70
+ {"id": "cellular_5g", "capability": "cellular_5g", "label": "5G / cellular", "sample_path_keywords": ["5g", "cellular", "cell tower"], "support_ceiling": "report_supported"},
71
+ {"id": "bluetooth", "capability": "bluetooth", "label": "Bluetooth", "sample_path_keywords": ["bluetooth"], "support_ceiling": "report_supported"}
72
+ ]
73
+ },
74
+ {
75
+ "id": "automation_controller",
76
+ "label": "Automation And Programming",
77
+ "scenario_family": "automation_controller",
78
+ "wave": 5,
79
+ "features": [
80
+ {"id": "network_controller", "capability": "network_controller", "label": "Network Controller", "sample_path_keywords": ["network controller", "netcon"], "support_ceiling": "report_supported"},
81
+ {"id": "python_programming", "capability": "python_programming", "label": "Python programming", "sample_path_keywords": ["python", "programming_with_python"], "support_ceiling": "report_supported"},
82
+ {"id": "javascript_programming", "capability": "javascript_programming", "label": "JavaScript programming", "sample_path_keywords": ["javascript"], "support_ceiling": "report_supported"},
83
+ {"id": "blockly_programming", "capability": "blockly_programming", "label": "Blockly programming", "sample_path_keywords": ["blockly"], "support_ceiling": "report_supported"},
84
+ {"id": "tcp_udp_app", "capability": "tcp_udp_app", "label": "TCP/UDP test apps", "sample_path_keywords": ["tcp_test_app", "udp_test_app"], "support_ceiling": "report_supported"},
85
+ {"id": "vm_iox", "capability": "vm_iox", "label": "VM / IOx", "sample_path_keywords": ["iox", "uploading_and_running_vm"], "support_ceiling": "report_supported"}
86
+ ]
87
+ },
88
+ {
89
+ "id": "voice_collaboration",
90
+ "label": "Voice And Collaboration",
91
+ "scenario_family": "voice_collaboration",
92
+ "wave": 5,
93
+ "features": [
94
+ {"id": "voip", "capability": "voip", "label": "VoIP", "sample_path_keywords": ["voip"], "support_ceiling": "report_supported"},
95
+ {"id": "ip_phone", "capability": "ip_phone", "label": "IP phones", "sample_path_keywords": ["phone"], "support_ceiling": "report_supported"},
96
+ {"id": "call_manager", "capability": "call_manager", "label": "Call Manager / telephony service", "sample_path_keywords": ["call", "voip"], "support_ceiling": "report_supported"},
97
+ {"id": "linksys_voice", "capability": "linksys_voice", "label": "Linksys voice", "sample_path_keywords": ["voip linksys"], "support_ceiling": "report_supported"}
98
+ ]
99
+ },
100
+ {
101
+ "id": "industrial_iot",
102
+ "label": "Industrial IoT And Real Apps",
103
+ "scenario_family": "industrial_iot",
104
+ "wave": 5,
105
+ "features": [
106
+ {"id": "mqtt", "capability": "mqtt", "label": "MQTT", "sample_path_keywords": ["mqtt"], "support_ceiling": "report_supported"},
107
+ {"id": "real_http", "capability": "real_http", "label": "Real HTTP", "sample_path_keywords": ["real http", "real-http"], "support_ceiling": "report_supported"},
108
+ {"id": "real_websocket", "capability": "real_websocket", "label": "Real WebSocket", "sample_path_keywords": ["real websocket", "real-websocket"], "support_ceiling": "report_supported"},
109
+ {"id": "visual_scripting", "capability": "visual_scripting", "label": "Visual scripting", "sample_path_keywords": ["visual-scripting", "visual scripting"], "support_ceiling": "report_supported"},
110
+ {"id": "ptp", "capability": "ptp", "label": "PTP", "sample_path_keywords": ["ptp"], "support_ceiling": "report_supported"},
111
+ {"id": "profinet", "capability": "profinet", "label": "Profinet", "sample_path_keywords": ["profinet"], "support_ceiling": "report_supported"},
112
+ {"id": "l2nat", "capability": "l2nat", "label": "L2NAT", "sample_path_keywords": ["l2nat"], "support_ceiling": "report_supported"},
113
+ {"id": "cyberobserver", "capability": "cyberobserver", "label": "CyberObserver", "sample_path_keywords": ["cyberobserver"], "support_ceiling": "report_supported"},
114
+ {"id": "industrial_firewall", "capability": "industrial_firewall", "label": "Industrial firewall", "sample_path_keywords": ["isa3000", "industrial cybersecurity"], "support_ceiling": "report_supported"}
115
+ ]
116
+ },
117
+ {
118
+ "id": "physical_media_device_gaps",
119
+ "label": "Physical Media And Device Gaps",
120
+ "scenario_family": "physical_media_device",
121
+ "wave": 5,
122
+ "features": [
123
+ {"id": "coaxial", "capability": "coaxial", "label": "Coaxial splitter/media", "sample_path_keywords": ["coaxial"], "support_ceiling": "report_supported"},
124
+ {"id": "cable_dsl", "capability": "cable_dsl", "label": "Cable/DSL modem", "sample_path_keywords": ["cable", "dsl"], "support_ceiling": "report_supported"},
125
+ {"id": "central_office", "capability": "central_office", "label": "Central office", "sample_path_keywords": ["centraloffice", "central office"], "support_ceiling": "report_supported"},
126
+ {"id": "cell_tower", "capability": "cell_tower", "label": "Cell tower", "sample_path_keywords": ["cell tower"], "support_ceiling": "report_supported"},
127
+ {"id": "power_distribution", "capability": "power_distribution", "label": "Power distribution", "sample_path_keywords": ["power distribution"], "support_ceiling": "report_supported"},
128
+ {"id": "hot_swappable", "capability": "hot_swappable", "label": "Hot-swappable modules", "sample_path_keywords": ["hotswappable", "hot swappable"], "support_ceiling": "report_supported"},
129
+ {"id": "ios_license", "capability": "ios_license", "label": "IOS/license workflows", "sample_path_keywords": ["ios_15", "license"], "support_ceiling": "report_supported"}
130
+ ]
131
+ }
132
+ ]
133
+ }
@@ -6,6 +6,7 @@
6
6
  "scenario_family": "campus",
7
7
  "preferred_donor_archetypes": ["campus/core"],
8
8
  "critical_capabilities": ["router_on_a_stick", "trunk", "management_vlan", "telnet", "acl", "nat"],
9
+ "prompt_aliases": ["campus with VLAN DHCP ACL"],
9
10
  "minimum_expectations": {
10
11
  "requires_family_match": true,
11
12
  "requires_nonempty_summary": true,
@@ -19,12 +19,12 @@ TITLE_BY_FAMILY = {
19
19
  "wan_security_edge": "WAN Security Edge",
20
20
  }
21
21
 
22
- SUMMARY_BY_FAMILY = {
23
- "campus": "Management VLAN, Telnet, ACL, DNS, email, AAA, and multi-SSID wireless campus edit.",
24
- "home_iot": "Home gateway and IoT device onboarding with gateway-backed registration state.",
25
- "service_heavy": "Service-rich server lab with DNS, DHCP, FTP, email, syslog, AAA, and detailed service metadata.",
26
- "wan_security_edge": "WAN/security-edge lab with multilayer, tunnel, VPN, and edge-policy coverage metadata.",
27
- }
22
+ SUMMARY_BY_FAMILY = {
23
+ "campus": "Management VLAN, Telnet, ACL, DNS, email, AAA, and multi-SSID wireless campus edit.",
24
+ "home_iot": "Home gateway and IoT device onboarding with donor-backed registration state and constrained wireless readiness.",
25
+ "service_heavy": "Service-rich server lab with DNS, DHCP, FTP, email, syslog, AAA, and detailed service metadata.",
26
+ "wan_security_edge": "WAN/security-edge lab with multilayer, tunnel, VPN, and edge-policy coverage metadata.",
27
+ }
28
28
 
29
29
  CAPABILITIES_BY_FAMILY = {
30
30
  "campus": [
@@ -202,12 +202,17 @@ def _build_entry(manifest_path: Path) -> dict[str, object]:
202
202
  preview = _write_preview(manifest_path)
203
203
  screenshot = screenshots[0] if screenshots else None
204
204
  detail_images = screenshots[1:] if len(screenshots) > 1 else []
205
- primary_capabilities = CAPABILITIES_BY_FAMILY.get(family, [])
206
- acceptance_excerpt = f"{acceptance_label} | donor={donor_origin} | capabilities={', '.join(primary_capabilities[:3])}"
207
- fixture_name = FIXTURE_BY_FAMILY.get(family)
208
- matrix_excerpt = f"{fixture_name or 'ad-hoc'} | {acceptance_label} | family={family}"
209
- parity_excerpt = ", ".join(f"{cap}=generate-ready" for cap in primary_capabilities[:3]) if primary_capabilities else "no parity excerpt"
210
- decision_excerpt = f"decision={acceptance_label} | donor_origin={donor_origin}"
205
+ primary_capabilities = CAPABILITIES_BY_FAMILY.get(family, [])
206
+ acceptance_excerpt = f"{acceptance_label} | donor={donor_origin} | capabilities={', '.join(primary_capabilities[:3])}"
207
+ if family == "home_iot":
208
+ acceptance_excerpt += " | mode=donor-backed constrained-generate"
209
+ fixture_name = FIXTURE_BY_FAMILY.get(family)
210
+ matrix_excerpt = f"{fixture_name or 'ad-hoc'} | {acceptance_label} | family={family}"
211
+ if family == "home_iot":
212
+ parity_excerpt = "iot=generate-ready, iot_registration=donor-backed constrained-generate, wireless_ap=generate-ready"
213
+ else:
214
+ parity_excerpt = ", ".join(f"{cap}=generate-ready" for cap in primary_capabilities[:3]) if primary_capabilities else "no parity excerpt"
215
+ decision_excerpt = f"decision={acceptance_label} | donor_origin={donor_origin}"
211
216
  runtime_excerpt = "runtime=donor-backed example artifact"
212
217
  return {
213
218
  "name": name,
@@ -250,7 +255,7 @@ def build_examples_gallery_markdown(payload: dict[str, object]) -> str:
250
255
  "",
251
256
  "These examples are public, text-first proof artifacts derived from donor-backed workflows and aligned with the scenario fixture corpus.",
252
257
  "",
253
- "`0.2.0` canonical public set:",
258
+ "`0.2.1` canonical public set:",
254
259
  "",
255
260
  "- `campus`",
256
261
  "- `home_iot`",
@@ -258,9 +263,15 @@ def build_examples_gallery_markdown(payload: dict[str, object]) -> str:
258
263
  "",
259
264
  "Hero visual:",
260
265
  "",
261
- "- [complex campus screenshot](screenshots/complex_campus_master_edit_v4.png)",
262
- "",
263
- "| Title | Family | Capabilities | Image | Inventory |",
266
+ "- [complex campus screenshot](screenshots/complex_campus_master_edit_v4.png)",
267
+ "",
268
+ "Canonical donor proof:",
269
+ "",
270
+ "- [campus donor proof](../docs/campus-donor-proof.md)",
271
+ "- [home IoT donor proof](../docs/home-iot-donor-proof.md)",
272
+ "- [WAN/security donor proof](../docs/wan-security-donor-proof.md)",
273
+ "",
274
+ "| Title | Family | Capabilities | Image | Inventory |",
264
275
  "| --- | --- | --- | --- | --- |",
265
276
  ]
266
277
  for entry in payload["curated_examples"]: