@raishin/vanguard-frontier-agentic 3.2.0 → 3.3.0

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 (135) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +7 -1
  3. package/.cursor-plugin/plugin.json +7 -1
  4. package/.github/plugin/marketplace.json +1 -1
  5. package/README.md +11 -11
  6. package/agents/cross-functional/revenue-critical-journey-integrity-agent/AGENT.md +112 -0
  7. package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/claude-code.agent.md +111 -0
  8. package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/codex.toml +37 -0
  9. package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/copilot.agent.md +120 -0
  10. package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/cursor.agent.md +112 -0
  11. package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/gemini.agent.md +112 -0
  12. package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/kiro-cli.agent.json +5 -0
  13. package/agents/cross-functional/revenue-critical-journey-integrity-agent/harnesses/kiro-ide.agent.md +111 -0
  14. package/agents/cross-functional/revenue-critical-journey-integrity-agent/metadata.json +42 -0
  15. package/agents/php/composer-supply-chain-agent/AGENT.md +114 -0
  16. package/agents/php/composer-supply-chain-agent/harnesses/claude-code.agent.md +113 -0
  17. package/agents/php/composer-supply-chain-agent/harnesses/codex.toml +119 -0
  18. package/agents/php/composer-supply-chain-agent/harnesses/copilot.agent.md +122 -0
  19. package/agents/php/composer-supply-chain-agent/harnesses/cursor.agent.md +114 -0
  20. package/agents/php/composer-supply-chain-agent/harnesses/gemini.agent.md +114 -0
  21. package/agents/php/composer-supply-chain-agent/harnesses/kiro-cli.agent.json +5 -0
  22. package/agents/php/composer-supply-chain-agent/harnesses/kiro-ide.agent.md +113 -0
  23. package/agents/php/composer-supply-chain-agent/metadata.json +31 -0
  24. package/agents/php/php-application-security-agent/AGENT.md +113 -0
  25. package/agents/php/php-application-security-agent/harnesses/claude-code.agent.md +112 -0
  26. package/agents/php/php-application-security-agent/harnesses/codex.toml +118 -0
  27. package/agents/php/php-application-security-agent/harnesses/copilot.agent.md +121 -0
  28. package/agents/php/php-application-security-agent/harnesses/cursor.agent.md +113 -0
  29. package/agents/php/php-application-security-agent/harnesses/gemini.agent.md +113 -0
  30. package/agents/php/php-application-security-agent/harnesses/kiro-cli.agent.json +5 -0
  31. package/agents/php/php-application-security-agent/harnesses/kiro-ide.agent.md +112 -0
  32. package/agents/php/php-application-security-agent/metadata.json +31 -0
  33. package/agents/php/php-maestro-agent/AGENT.md +81 -0
  34. package/agents/php/php-maestro-agent/harnesses/claude-code.agent.md +80 -0
  35. package/agents/php/php-maestro-agent/harnesses/codex.toml +86 -0
  36. package/agents/php/php-maestro-agent/harnesses/copilot.agent.md +89 -0
  37. package/agents/php/php-maestro-agent/harnesses/cursor.agent.md +81 -0
  38. package/agents/php/php-maestro-agent/harnesses/gemini.agent.md +81 -0
  39. package/agents/php/php-maestro-agent/harnesses/kiro-cli.agent.json +5 -0
  40. package/agents/php/php-maestro-agent/harnesses/kiro-ide.agent.md +80 -0
  41. package/agents/php/php-maestro-agent/metadata.json +31 -0
  42. package/agents/php/php-runtime-upgrade-readiness-agent/AGENT.md +117 -0
  43. package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/claude-code.agent.md +116 -0
  44. package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/codex.toml +122 -0
  45. package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/copilot.agent.md +125 -0
  46. package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/cursor.agent.md +117 -0
  47. package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/gemini.agent.md +117 -0
  48. package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/kiro-cli.agent.json +5 -0
  49. package/agents/php/php-runtime-upgrade-readiness-agent/harnesses/kiro-ide.agent.md +116 -0
  50. package/agents/php/php-runtime-upgrade-readiness-agent/metadata.json +30 -0
  51. package/agents/php/wordpress-security-agent/AGENT.md +107 -0
  52. package/agents/php/wordpress-security-agent/harnesses/claude-code.agent.md +106 -0
  53. package/agents/php/wordpress-security-agent/harnesses/codex.toml +112 -0
  54. package/agents/php/wordpress-security-agent/harnesses/copilot.agent.md +115 -0
  55. package/agents/php/wordpress-security-agent/harnesses/cursor.agent.md +107 -0
  56. package/agents/php/wordpress-security-agent/harnesses/gemini.agent.md +107 -0
  57. package/agents/php/wordpress-security-agent/harnesses/kiro-cli.agent.json +5 -0
  58. package/agents/php/wordpress-security-agent/harnesses/kiro-ide.agent.md +106 -0
  59. package/agents/php/wordpress-security-agent/metadata.json +31 -0
  60. package/catalog/agents.json +175 -0
  61. package/catalog/asset-integrity.json +463 -43
  62. package/catalog/install-roles.json +26 -4
  63. package/catalog/model-assignments.json +198 -0
  64. package/catalog/skill-manifest.json +202 -0
  65. package/catalog/skills.json +163 -0
  66. package/package.json +1 -1
  67. package/plugins/vanguard-frontier-agentic/.codex-plugin/plugin.json +1 -1
  68. package/powers/README.md +3 -2
  69. package/powers/vanguard-generic/POWER.md +1 -1
  70. package/powers/vanguard-php/POWER.md +40 -0
  71. package/schemas/agent.schema.json +2 -1
  72. package/schemas/skill.schema.json +2 -1
  73. package/scripts/generate-docs-data.mjs +1 -1
  74. package/skills/cross-functional/revenue-critical-journey-integrity-review/SKILL.md +108 -0
  75. package/skills/cross-functional/revenue-critical-journey-integrity-review/metadata.json +29 -0
  76. package/skills/cross-functional/revenue-critical-journey-integrity-review/references/idempotency-and-safe-retries.md +155 -0
  77. package/skills/cross-functional/revenue-critical-journey-integrity-review/references/official-sources.md +71 -0
  78. package/skills/cross-functional/revenue-critical-journey-integrity-review/references/pci-saq-scope-boundaries.md +118 -0
  79. package/skills/cross-functional/revenue-critical-journey-integrity-review/references/server-side-revalidation-trust-boundary.md +134 -0
  80. package/skills/cross-functional/revenue-critical-journey-integrity-review/references/webhook-delivery-dedup-ordering.md +146 -0
  81. package/skills/cross-functional/revenue-critical-journey-integrity-review/references/workflow-and-output.md +100 -0
  82. package/skills/php/composer-audit-supply-chain-review/SKILL.md +108 -0
  83. package/skills/php/composer-audit-supply-chain-review/metadata.json +20 -0
  84. package/skills/php/composer-audit-supply-chain-review/references/abandoned-and-advisory-governance.md +30 -0
  85. package/skills/php/composer-audit-supply-chain-review/references/composer-audit-policy.md +35 -0
  86. package/skills/php/composer-audit-supply-chain-review/references/lockfile-integrity.md +27 -0
  87. package/skills/php/php-maestro/SKILL.md +51 -0
  88. package/skills/php/php-maestro/metadata.json +20 -0
  89. package/skills/php/php-maestro/references/hard-gates-and-escalation.md +67 -0
  90. package/skills/php/php-maestro/references/routing-and-dispatch.md +91 -0
  91. package/skills/php/php-runtime-eol-opcache-fpm-review/SKILL.md +109 -0
  92. package/skills/php/php-runtime-eol-opcache-fpm-review/metadata.json +19 -0
  93. package/skills/php/php-runtime-eol-opcache-fpm-review/references/opcache-production-config.md +91 -0
  94. package/skills/php/php-runtime-eol-opcache-fpm-review/references/php-fpm-pool-tuning.md +87 -0
  95. package/skills/php/php-runtime-eol-opcache-fpm-review/references/php-version-lifecycle.md +102 -0
  96. package/skills/php/php-session-upload-deserialization-review/SKILL.md +111 -0
  97. package/skills/php/php-session-upload-deserialization-review/metadata.json +20 -0
  98. package/skills/php/php-session-upload-deserialization-review/references/file-upload-security.md +119 -0
  99. package/skills/php/php-session-upload-deserialization-review/references/session-security.md +126 -0
  100. package/skills/php/php-session-upload-deserialization-review/references/unserialize-object-injection.md +121 -0
  101. package/skills/php/wordpress-rest-block-security-review/SKILL.md +106 -0
  102. package/skills/php/wordpress-rest-block-security-review/metadata.json +20 -0
  103. package/skills/php/wordpress-rest-block-security-review/references/dynamic-block-output-escaping.md +42 -0
  104. package/skills/php/wordpress-rest-block-security-review/references/input-sanitize-output-escape.md +52 -0
  105. package/skills/php/wordpress-rest-block-security-review/references/rest-api-permission-callback.md +48 -0
  106. package/tests/fixtures/php-maestro-routing/expected/001-happy-application-security.json +6 -0
  107. package/tests/fixtures/php-maestro-routing/expected/002-happy-composer-supply-chain.json +6 -0
  108. package/tests/fixtures/php-maestro-routing/expected/003-happy-runtime-upgrade-readiness.json +6 -0
  109. package/tests/fixtures/php-maestro-routing/expected/004-happy-wordpress-security.json +6 -0
  110. package/tests/fixtures/php-maestro-routing/expected/005-happy-unserialize-session.json +6 -0
  111. package/tests/fixtures/php-maestro-routing/expected/006-happy-fpm-opcache.json +6 -0
  112. package/tests/fixtures/php-maestro-routing/expected/007-happy-composer-audit.json +6 -0
  113. package/tests/fixtures/php-maestro-routing/expected/008-happy-wp-permission-callback.json +6 -0
  114. package/tests/fixtures/php-maestro-routing/expected/adv-ambiguous.json +4 -0
  115. package/tests/fixtures/php-maestro-routing/expected/adv-instruction-injection.json +6 -0
  116. package/tests/fixtures/php-maestro-routing/expected/adv-liveguard-db-migration-prod.json +4 -0
  117. package/tests/fixtures/php-maestro-routing/expected/adv-liveguard-deploy-prod.json +4 -0
  118. package/tests/fixtures/php-maestro-routing/expected/adv-persona-replacement.json +6 -0
  119. package/tests/fixtures/php-maestro-routing/expected/adv-secrets-bait.json +7 -0
  120. package/tests/fixtures/php-maestro-routing/inputs/001-happy-application-security.json +7 -0
  121. package/tests/fixtures/php-maestro-routing/inputs/002-happy-composer-supply-chain.json +7 -0
  122. package/tests/fixtures/php-maestro-routing/inputs/003-happy-runtime-upgrade-readiness.json +7 -0
  123. package/tests/fixtures/php-maestro-routing/inputs/004-happy-wordpress-security.json +7 -0
  124. package/tests/fixtures/php-maestro-routing/inputs/005-happy-unserialize-session.json +7 -0
  125. package/tests/fixtures/php-maestro-routing/inputs/006-happy-fpm-opcache.json +7 -0
  126. package/tests/fixtures/php-maestro-routing/inputs/007-happy-composer-audit.json +7 -0
  127. package/tests/fixtures/php-maestro-routing/inputs/008-happy-wp-permission-callback.json +7 -0
  128. package/tests/fixtures/php-maestro-routing/inputs/adv-ambiguous.json +7 -0
  129. package/tests/fixtures/php-maestro-routing/inputs/adv-instruction-injection.json +7 -0
  130. package/tests/fixtures/php-maestro-routing/inputs/adv-liveguard-db-migration-prod.json +7 -0
  131. package/tests/fixtures/php-maestro-routing/inputs/adv-liveguard-deploy-prod.json +7 -0
  132. package/tests/fixtures/php-maestro-routing/inputs/adv-persona-replacement.json +7 -0
  133. package/tests/fixtures/php-maestro-routing/inputs/adv-secrets-bait.json +7 -0
  134. package/tests/fixtures/php-maestro-routing/taxonomy.json +69 -0
  135. package/tests/validate-catalog.py +1 -0
@@ -0,0 +1,71 @@
1
+ # Official sources
2
+
3
+ ## Why this matters
4
+
5
+ Every processor-specific, standard-specific, or architecture-specific claim
6
+ this skill makes traces to exactly one official, primary source — never a
7
+ tutorial, a vendor marketing page, or press coverage. This ledger is that
8
+ trace: one row per source, the exact claim(s) it grounds, the source type,
9
+ the applicable version where one exists, and the verification date. A
10
+ reviewer citing this skill's guidance should be able to follow any claim back
11
+ to the primary document that supports it, and to see at a glance which
12
+ figures are verified fact versus flagged as unverified.
13
+
14
+ ## NORMATIVE: every claim in this skill must resolve to a row below
15
+
16
+ No processor behavior, standard requirement, or architecture guidance may be
17
+ asserted in this skill's other reference files without a corresponding row
18
+ here. If Context7 is unavailable for a processor lookup, the fallback is the
19
+ processor's official documentation site, fetched directly and labeled
20
+ `documentation-based` rather than `context7-grounded` — never memory.
21
+
22
+ | Official URL | Claim(s) supported in this skill | Source type | Applicable version | Last verified |
23
+ |---|---|---|---|---|
24
+ | [Stripe API reference — Idempotent requests](https://docs.stripe.com/api/idempotent_requests) | A client-generated idempotency key lets a `POST` (e.g. create charge/customer) be safely retried after a connection error without duplicating the object or repeating the operation. Stripe caches the first response — including 5xx errors — for at least 24 hours per key, and returns an error if a retry sends parameters differing from the original request. | processor-docs | Current Stripe API (fetched directly; Context7 quota was exhausted — see uncertainty note below) | 2026-07-16 |
25
+ | [Stripe — Webhook best practices](https://docs.stripe.com/webhooks/best-practices) | Endpoints may receive the same event more than once. Live-mode automatic retries continue for up to 3 days with exponential backoff; sandbox retries 3 times over a few hours; manual dashboard resend is available within 15 days and CLI resend within 30 days, and a manual resend does not cancel Stripe's own automatic retry schedule. Endpoints are disabled after 3 days of continuous failure in live mode. Events can arrive out of order. Handlers must be idempotent, e.g. by logging processed event IDs and deduping on them. | processor-docs | Current Stripe webhooks documentation | 2026-07-16 |
26
+ | [PCI SSC FAQ 1443](https://www.pcisecuritystandards.org/faqs/1443/) | SAQs are scoped by how an entity stores, processes, and/or transmits cardholder data; each SAQ type (A, A-EP, B, B-IP, C, C-VT, D, …) has specific eligibility criteria and approved system types; a merchant must confirm SAQ eligibility with its acquirer or the payment brand before self-assessing. Integration model drives the candidate SAQ: fully outsourced redirect/iframe typically maps to SAQ A; direct-post/merchant-served forms typically map to SAQ A-EP; server-side storage/processing of cardholder data maps to SAQ D. | standard | PCI DSS SAQ program (current) | 2026-07-16 |
27
+ | [PCI SSC official blog — Important Updates Announced for Merchants Validating to Self-Assessment Questionnaire A](https://blog.pcisecuritystandards.org/important-updates-announced-for-merchants-validating-to-self-assessment-questionnaire-a) | PCI DSS v4.0.1 requirements 6.4.3 (payment-page script inventory, authorization, and integrity) and 11.6.1 (change-and-tamper-detection mechanism for payment pages) became effective 31 March 2025. Effective with the January 2025 SAQ A revision, PCI SSC removed 6.4.3, 11.6.1, and 12.3.1 from the SAQ A questionnaire itself and replaced them with an eligibility criterion requiring the merchant to attest its site "is not susceptible to attacks from scripts that could affect the merchant's e-commerce system(s)." Corrects the record: the underlying PCI DSS v4.0.1 requirements remain in effect — only the SAQ A checklist scope changed, contingent on the eligibility attestation. | standard | PCI DSS v4.0.1; January 2025 SAQ A revision | 2026-07-16 |
28
+ | [AWS Well-Architected Framework — Reliability Pillar: Mitigate interaction failure with retry limits](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_mitigate_interaction_failure_limit_retries.html) | A "retry storm" occurs when retries compound across multiple stack layers under failure, saturating the service with new-plus-retried requests and reducing availability. Documented mitigation is client-side exponential backoff, jitter, and a maximum retry cap. | cloud-architecture | AWS Well-Architected Framework (current) | 2026-07-16 |
29
+ | [AWS Builders' Library — Timeouts, retries, and backoff with jitter](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/) | Supplementary primary source for backoff-with-jitter retry design at revenue-critical seams; used only to reinforce the Reliability Pillar guidance above, not as a source of any additional unverified claim. | cloud-architecture | AWS Builders' Library (current) | 2026-07-16 |
30
+ | [OWASP Top 10:2021 — A01:2021 Broken Access Control](https://owasp.org/Top10/A01_2021-Broken_Access_Control/) | Grounds the general principle that enforcement decisions (authorization, business-rule checks) must not rely on client-side controls — the basis for treating the server as the only enforcement boundary for client-enforced rules (price, discount, quantity, eligibility, step-completion). | standard | OWASP Top 10:2021 | 2026-07-16 |
31
+ | [OWASP Cheat Sheet Series — Input Validation Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html) | Grounds the requirement that input validation performed client-side is a usability aid, not a security control, and must be re-implemented server-side — supports the server-side re-validation guidance for client-enforced rules. | standard | OWASP Cheat Sheet Series (current) | 2026-07-16 |
32
+ | [Baymard Institute — Cart Abandonment Rate Statistics](https://baymard.com/lists/cart-abandonment-rate) | Aggregate of 50 published studies puts average documented e-commerce cart/checkout abandonment at 70.22%. In Baymard's own study of abandonment reasons, 18% of US online shoppers abandoned an order due to a "too long/complicated checkout process" and 19% cited being required to create an account. Used only as motivating business-pain figures, not as a technical claim. | research-publisher | Baymard Institute published aggregate (current) | 2026-07-16 |
33
+
34
+ ## Known uncertainty / not encoded
35
+
36
+ - **Context7 quota fallback.** Per this skill's Context7 documentation
37
+ protocol, Stripe idempotency and webhook behavior should be resolved via
38
+ Context7 (`resolve-library-id` then `query-docs`) first. During grounding
39
+ for this skill, Context7 returned "Monthly quota reached" for the Stripe
40
+ lookup. The fallback used was a direct fetch of Stripe's official
41
+ documentation pages, and those claims are labeled `documentation-based`
42
+ rather than `context7-grounded` throughout this skill's reference files.
43
+ Re-attempt the Context7 path when quota is available and update the labels
44
+ above if a discrepancy is found.
45
+ - **UNVERIFIED — false-decline dollar estimates, do not encode as fact.**
46
+ Circulating industry estimates of e-commerce revenue lost to false payment
47
+ declines (e.g. figures on the order of ~$81B US / ~$443B global at a
48
+ ~1.51% false-decline rate, and an older Javelin 2014 figure contrasting
49
+ ~$118B in false declines against ~$9B in actual fraud losses) are known
50
+ only via secondary vendor reporting (press coverage citing PYMNTS, Datos
51
+ Insights, Cybersource, and Javelin research) and were **not** verified
52
+ against those primary reports for this skill. These figures must **not**
53
+ be stated as fact anywhere in this skill's guidance or findings. If
54
+ mentioned at all, they must be labeled explicitly as unverified,
55
+ directionally-credible industry estimates requiring primary-source
56
+ re-verification before use — never as a hard number backing a finding or
57
+ a business-pain claim.
58
+
59
+ ## Sources
60
+
61
+ - [Stripe API reference — Idempotent requests](https://docs.stripe.com/api/idempotent_requests)
62
+ - [Stripe — Webhook best practices](https://docs.stripe.com/webhooks/best-practices)
63
+ - [PCI SSC FAQ 1443](https://www.pcisecuritystandards.org/faqs/1443/)
64
+ - [PCI SSC official blog — Important Updates Announced for Merchants Validating to Self-Assessment Questionnaire A](https://blog.pcisecuritystandards.org/important-updates-announced-for-merchants-validating-to-self-assessment-questionnaire-a)
65
+ - [AWS Well-Architected Framework — Reliability Pillar: Mitigate interaction failure with retry limits](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_mitigate_interaction_failure_limit_retries.html)
66
+ - [AWS Builders' Library — Timeouts, retries, and backoff with jitter](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/)
67
+ - [OWASP Top 10:2021 — A01:2021 Broken Access Control](https://owasp.org/Top10/A01_2021-Broken_Access_Control/)
68
+ - [OWASP Cheat Sheet Series — Input Validation Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html)
69
+ - [Baymard Institute — Cart Abandonment Rate Statistics](https://baymard.com/lists/cart-abandonment-rate)
70
+
71
+ Last verified: 2026-07-16.
@@ -0,0 +1,118 @@
1
+ # PCI DSS SAQ scope boundaries
2
+
3
+ ## Why this matters
4
+
5
+ Which Self-Assessment Questionnaire (SAQ) applies to a merchant is driven by
6
+ how the code actually stores, processes, and transmits cardholder data — not
7
+ by what the merchant intends or believes. A redirect/hosted-page integration,
8
+ a direct-post custom form, and server-side card storage are three different
9
+ risk postures with three different SAQ types, and treating them as
10
+ interchangeable is a scope-misjudgment finding in its own right. This skill
11
+ gives an advisory opinion on which SAQ the integration model in the code
12
+ points to; it never issues a compliance determination.
13
+
14
+ ## NORMATIVE: SAQ eligibility is scoped by integration model, and must be confirmed with the acquirer
15
+
16
+ Per PCI SSC FAQ 1443 (`documentation-based`): SAQs are scoped by how an entity
17
+ stores, processes, and/or transmits cardholder data, and each SAQ type (A,
18
+ A-EP, B, B-IP, C, C-VT, D, …) defines specific eligibility criteria and
19
+ approved system types. A merchant must confirm SAQ eligibility with its
20
+ acquirer or the payment brand before self-assessing against a given SAQ — the
21
+ eligibility criteria in the SAQ itself are necessary but not sufficient; the
22
+ acquirer/brand relationship is the actual authority.
23
+
24
+ This agent's SAQ-scope opinion is **advisory input to that confirmation
25
+ process**, not a substitute for it, and never a compliance attestation.
26
+
27
+ ## Reviewer evidence criteria: mapping integration model to candidate SAQ
28
+
29
+ Form the opinion only against the payment integration model actually present
30
+ in the code, not against what the merchant states elsewhere:
31
+
32
+ - **Fully outsourced redirect or iframe (hosted payment page)** — the
33
+ merchant's page never receives, touches, or transmits cardholder data; the
34
+ browser is redirected to, or an iframe is served entirely from, the payment
35
+ processor's domain. Evidence: no card-data form fields rendered by
36
+ merchant-controlled code; the only merchant-side artifact is a link/redirect
37
+ or an iframe `src` pointing at the processor's hosted page. **Typically maps
38
+ to SAQ A.**
39
+ - **Direct-post / merchant-served payment form** — the merchant's own page
40
+ renders the card-data input fields (even if the submission target or an
41
+ embedded field library posts the values onward without the merchant's
42
+ server persisting them), so cardholder data is present in the merchant's
43
+ browser context. Evidence: merchant-authored HTML/JS renders PAN/CVV/expiry
44
+ input elements, or a client-side script the merchant's page loads has the
45
+ ability to observe or intercept those fields before submission. **Typically
46
+ maps to SAQ A-EP.**
47
+ - **Server-side storage or processing of cardholder data** — the merchant's
48
+ backend receives, stores, transmits, or processes the PAN (or full track
49
+ data) directly, rather than only ever exchanging tokens/references with the
50
+ processor. Evidence: server-side code paths, database columns, logs, or API
51
+ payloads that carry raw PAN/CVV. **Maps to SAQ D.**
52
+
53
+ Any of these mappings is an `inference` from the code as reviewed — it is not
54
+ proof that the live, deployed system matches the code path examined, and it
55
+ is not proof the merchant's actual production configuration is what the
56
+ repository suggests.
57
+
58
+ ## NORMATIVE: the 31 March 2025 changes and what they did — and did not — change
59
+
60
+ Per PCI SSC's official blog post "Important Updates Announced for Merchants
61
+ Validating to Self-Assessment Questionnaire A" (`documentation-based`):
62
+
63
+ - PCI DSS v4.0.1 requirements **6.4.3** (payment-page script inventory,
64
+ authorization, and integrity) and **11.6.1** (a change-and-tamper-detection
65
+ mechanism for payment pages) became effective **31 March 2025**. These are
66
+ requirements of the PCI DSS standard itself, not of any one SAQ.
67
+ - Effective with the **January 2025 SAQ A revision**, PCI SSC removed
68
+ requirements 6.4.3, 11.6.1, and 12.3.1 from the SAQ A questionnaire's own
69
+ checklist and replaced them with a new SAQ A **eligibility criterion**: the
70
+ merchant must attest that its site "is not susceptible to attacks from
71
+ scripts that could affect the merchant's e-commerce system(s)."
72
+
73
+ **CORRECT THE RECORD:** a claim that "SAQ A merchants don't need script
74
+ security" is wrong at the standard level. The underlying PCI DSS v4.0.1
75
+ requirements 6.4.3 and 11.6.1 remain in effect and unchanged by this revision
76
+ — what changed is narrower: those two requirements were removed from the SAQ
77
+ A questionnaire's checklist of items to individually validate, and replaced
78
+ with an eligibility attestation that the merchant's site is not susceptible to
79
+ script-based attacks in the first place. A merchant who cannot truthfully make
80
+ that attestation is not eligible for SAQ A at all, regardless of having an
81
+ outsourced redirect/iframe integration. This is exactly the kind of
82
+ architecture-level scope judgment this agent should surface as a finding when
83
+ a reviewed integration's script exposure looks inconsistent with an SAQ A
84
+ eligibility claim.
85
+
86
+ ## RECOMMENDATION: how to document the integration model for a scope opinion
87
+
88
+ - State the integration model observed (redirect / iframe / direct-post /
89
+ server-side) with the specific file(s) or code path(s) as evidence, not a
90
+ general description of the vendor's product.
91
+ - Name the candidate SAQ and label the statement advisory, e.g.: "Based on the
92
+ hosted-redirect integration observed in `checkout/pay.js`, this points to
93
+ SAQ A eligibility, pending confirmation with the acquirer and pending the
94
+ merchant's script-security eligibility attestation; this is advisory input,
95
+ not a compliance determination."
96
+ - Flag, as a distinct finding, any case where the code shows script inclusion
97
+ or third-party tag/pixel loading on a payment page in a redirect/iframe
98
+ integration otherwise claimed as SAQ A-eligible — this bears directly on the
99
+ SAQ A eligibility attestation above, independent of any A-EP/D question.
100
+ - Do not state or imply that passing this review satisfies 6.4.3 or 11.6.1;
101
+ those are PCI DSS requirements validated through the merchant's actual PCI
102
+ assessment process, not through this skill.
103
+
104
+ ## Applicable versions
105
+
106
+ - PCI DSS v4.0.1.
107
+ - The January 2025 SAQ A revision (reflecting the 31 March 2025 effective date
108
+ for requirements 6.4.3 and 11.6.1 across PCI DSS v4.0.1 generally).
109
+ - SAQ eligibility criteria and questionnaire content are revised by PCI SSC
110
+ periodically; re-verify against the current PCI SSC document library before
111
+ relying on a specific SAQ's checklist contents beyond what is stated here.
112
+
113
+ ## Sources
114
+
115
+ - [PCI SSC FAQ 1443 — SAQ scoping and eligibility](https://www.pcisecuritystandards.org/faqs/1443/) — supports the integration-model-to-SAQ mapping (redirect/iframe → SAQ A, direct-post → SAQ A-EP, server-side storage/processing → SAQ D) and the requirement to confirm eligibility with the acquirer/payment brand.
116
+ - [PCI SSC official blog — Important Updates Announced for Merchants Validating to Self-Assessment Questionnaire A](https://blog.pcisecuritystandards.org/important-updates-announced-for-merchants-validating-to-self-assessment-questionnaire-a) — supports the 31 March 2025 effective date for PCI DSS v4.0.1 requirements 6.4.3 and 11.6.1, the January 2025 SAQ A revision removing 6.4.3/11.6.1/12.3.1 from the SAQ A checklist, and the replacement script-security eligibility criterion.
117
+
118
+ Last verified: 2026-07-16.
@@ -0,0 +1,134 @@
1
+ # Server-side re-validation and the client trust boundary
2
+
3
+ ## Why this matters
4
+
5
+ A revenue-critical journey can look correct end-to-end in a browser or mobile
6
+ app and still be trivially bypassable, because a client is not a trusted
7
+ execution environment. Anything the client computes, displays, or gates —
8
+ price, an applied discount, an inventory check, an eligibility rule, a
9
+ required-step sequence — can be altered by a crafted request that never runs
10
+ the client's code at all. If the server does not independently re-check the
11
+ same rule, the "check" was never enforcement; it was UX. The seam this skill
12
+ owns is exactly that gap: a rule that exists in the client tier and has no
13
+ matching guard in the server tier.
14
+
15
+ ## NORMATIVE: the server is the only enforcement boundary
16
+
17
+ Per OWASP Top 10:2021 A01 Broken Access Control (`documentation-based`):
18
+
19
+ > "Access control is only effective in trusted server-side code or server-less
20
+ > API, where the attacker cannot modify the access control check or
21
+ > metadata."
22
+
23
+ The same page states the default posture and the granularity access control
24
+ must operate at:
25
+
26
+ - "Except for public resources, deny by default."
27
+ - "Model access controls should enforce record ownership rather than
28
+ accepting that the user can create, read, update, or delete any record."
29
+
30
+ Per the OWASP Input Validation Cheat Sheet, "Client-side vs Server-side
31
+ Validation" section (`documentation-based`):
32
+
33
+ > "Input validation must be implemented on the server-side before any data is
34
+ > processed by an application's functions, as any JavaScript-based input
35
+ > validation performed on the client-side can be circumvented by an attacker
36
+ > who disables JavaScript or uses a web proxy."
37
+
38
+ Read together, these are not two separate concerns: a price, discount,
39
+ quantity, or step-completion rule is both an access-control decision (is this
40
+ user/request allowed this outcome) and a validated-input decision (is this
41
+ value acceptable), and OWASP normatively requires server-side enforcement for
42
+ both. A client-side implementation of either is UX only and must not be
43
+ treated as the security or business-rule boundary.
44
+
45
+ ## Rules that MUST have a server-side re-check
46
+
47
+ For any revenue-critical journey (checkout, payment submission, account
48
+ creation, login), treat each of the following as requiring an independent
49
+ server-side re-validation, regardless of what the client already checked or
50
+ displays:
51
+
52
+ - **Price** — the amount charged is computed or looked up server-side from
53
+ the catalog/pricing source of record, never trusted from a client-supplied
54
+ field.
55
+ - **Discount / coupon** — the coupon's validity, expiry, eligibility, and
56
+ resulting discount amount are recomputed server-side, not accepted from a
57
+ client-calculated total.
58
+ - **Quantity / inventory** — available stock and requested quantity are
59
+ re-checked against server-side inventory state at submission time, not only
60
+ validated in the client's cart UI.
61
+ - **Eligibility** — any rule gating who may purchase, enroll, or proceed
62
+ (region, age, account tier, promo eligibility) is re-evaluated server-side
63
+ from server-held identity/account data.
64
+ - **Authorization / entitlement** — the request is re-authorized against the
65
+ authenticated user's actual entitlements and record ownership server-side,
66
+ per the OWASP record-ownership principle above, not from a client-asserted
67
+ role or ID.
68
+ - **Required-step completion** — a multi-step flow (e.g. address verification
69
+ before payment, terms acceptance before account creation) is enforced by
70
+ server-side state tracking which steps actually completed, not by the
71
+ client simply choosing not to skip the UI screen.
72
+
73
+ ## Reviewer evidence criteria
74
+
75
+ For each rule above that the client enforces (validates, computes, or gates
76
+ in its own code), check for a corresponding server-side re-check:
77
+
78
+ - Does the server recompute or re-look-up the value (price, discount,
79
+ eligibility) from its own source of record, rather than accepting a
80
+ client-supplied value for that field?
81
+ - If the server does accept a client-supplied value for such a field (e.g. an
82
+ echoed price or discount code), does it independently validate that value
83
+ against server-side state before acting on it, rather than trusting it
84
+ as-is?
85
+ - For required-step flows, does the server track step completion in
86
+ server-side state (a status flag, a state machine) and reject a request
87
+ that skips ahead, rather than relying on the client only calling endpoints
88
+ in the intended order?
89
+ - For authorization/entitlement, does the server check the authenticated
90
+ identity's actual ownership/entitlement for the specific record acted on
91
+ (not just that some valid session exists), consistent with the
92
+ record-ownership requirement above?
93
+ - Is there any code path where a client-controlled field (hidden form field,
94
+ request body value, mobile app local state) is used directly to determine
95
+ a money-moving or eligibility outcome with no corresponding server lookup
96
+ or validation?
97
+
98
+ A rule enforced only in client code, with no matching server-side re-check
99
+ reachable by a crafted request, is a client-trust bypass finding per the
100
+ skill's decision gates — regardless of whether the client-side check is well
101
+ implemented.
102
+
103
+ ## RECOMMENDATION: treat client checks as UX, not defense
104
+
105
+ - Keep client-side checks — they still matter for responsiveness and honest
106
+ users — but design and review them as UX affordances only, never as the
107
+ place a business or security decision is actually made.
108
+ - Where a client displays a server-computed value (price, discount, remaining
109
+ stock), prefer having the server return that value at submission time
110
+ rather than trusting a value the client computed earlier in the session,
111
+ since state can change between page load and submit.
112
+ - When a required-step flow exists, model it as an explicit server-side state
113
+ machine (a status column or equivalent) rather than inferring completion
114
+ from which endpoints were called, so a reordered or replayed client request
115
+ cannot skip a step.
116
+
117
+ ## Applicable versions
118
+
119
+ - This guidance is framework- and processor-agnostic: it applies to any
120
+ client/server split (web, mobile, hybrid) and any payment processor,
121
+ because the underlying principle (client code is attacker-controlled,
122
+ server code is not) does not vary by SDK or API version.
123
+ - Whether a specific codebase actually re-validates a given rule server-side
124
+ is an `inference` from reading that code; the existence of this guidance,
125
+ or of comments claiming server-side validation, never proves a specific
126
+ deployment enforces it correctly — confirm by tracing the server-side code
127
+ path for each rule in scope.
128
+
129
+ ## Sources
130
+
131
+ - [OWASP Top 10:2021 — A01 Broken Access Control](https://owasp.org/Top10/2021/A01_2021-Broken_Access_Control/index.html) — supports the trusted-server-side-code enforcement principle, deny-by-default posture, and record-ownership-level access control requirement.
132
+ - [OWASP Input Validation Cheat Sheet — Client-side vs Server-side Validation](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html) — supports the requirement that input validation be implemented server-side because client-side JavaScript validation can be circumvented.
133
+
134
+ Last verified: 2026-07-16.
@@ -0,0 +1,146 @@
1
+ # Webhook delivery: dedup and ordering
2
+
3
+ ## Why this matters
4
+
5
+ A webhook consumer that assumes a processor delivers each event exactly once,
6
+ in order, will eventually be wrong — in a way that moves money or fulfillment
7
+ state. The same event redelivered after a timeout, manual resend, or retry
8
+ can fulfill an order twice; two events for the same subscription arriving out
9
+ of order can push a state machine into a state it never designed for (e.g.
10
+ acting on `invoice.paid` before the consumer has recorded the
11
+ `customer.subscription.created` it depends on). This is a seam failure
12
+ between the processor and the consuming system, not a bug inside either one:
13
+ the processor behaves exactly as documented and the consumer's logic is
14
+ correct in isolation — the combination breaks.
15
+
16
+ ## The failure
17
+
18
+ - **Duplicate fulfillment.** The same event ID is delivered more than once
19
+ (automatic retry, a manual dashboard/CLI resend, or a genuine at-least-once
20
+ redelivery), and a consumer with no dedupe re-runs the fulfillment side
21
+ effect (ship the order, grant the entitlement, apply the coupon) a second
22
+ time.
23
+ - **Stale-state action.** A later-arriving event is processed before an
24
+ earlier one the consumer's state machine implicitly depends on, and the
25
+ consumer errors, silently no-ops the wrong thing, or lands in an
26
+ inconsistent state because it assumed in-order arrival.
27
+
28
+ ## NORMATIVE: documented Stripe delivery behavior
29
+
30
+ Per Stripe's webhook best practices (`documentation-based`):
31
+
32
+ - **Retries are real and can repeat delivery of the same event.** In live
33
+ mode, Stripe automatically retries a failing endpoint for up to **3 days**
34
+ with exponential backoff. In sandbox/test mode, Stripe retries **3 times
35
+ over a few hours**.
36
+ - **Manual resend is a separate, additive path.** A dashboard resend is
37
+ available for up to **15 days** after event creation; a Stripe CLI resend
38
+ (`stripe events resend <event_id> --webhook-endpoint=<endpoint_id>`) is
39
+ available for up to **30 days**. Manually resending an event does **not**
40
+ cancel Stripe's own automatic retry schedule, even if the manual resend
41
+ gets a `2xx` response — so a single failing delivery can produce the
42
+ automatic retries *and* an operator-triggered resend, multiplying the
43
+ redelivery count a consumer must tolerate.
44
+ - **Endpoints are disabled on continuous failure.** A live-mode endpoint
45
+ that fails continuously for 3 days is disabled by Stripe.
46
+ - **Ordering is explicitly not guaranteed.** Stripe states it does not
47
+ guarantee delivery in the order events are generated — Stripe's own
48
+ example is that a single subscription creation can generate
49
+ `customer.subscription.created`, `invoice.created`, `invoice.paid`, and
50
+ `charge.created` in any order.
51
+ - **The documented dedupe mechanism is event-ID logging.** Stripe's stated
52
+ guidance is to guard against duplicate receipts by logging processed
53
+ event IDs and not reprocessing an already-logged ID; when dedup needs to
54
+ span distinct Event objects for the same underlying change, key on the
55
+ `data.object` ID together with `event.type`.
56
+
57
+ These are Stripe-documented behaviors, not general webhook-delivery norms —
58
+ re-verify against the specific processor's own documentation before
59
+ generalizing to a non-Stripe processor.
60
+
61
+ ## RECOMMENDATION: dedupe table and order-tolerant state machine
62
+
63
+ Dedupe table design:
64
+
65
+ - Maintain a persistent store of processed event IDs (Stripe's `evt_...` ID
66
+ or the processor's equivalent) with a **unique constraint** on the ID
67
+ column, not an in-memory set — the consumer must survive process restarts
68
+ and concurrent delivery.
69
+ - Insert-then-act, not act-then-insert: attempt the insert first and treat a
70
+ unique-constraint violation as "already processed," returning success
71
+ without re-running the side effect; a check-then-insert races under
72
+ concurrent redelivery.
73
+ - Where distinct Event objects can represent the same underlying business
74
+ change (Stripe's documented case), dedupe on the business key
75
+ (`data.object` ID + `event.type`), not solely on the wrapping event ID.
76
+ - Retain processed-event records at least as long as the processor's total
77
+ possible redelivery window (automatic retries plus the longest manual
78
+ resend window it documents) so a late resend still finds the record.
79
+
80
+ Order-tolerant state machine:
81
+
82
+ - No transition may assume a specific predecessor event has already been
83
+ processed. Do not assume event B can never arrive before event A just
84
+ because A "happens first" in the processor's normal flow.
85
+ - Where a later event logically depends on an earlier one (e.g. an invoice
86
+ event depends on the subscription existing), make the handler tolerant of
87
+ the missing precursor: fetch current object state from the processor's
88
+ API rather than relying only on the event payload, or defer the dependent
89
+ event until its precursor is observed — do not error or drop it.
90
+ - Treat each event as reporting the object's *current* state, not a delta.
91
+ Reprocessing an idempotent "set to current state" handler is safe
92
+ regardless of arrival order; reprocessing an "increment/decrement" handler
93
+ is not.
94
+
95
+ ## Authenticity: verify the signature, redact the secret
96
+
97
+ Confirm the consumer verifies the webhook signature on every inbound request,
98
+ using the processor's signing-secret-based verification, before acting on the
99
+ payload. Never request, log, echo, or reproduce the signing secret itself —
100
+ if a signing secret or other credential-shaped string appears in code, logs,
101
+ or configuration in scope, treat it as a redact-and-flag finding: describe its
102
+ presence and location, never print the value.
103
+
104
+ ## Reviewer evidence criteria
105
+
106
+ For each webhook consumer that acts on a money-moving or fulfillment-relevant
107
+ event, check for:
108
+
109
+ - A persisted, uniquely-constrained store of processed event IDs (or
110
+ business keys) that the handler checks before executing any side effect.
111
+ - Confirmation that a redelivered event (same ID, or same `data.object` +
112
+ `event.type`) is a no-op on the side effect, not merely logged as a
113
+ duplicate after the side effect already ran.
114
+ - No code path assuming one event type always arrives before another — look
115
+ for handlers reading state the payload doesn't contain, which would only
116
+ exist if a prior event had already been processed, with no fallback fetch
117
+ or defer path.
118
+ - Signature verification on the inbound handler, using the processor's
119
+ documented method, before any business logic runs.
120
+ - No signing secret, API key, or other credential committed, logged, or
121
+ echoed anywhere in the consumer code or configuration.
122
+ - Retention of processed-event records for at least the processor's combined
123
+ automatic-retry-plus-manual-resend window, so a legitimate late resend
124
+ still hits the dedupe check.
125
+
126
+ Absence of event-ID (or business-key) dedupe, or a state machine that
127
+ silently assumes in-order arrival, on an event that moves money or fulfills
128
+ an order is a blocking finding per the skill's decision gates.
129
+
130
+ ## Applicable versions
131
+
132
+ - The retry windows, resend windows, and disable-on-failure behavior above
133
+ are Stripe's current documented webhook behavior as of this review;
134
+ re-verify against Stripe's live page (or the equivalent page for a
135
+ different processor) before citing an exact figure, since retry/resend
136
+ windows are processor policy and can change.
137
+ - Whether a specific deployment's consumer actually implements event-ID
138
+ dedupe and order-tolerant handling is an `inference` from code review —
139
+ this documentation describes the processor's delivery contract, not any
140
+ particular consumer's behavior.
141
+
142
+ ## Sources
143
+
144
+ - [Stripe webhook best practices](https://docs.stripe.com/webhooks/best-practices) — supports the live-mode 3-day exponential-backoff automatic retry, the sandbox 3-retries-over-a-few-hours behavior, the 15-day dashboard / 30-day CLI manual resend windows, manual resend not cancelling automatic retries, the 3-day continuous-failure endpoint disable, out-of-order delivery, and the processed-event-ID/`data.object`+`event.type` dedupe recommendation.
145
+
146
+ Last verified: 2026-07-16.
@@ -0,0 +1,100 @@
1
+ # Workflow and output contract
2
+
3
+ ## Why this matters
4
+
5
+ A revenue-critical journey can pass review tier by tier — the client validates correctly,
6
+ the server handles the happy path, the webhook consumer parses events fine — and still
7
+ break at the seams between those tiers. This reference is the fixed procedure for finding
8
+ those seam failures and the fixed shape for reporting them, so two reviews of the same
9
+ journey converge on the same findings instead of drifting with reviewer style.
10
+
11
+ ## Workflow
12
+
13
+ Work the seams in scope, not the tiers. For the journeys named in the skill's scope
14
+ (checkout, payment, subscription, coupon, signup, login), follow these steps in order:
15
+
16
+ 1. **Map the seams in scope.** For each journey, enumerate every point where a request
17
+ crosses a trust or process boundary: client-to-server, system-to-processor, and
18
+ webhook-back-into-system. A journey with no payment step still has a client-to-server
19
+ seam (signup, login) even if it has no processor or webhook seam.
20
+ 2. **Check idempotency at money-moving/account-creating requests.** For every request that
21
+ creates a charge, customer, subscription, order, or coupon application, determine whether
22
+ a client retry, gateway retry, or user-driven replay can actually reach it, then check for
23
+ an idempotency mechanism. See
24
+ [idempotency and safe retries](idempotency-and-safe-retries.md).
25
+ 3. **Check server-side re-validation of client-enforced rules.** For every rule the client
26
+ enforces (price, discount, quantity, eligibility, step-completion), confirm the server
27
+ independently re-checks it rather than trusting the client's decision. See
28
+ [server-side re-validation and the client trust boundary](server-side-revalidation-trust-boundary.md).
29
+ 4. **Check webhook consumers for dedup and order-tolerance.** For every webhook consumer
30
+ acting on a money-moving or fulfillment event, verify it dedupes by event id or a business
31
+ key and does not assume in-order delivery. See
32
+ [webhook delivery: dedup and ordering](webhook-delivery-dedup-ordering.md).
33
+ 5. **Check retry safety.** For every retry path at a revenue seam (client, mobile, backend
34
+ queue consumer), verify a bounded attempt count, backoff with jitter, a timeout, and — for
35
+ backend/queue consumers — a circuit breaker or dead-letter path. Flag unbounded or
36
+ synchronized retries as retry-storm risk.
37
+ 6. **Form the advisory SAQ-scope opinion, if requested.** Match the integration model
38
+ actually present in the code (redirect, iframe/hosted fields, direct post/custom form) to
39
+ a candidate SAQ and label the opinion advisory. See
40
+ [PCI DSS SAQ scope boundaries](pci-saq-scope-boundaries.md).
41
+ 7. **Emit findings** using the schema below.
42
+
43
+ ## Finding schema
44
+
45
+ Each finding carries:
46
+
47
+ - **seam** — the specific cross-tier boundary (e.g. "mobile client -> payment intent create
48
+ endpoint", "Stripe webhook -> order fulfillment service").
49
+ - **failure class** — one of `idempotency`, `client-trust`, `webhook-dedup-ordering`,
50
+ `retry-storm`, `saq-scope`.
51
+ - **evidence tier** — one of `repo evidence`, `context7-grounded`, `documentation-based`,
52
+ `inference`, per the skill's evidence classification.
53
+ - **cross-tier failure narrative** — the concrete path from a retry, replay, or bypass to a
54
+ wrong outcome (double charge, double fulfillment, skipped step, wrong SAQ).
55
+ - **remediation** — the concrete mechanism (idempotency-key column plus unique constraint,
56
+ event-id dedupe table, server-side price re-check, bounded backoff with jitter).
57
+ - **verification step** — an exact, reproducible check that would confirm the fix.
58
+ - **owning-tier handoff** — the specialist who owns any tier-internal portion of the finding,
59
+ or "none" if the finding is fully seam-scoped.
60
+
61
+ ## Decision gates
62
+
63
+ - **Block only on a demonstrated reachable retry/replay/bypass path.** A seam without a
64
+ demonstrated reachability path (e.g. a genuinely non-retryable internal call) is not a
65
+ blocking finding.
66
+ - **Processor claims are grounded, not memory.** Every processor-specific idempotency,
67
+ webhook, or signature-verification claim is `context7-grounded` or `documentation-based`,
68
+ per [official sources](official-sources.md); never asserted from memory.
69
+ - **SAQ opinions are advisory.** Every SAQ-scope statement is labeled advisory and tied to
70
+ the integration model actually in the code — never presented as a compliance
71
+ determination.
72
+ - **Tier-internal findings are handed off, not adjudicated.** A finding that lives entirely
73
+ inside one tier (a DOM sink, an authorization-model design choice, a mobile-platform
74
+ detail) is routed to the owning agent, not resolved here.
75
+
76
+ ## Response minimum
77
+
78
+ Every review returns, at minimum:
79
+
80
+ - the seam(s) in scope and, per finding, the failure class and evidence tier;
81
+ - the cross-tier failure narrative for each finding;
82
+ - concrete remediation and an exact verification step per finding;
83
+ - the advisory SAQ-scope opinion, labeled advisory, when requested;
84
+ - tier-internal handoffs and any incident-response escalation (evidence of a live failure —
85
+ duplicate charges in logs, replayed webhooks, retry amplification — escalates immediately
86
+ rather than being filed as a normal review comment).
87
+
88
+ ## Sources
89
+
90
+ This is a process reference internal to this skill; it draws on the skill's own workflow
91
+ definition and the sibling references rather than external primary sources:
92
+
93
+ - [Idempotency and safe retries](idempotency-and-safe-retries.md)
94
+ - [Server-side re-validation and the client trust boundary](server-side-revalidation-trust-boundary.md)
95
+ - [Webhook delivery: dedup and ordering](webhook-delivery-dedup-ordering.md)
96
+ - [PCI DSS SAQ scope boundaries](pci-saq-scope-boundaries.md)
97
+ - [Official sources](official-sources.md) — the primary-source ledger for every
98
+ processor- and standard-specific claim these references make.
99
+
100
+ Last verified: 2026-07-16.