@raishin/vanguard-frontier-agentic 3.15.0 → 3.17.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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +3 -1
- package/.cursor-plugin/plugin.json +3 -1
- package/.github/plugin/marketplace.json +1 -1
- package/README.md +11 -11
- package/agents/AGENTS.md +1 -1
- package/agents/README.md +1 -1
- package/agents/cross-functional/agentic-security-review-agent/AGENT.md +168 -0
- package/agents/cross-functional/agentic-security-review-agent/harnesses/claude-code.agent.md +158 -0
- package/agents/cross-functional/agentic-security-review-agent/harnesses/codex.toml +165 -0
- package/agents/cross-functional/agentic-security-review-agent/harnesses/copilot.agent.md +163 -0
- package/agents/cross-functional/agentic-security-review-agent/harnesses/cursor.agent.md +158 -0
- package/agents/cross-functional/agentic-security-review-agent/harnesses/gemini.agent.md +164 -0
- package/agents/cross-functional/agentic-security-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/cross-functional/agentic-security-review-agent/harnesses/kiro-ide.agent.md +157 -0
- package/agents/cross-functional/agentic-security-review-agent/metadata.json +45 -0
- package/agents/cross-functional/agentic-system-architecture-review-agent/AGENT.md +157 -0
- package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/claude-code.agent.md +147 -0
- package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/codex.toml +154 -0
- package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/copilot.agent.md +152 -0
- package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/cursor.agent.md +147 -0
- package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/gemini.agent.md +153 -0
- package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/cross-functional/agentic-system-architecture-review-agent/harnesses/kiro-ide.agent.md +146 -0
- package/agents/cross-functional/agentic-system-architecture-review-agent/metadata.json +46 -0
- package/agents/typescript/typescript-maestro-agent/AGENT.md +1 -1
- package/agents/typescript/typescript-maestro-agent/harnesses/claude-code.agent.md +1 -1
- package/agents/typescript/typescript-maestro-agent/harnesses/codex.toml +1 -1
- package/agents/typescript/typescript-maestro-agent/harnesses/copilot.agent.md +1 -1
- package/agents/typescript/typescript-maestro-agent/harnesses/cursor.agent.md +1 -1
- package/agents/typescript/typescript-maestro-agent/harnesses/gemini.agent.md +1 -1
- package/agents/typescript/typescript-maestro-agent/harnesses/kiro-cli.agent.json +1 -1
- package/agents/typescript/typescript-maestro-agent/harnesses/kiro-ide.agent.md +1 -1
- package/agents/typescript/typescript-mcp-tool-contract-agent/AGENT.md +1 -1
- package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/claude-code.agent.md +1 -1
- package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/copilot.agent.md +1 -1
- package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/cursor.agent.md +1 -1
- package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/gemini.agent.md +1 -1
- package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/kiro-cli.agent.json +1 -1
- package/agents/typescript/typescript-mcp-tool-contract-agent/harnesses/kiro-ide.agent.md +1 -1
- package/catalog/AGENTS.md +2 -1
- package/catalog/agents.json +71 -0
- package/catalog/asset-integrity.json +1639 -92
- package/catalog/index.json +3 -2
- package/catalog/install-roles.json +24 -3
- package/catalog/model-assignments.json +66 -0
- package/catalog/mods.json +131 -0
- package/catalog/skill-manifest.json +134 -8
- package/catalog/skills.json +89 -0
- package/mods/README.md +220 -0
- package/mods/audit-trail/README.md +70 -0
- package/mods/audit-trail/bin/hook.mjs +65 -0
- package/mods/audit-trail/claude-code/UNSUPPORTED.md +11 -0
- package/mods/audit-trail/claude-code/settings.hooks.json +14 -0
- package/mods/audit-trail/codex/hooks.json +14 -0
- package/mods/audit-trail/kiro/UNSUPPORTED.md +7 -0
- package/mods/audit-trail/kiro/audit-trail-post-tool-use-hook.json +14 -0
- package/mods/audit-trail/lib/common.mjs +213 -0
- package/mods/audit-trail/lib/core.mjs +50 -0
- package/mods/audit-trail/lib/runtime.mjs +140 -0
- package/mods/audit-trail/mod.toml +37 -0
- package/mods/blast-radius-guard/.claude-plugin/plugin.json +5 -0
- package/mods/blast-radius-guard/README.md +53 -0
- package/mods/blast-radius-guard/bin/hook.mjs +18 -0
- package/mods/blast-radius-guard/claude-code/settings.hooks.json +14 -0
- package/mods/blast-radius-guard/codex/UNSUPPORTED.md +7 -0
- package/mods/blast-radius-guard/codex/hooks.json +14 -0
- package/mods/blast-radius-guard/hooks/hooks.json +5 -0
- package/mods/blast-radius-guard/hooks/register.test.ts +97 -0
- package/mods/blast-radius-guard/hooks/register.ts +13 -0
- package/mods/blast-radius-guard/kiro/UNSUPPORTED.md +7 -0
- package/mods/blast-radius-guard/kiro/blast-radius-guard-pre-tool-use-hook.json +14 -0
- package/mods/blast-radius-guard/lib/common.mjs +213 -0
- package/mods/blast-radius-guard/lib/core.mjs +66 -0
- package/mods/blast-radius-guard/lib/patterns.mjs +102 -0
- package/mods/blast-radius-guard/lib/runtime.mjs +140 -0
- package/mods/blast-radius-guard/mod.toml +34 -0
- package/mods/blast-radius-guard/patterns.json +101 -0
- package/mods/context-burn/.claude-plugin/plugin.json +5 -0
- package/mods/context-burn/README.md +66 -0
- package/mods/context-burn/bin/hook.mjs +38 -0
- package/mods/context-burn/claude-code/UNSUPPORTED.md +7 -0
- package/mods/context-burn/claude-code/settings.hooks.json +24 -0
- package/mods/context-burn/codex/UNSUPPORTED.md +7 -0
- package/mods/context-burn/codex/hooks.json +24 -0
- package/mods/context-burn/hooks/hooks.json +5 -0
- package/mods/context-burn/hooks/register.test.ts +151 -0
- package/mods/context-burn/hooks/register.ts +35 -0
- package/mods/context-burn/kiro/UNSUPPORTED.md +7 -0
- package/mods/context-burn/kiro/context-burn-post-tool-use-hook.json +14 -0
- package/mods/context-burn/kiro/context-burn-session-start-hook.json +14 -0
- package/mods/context-burn/lib/common.mjs +213 -0
- package/mods/context-burn/lib/core.mjs +79 -0
- package/mods/context-burn/lib/runtime.mjs +140 -0
- package/mods/context-burn/mod.toml +37 -0
- package/mods/live-guard-gate/.claude-plugin/plugin.json +5 -0
- package/mods/live-guard-gate/README.md +43 -0
- package/mods/live-guard-gate/bin/hook.mjs +12 -0
- package/mods/live-guard-gate/claude-code/settings.hooks.json +14 -0
- package/mods/live-guard-gate/codex/UNSUPPORTED.md +7 -0
- package/mods/live-guard-gate/codex/hooks.json +14 -0
- package/mods/live-guard-gate/hooks/hooks.json +5 -0
- package/mods/live-guard-gate/hooks/register.test.ts +59 -0
- package/mods/live-guard-gate/hooks/register.ts +11 -0
- package/mods/live-guard-gate/kiro/UNSUPPORTED.md +7 -0
- package/mods/live-guard-gate/kiro/live-guard-gate-pre-tool-use-hook.json +14 -0
- package/mods/live-guard-gate/lib/common.mjs +213 -0
- package/mods/live-guard-gate/lib/core.mjs +24 -0
- package/mods/live-guard-gate/lib/live-agents.mjs +65 -0
- package/mods/live-guard-gate/lib/patterns.mjs +523 -0
- package/mods/live-guard-gate/lib/runtime.mjs +140 -0
- package/mods/live-guard-gate/mod.toml +34 -0
- package/mods/live-guard-gate/patterns.json +522 -0
- package/mods/secret-redactor/.claude-plugin/plugin.json +5 -0
- package/mods/secret-redactor/README.md +86 -0
- package/mods/secret-redactor/bin/hook.mjs +35 -0
- package/mods/secret-redactor/claude-code/UNSUPPORTED.md +7 -0
- package/mods/secret-redactor/claude-code/settings.hooks.json +24 -0
- package/mods/secret-redactor/codex/UNSUPPORTED.md +11 -0
- package/mods/secret-redactor/codex/hooks.json +14 -0
- package/mods/secret-redactor/hooks/hooks.json +5 -0
- package/mods/secret-redactor/hooks/register.test.ts +150 -0
- package/mods/secret-redactor/hooks/register.ts +19 -0
- package/mods/secret-redactor/kiro/UNSUPPORTED.md +11 -0
- package/mods/secret-redactor/kiro/secret-redactor-pre-tool-use-hook.json +14 -0
- package/mods/secret-redactor/lib/common.mjs +213 -0
- package/mods/secret-redactor/lib/core.mjs +61 -0
- package/mods/secret-redactor/lib/patterns.mjs +75 -0
- package/mods/secret-redactor/lib/runtime.mjs +140 -0
- package/mods/secret-redactor/mod.toml +43 -0
- package/mods/secret-redactor/patterns.json +74 -0
- package/package.json +9 -4
- package/plugins/vanguard-frontier-agentic/.codex-plugin/plugin.json +1 -1
- package/powers/vanguard-generic/POWER.md +6 -6
- package/powers/vanguard-kubernetes/POWER.md +1 -1
- package/powers/vanguard-multi-cloud/POWER.md +1 -1
- package/schemas/agentic-handoff.schema.json +443 -0
- package/scripts/generate-kiro-powers.mjs +17 -6
- package/scripts/generate-mods.mjs +784 -0
- package/scripts/mods/common.mjs +213 -0
- package/scripts/mods/runtime.mjs +140 -0
- package/scripts/typescript_data/agents/00-typescript-maestro-agent.json +2 -2
- package/scripts/typescript_data/agents/11-typescript-mcp-tool-contract-agent.json +4 -4
- package/skills/cross-functional/agentic-board-protocol/SKILL.md +85 -0
- package/skills/cross-functional/agentic-board-protocol/metadata.json +28 -0
- package/skills/cross-functional/agentic-board-protocol/references/decision-record.md +134 -0
- package/skills/cross-functional/agentic-board-protocol/references/handoff-envelope.md +208 -0
- package/skills/cross-functional/agentic-board-protocol/references/risk-tier-crosswalk.md +88 -0
- package/skills/cross-functional/agentic-board-protocol/references/stop-conditions.md +122 -0
- package/skills/cross-functional/agentic-board-protocol/references/value-case.md +159 -0
- package/skills/cross-functional/agentic-security-review/SKILL.md +78 -0
- package/skills/cross-functional/agentic-security-review/metadata.json +30 -0
- package/skills/cross-functional/agentic-security-review/references/identity-and-delegated-authorization.md +144 -0
- package/skills/cross-functional/agentic-security-review/references/supply-chain-and-provenance.md +111 -0
- package/skills/cross-functional/agentic-security-review/references/threat-model-owasp-asi.md +55 -0
- package/skills/cross-functional/agentic-security-review/references/tools-memory-and-data-reach.md +125 -0
- package/skills/cross-functional/agentic-security-review/references/workflow-and-output.md +210 -0
- package/skills/cross-functional/agentic-system-architecture-review/SKILL.md +74 -0
- package/skills/cross-functional/agentic-system-architecture-review/metadata.json +31 -0
- package/skills/cross-functional/agentic-system-architecture-review/references/delegation-and-handoff-review.md +107 -0
- package/skills/cross-functional/agentic-system-architecture-review/references/pattern-selection.md +81 -0
- package/skills/cross-functional/agentic-system-architecture-review/references/reliability-and-containment.md +86 -0
- package/skills/cross-functional/agentic-system-architecture-review/references/state-memory-and-durability.md +102 -0
- package/skills/cross-functional/agentic-system-architecture-review/references/workflow-and-output.md +135 -0
- package/skills/typescript/typescript-maestro/SKILL.md +1 -1
- package/skills/typescript/typescript-maestro/references/routing-taxonomy.md +1 -1
- package/skills/typescript/typescript-mcp-tool-contract/SKILL.md +1 -1
- package/tests/agentic-board-suite/_build_fixtures.py +1751 -0
- package/tests/agentic-board-suite/_build_harnesses.py +123 -0
- package/tests/agentic-board-suite/agentic_board_rules.py +857 -0
- package/tests/agentic-board-suite/fixtures/invalid/CH-PROPOSAL-LINK--challenge-names-a-later-envelope.json +244 -0
- package/tests/agentic-board-suite/fixtures/invalid/CH-PROPOSAL-LINK--dangling-challenge-beside-a-request.json +410 -0
- package/tests/agentic-board-suite/fixtures/invalid/CH-PROPOSAL-LINK--dangling-proposal.json +187 -0
- package/tests/agentic-board-suite/fixtures/invalid/CH-ROUND-COUNTED--round-two-declared-as-one.json +481 -0
- package/tests/agentic-board-suite/fixtures/invalid/CH-ROUND-COUNTED--self-declared-round.json +187 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-ALTERNATIVES--no-alternatives.json +340 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-COMPLETE--hard-gate-left-behind-by-proposer-swap.json +532 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-COMPLETE--hard-gate-left-unattached.json +480 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-COMPLETE--hard-gate-on-root-left-unattached.json +410 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-COMPLETE--late-challenge-before-record.json +410 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-COMPLETE--superseded-request-missed-earlier-challenge.json +565 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-PRECEDES--withdrawal-attached-before-it-was-sent.json +483 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-PRECEDES--withdrawal-descends-from-the-record.json +547 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-REQUIRED--r1-flag-without-challenge.json +349 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-REQUIRED--r2-without-challenge.json +339 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-REQUIRED--r3-no-flags-without-challenge.json +339 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-RESOLVES--dangling-challenge.json +347 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CHALLENGE-TARGETS-PROPOSAL--challenge-of-requester-message.json +415 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CLASS-FROM-ROOT--root-declares-no-class.json +345 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-CLASS-FROM-ROOT--root-declares-other-class.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-DESIGNATED-CHALLENGER--designated-challenger-only-on-the-framing.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-DESIGNATED-CHALLENGER--investment-without-finance.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-DESIGNATED-CHALLENGER--stopped-designated-challenge.json +348 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-HARD-GATE--conditional-over-hard-gate.json +357 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-HARD-GATE--unresolved-hard-gate.json +357 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-NO-APPROVE-OVER-DISSENT--approve-over-a-stopped-challenge.json +413 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-NO-APPROVE-OVER-DISSENT--approve-over-dissent.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--re-ask-without-supersedes.json +426 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--request-superseded-twice.json +581 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--supersedes-a-challenge.json +427 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--supersedes-a-dangling-id.json +427 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--supersedes-a-later-request.json +500 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--superseding-request-from-another-proposer.json +621 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-ONE-REQUEST--supersession-cycle.json +501 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-OWNER-FROM-ROOT--agent-opens-decision-path.json +480 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-OWNER-FROM-ROOT--owner-is-the-requester.json +273 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-OWNER-FROM-ROOT--request-to-later-sorting-non-owner.json +273 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-OWNER-FROM-ROOT--request-to-non-owner.json +273 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-OWNER-FROM-ROOT--root-names-no-owner.json +341 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-PROPOSER-IS-SENDER--challenger-assembles-request.json +337 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-PROPOSER-NOT-CHALLENGER--self-challenge.json +411 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-RISK-CARRIED--concurrent-higher-tier-envelope.json +403 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-RISK-CARRIED--r5-decided-through-lower-tier-request.json +433 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-RISK-CARRIED--request-drops-materiality-flags.json +479 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-RISK-CARRIED--risk-raised-after-request-before-decision.json +403 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-TO-PRINCIPAL--request-to-agent.json +272 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-UNRESOLVED-DISSENT--dissent-dropped.json +341 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-UNRESOLVED-DISSENT--stopped-challenge-recorded-withdrawn.json +408 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-UNRESOLVED-DISSENT--unresolved-without-dissent.json +341 -0
- package/tests/agentic-board-suite/fixtures/invalid/DR-VALUE-CASE-REQUIRED--investment-without-value-case.json +353 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-AFTER-REQUEST--decided-before-request.json +408 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-AFTER-REQUEST--request-descends-from-its-record.json +408 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-APPROVAL-STATE--state-contradicts-outcome.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-approves-a-redesign.json +433 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-contradicts-outcome.json +433 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-does-not-descend-from-its-record.json +499 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-is-the-parent-of-its-record.json +500 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-names-another-approver.json +438 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-nobody-asked-for.json +421 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGN-BINDING--co-sign-sent-before-the-record.json +499 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGNED--decision-in-force-not-co-signed.json +591 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGNED--later-sorting-second-approver-never-signs.json +359 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-CO-SIGNED--named-second-approver-never-signs.json +359 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-COMPLETED--record-left-dispatched.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-DECIDER-IS-ADDRESSEE--decided-by-non-addressee.json +408 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-DECIDER-IS-ADDRESSEE--earlier-sorting-non-addressee-decides.json +408 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-DECIDER-IS-SENDER--relayed-decision.json +408 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--override-without-acceptance.json +356 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--same-round-withdrawal.json +423 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--stopped-over-cap-withdrawal.json +623 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--unrelated-withdrawal-does-not-clear-gate.json +482 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--withdrawal-names-an-undelivered-envelope.json +482 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-HARD-GATE-ACCEPTANCE--withdrawal-on-another-proposers-revision.json +600 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-NOT-REQUESTER--second-approver-is-requester.json +433 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-ONE-RECORD--contradicting-records.json +416 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-ONE-RECORD--duplicate-co-signature.json +507 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-PRINCIPAL-SOURCE--agent-writes-decision.json +345 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-REQUEST-BINDING--points-at-challenge.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-REQUEST-BINDING--record-names-a-missing-request.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-REQUEST-BINDING--request-edited-after-decision.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-SECOND-APPROVER--r5-request-decided-on-lower-tier-branch.json +418 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-SECOND-APPROVER--r5-single-approver.json +354 -0
- package/tests/agentic-board-suite/fixtures/invalid/DRC-SECOND-APPROVER--second-approver-is-decider.json +359 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-AGENT-NO-APPROVAL--agent-claims-approval.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-APPROVAL-ONLY-ON-RECORD--principal-delegate-claims-approval.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-ATTEN-ACTIONS--child-widens-actions.json +345 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-ATTEN-BUDGET--child-raises-limit.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-ATTEN-BUDGET--currency-changed.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-BLOCK-AS-CHALLENGE--block-sent-as-return.json +184 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-CHAIN-CUSTODY--parent-sender-continues-unstopped.json +187 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-CHAIN-CUSTODY--reply-from-outside-chain.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-CHAIN-PARENT--hop-skips.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-CHAIN-TIME--sent-before-parent.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-DESTINATION-TIER--delegate-to-live-guard.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-DESTINATION-TIER--delegate-to-untiered-agent.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-ESCALATE-TO-PRINCIPAL--escalate-to-agent.json +131 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-ESCALATE-TO-PRINCIPAL--escalated-delegate-to-agent.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-CLASS--classification-lowered.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-DEADLINE--deadline-extended.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-MATERIALITY--flag-dropped.json +434 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-MAX-HOPS--max-hops-raised.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-PROHIBITIONS--prohibition-dropped.json +131 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-SPENT--one-counter-decreases.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-SPENT--spent-counter-reset.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-MONO-TIER--tier-lowered.json +346 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-NO-EXECUTION--deploy-authorized.json +133 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-NO-SELF-ADDRESS--challenge-to-self.json +187 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-ONE-CORRELATION--two-correlations.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-ONE-ROOT--second-root-beside-a-decision.json +410 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-ONE-ROOT--two-roots.json +190 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-CHALLENGE--challenge-without-payload.json +180 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-DECISION-RECORD--record-without-payload.json +331 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-DECISION-REQUEST--request-without-payload.json +324 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-ESCALATE--escalate-without-payload.json +128 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-EXCLUSIVE--return-with-escalation.json +136 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-PAYLOAD-RETURN--return-without-verdict.json +124 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-REASON-HAS-STATUS--reason-on-completed.json +134 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-RETURN-EVIDENCE--pass-on-inference-only.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-RETURN-EVIDENCE--pass-over-blocking-gap.json +137 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-RETURN-EVIDENCE--pass-with-no-evidence.json +127 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-RETURN-TO-SENDER--return-skips-the-delegator.json +185 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-ROOT-PARENT--root-with-parent.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-SCHEMA--unknown-credential-field.json +133 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-STOP-NOTE--conflict-without-note.json +133 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-STOPPED-HAS-REASON--stopped-without-reason.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/HO-UNIQUE-TASK-ID--duplicate-task-id.json +198 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-BUDGET--budget-undeclared.json +123 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-BUDGET--return-overspent.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-CHALLENGE-ROUNDS--revisions-carried-in-rebuttal-challenges.json +461 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-CHALLENGE-ROUNDS--third-round.json +454 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-CHALLENGE-ROUNDS--third-version-by-return-naming-the-original.json +461 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-DEADLINE--sent-after-deadline.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-DEPTH--depth-undeclared.json +182 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-INSTRUCTION-BAIT--claimed-approval-dispatched.json +132 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-LIVE-GUARD--mutation-dispatched.json +130 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-MISSING-EVIDENCE--blocking-gap-dispatched.json +137 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-MISSING-EVIDENCE--decision-request-blocking-gap.json +351 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-ROUTING-LOOP--exchanges-on-the-original-envelope.json +381 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-ROUTING-LOOP--loop-undeclared.json +182 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-ROUTING-LOOP--revisit-to-challenger-of-another-party.json +256 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-ROUTING-LOOP--second-revisit-to-challenger.json +540 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-TERMINAL--challenge-answers-stopped-delegate.json +247 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-TERMINAL--decision-on-escalated-request.json +353 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-TERMINAL--decision-on-stopped-request.json +422 -0
- package/tests/agentic-board-suite/fixtures/invalid/STOP-TERMINAL--reply-to-stopped-delegate.json +244 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-BENEFIT-CEILING--benefit-above-baseline.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-COST-SIGN--negative-risk-loss.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-COST-SIGN--risk-loss-low-minus-one.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-COUNTERFACTUALS--single-agent-counterfactual-missing.json +427 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-COUNTERFACTUALS--workflow-counterfactual-missing.json +427 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-NAV-ARITHMETIC--nav-off-by-one.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-ORDER--inverted-range.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-OVERSIGHT--free-oversight.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-PROMOTION--measured-but-not-incremental.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-PROMOTION--promoted-on-estimate.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-RECOMMEND-INCREMENTAL--recommend-non-incremental.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-RUNS-BOUND--more-successes-than-runs.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-SYNTHETIC--synthetic-claims-measured.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-UNIT-COST--no-successes-nonzero-cost.json +436 -0
- package/tests/agentic-board-suite/fixtures/invalid/VC-UNIT-COST--unit-cost-mismatch.json +436 -0
- package/tests/agentic-board-suite/fixtures/valid/v01-r0-single-review.json +129 -0
- package/tests/agentic-board-suite/fixtures/valid/v01x-block-return-on-inference.json +125 -0
- package/tests/agentic-board-suite/fixtures/valid/v01x-block-return-to-principal.json +125 -0
- package/tests/agentic-board-suite/fixtures/valid/v01x-pass-return-documentation-evidence.json +129 -0
- package/tests/agentic-board-suite/fixtures/valid/v01x-pass-return-mixed-evidence.json +133 -0
- package/tests/agentic-board-suite/fixtures/valid/v01x-pass-return-nonblocking-gap.json +134 -0
- package/tests/agentic-board-suite/fixtures/valid/v02-r2-architecture-dissent.json +343 -0
- package/tests/agentic-board-suite/fixtures/valid/v02x-challenge-after-decision.json +407 -0
- package/tests/agentic-board-suite/fixtures/valid/v02x-challenge-after-record-same-second.json +464 -0
- package/tests/agentic-board-suite/fixtures/valid/v02x-redispatch-after-cured-stop.json +534 -0
- package/tests/agentic-board-suite/fixtures/valid/v02x-security-proposal-returned-to-its-delegator.json +407 -0
- package/tests/agentic-board-suite/fixtures/valid/v03-investment-loses-to-workflow.json +433 -0
- package/tests/agentic-board-suite/fixtures/valid/v04-r3-hard-gate-risk-acceptance.json +354 -0
- package/tests/agentic-board-suite/fixtures/valid/v04x-live-hard-gate-recommend-escalate.json +354 -0
- package/tests/agentic-board-suite/fixtures/valid/v04x-live-hard-gate-recommend-reject.json +354 -0
- package/tests/agentic-board-suite/fixtures/valid/v05-live-guard-escalation.json +129 -0
- package/tests/agentic-board-suite/fixtures/valid/v06-r5-dual-approval.json +430 -0
- package/tests/agentic-board-suite/fixtures/valid/v06x-co-sign-same-second.json +430 -0
- package/tests/agentic-board-suite/fixtures/valid/v06x-re-asked-r5-decision-co-signed-again.json +662 -0
- package/tests/agentic-board-suite/fixtures/valid/v06x-unsigned-approve-superseded-by-co-signed-reject.json +588 -0
- package/tests/agentic-board-suite/fixtures/valid/v07-depth-and-routing-loop.json +180 -0
- package/tests/agentic-board-suite/fixtures/valid/v08-budget-exhausted.json +186 -0
- package/tests/agentic-board-suite/fixtures/valid/v09-instruction-bait.json +131 -0
- package/tests/agentic-board-suite/fixtures/valid/v09x-requester-restates-after-bait.json +251 -0
- package/tests/agentic-board-suite/fixtures/valid/v10-r1-optional-challenge.json +184 -0
- package/tests/agentic-board-suite/fixtures/valid/v10x-report-up-after-challenge.json +246 -0
- package/tests/agentic-board-suite/fixtures/valid/v11-two-rounds-hard-gate-withdrawn.json +478 -0
- package/tests/agentic-board-suite/fixtures/valid/v11x-designated-challenge-first-answer-over-cap.json +598 -0
- package/tests/agentic-board-suite/fixtures/valid/v11x-interleaved-challenger-round-two.json +604 -0
- package/tests/agentic-board-suite/fixtures/valid/v11x-proposal-handed-to-the-challenger-capped.json +860 -0
- package/tests/agentic-board-suite/fixtures/valid/v11x-round-three-escalation-path.json +747 -0
- package/tests/agentic-board-suite/fixtures/valid/v11x-same-second-round-two.json +478 -0
- package/tests/agentic-board-suite/fixtures/valid/v11x-two-findings-one-round.json +549 -0
- package/tests/agentic-board-suite/fixtures/valid/v12-superseded-request.json +497 -0
- package/tests/agentic-board-suite/fixtures/valid/v12x-challenge-after-the-first-decision.json +566 -0
- package/tests/agentic-board-suite/fixtures/valid/v12x-late-challenge-cured-by-supersede.json +566 -0
- package/tests/agentic-board-suite/fixtures/valid/v12x-supersede-in-the-same-second.json +497 -0
- package/tests/agentic-board-suite/test_agentic_board.py +502 -0
- package/tests/fixtures/README.md +1 -1
- package/tests/fuzz-properties.test.mjs +254 -0
- package/tests/mods.test.mjs +768 -0
- package/tests/validate-agent-tool-tiers.py +7 -5
- package/tests/validate-asset-integrity.py +1 -0
- package/tests/validate-mods.py +821 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/VincentChuWaiChow/vanguard-frontier-agentic/schemas/agentic-handoff.schema.json",
|
|
4
|
+
"title": "Agentic Board Handoff Envelope",
|
|
5
|
+
"description": "Structural contract for the only channel between agentic-board agents (agentic-system-architecture-review-agent, agentic-security-review-agent, composed challengers) and accountable human principals. This repo defines the CONTRACT; a deploying organization's runtime is responsible for authenticating senders and approvers, enforcing authorization, and storing records append-only. A valid envelope authorizes nothing: it is a data contract, not an access-control mechanism. Patterns are ECMA-262 as JSON Schema requires: '$' matches only at the end of the string, so a trailing newline never passes (the gate enforces this even where a validator uses Python re.search semantics). This schema checks SHAPE only; every cross-field and cross-message rule (approval sourcing, monotonic attenuation, stop conditions, designated challengers, HARD gates, value-case arithmetic) is checked by tests/agentic-board-suite/agentic_board_rules.py so each rule fails with its own id. No field may carry credentials, tokens, or secrets; principals are opaque pseudonymous subjects, never names or emails.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"schema_version",
|
|
10
|
+
"message_type",
|
|
11
|
+
"task_id",
|
|
12
|
+
"correlation_id",
|
|
13
|
+
"parent_task_id",
|
|
14
|
+
"hop_count",
|
|
15
|
+
"max_hops",
|
|
16
|
+
"sent_at",
|
|
17
|
+
"source",
|
|
18
|
+
"destination",
|
|
19
|
+
"objective",
|
|
20
|
+
"input_schema_version",
|
|
21
|
+
"subject_risk_tier",
|
|
22
|
+
"data_classification",
|
|
23
|
+
"materiality_flags",
|
|
24
|
+
"authorized_actions",
|
|
25
|
+
"do_not_do_list",
|
|
26
|
+
"evidence_refs",
|
|
27
|
+
"missing_evidence",
|
|
28
|
+
"budget",
|
|
29
|
+
"deadline",
|
|
30
|
+
"approval_state",
|
|
31
|
+
"expected_output_schema",
|
|
32
|
+
"status",
|
|
33
|
+
"stop_reasons",
|
|
34
|
+
"synthetic"
|
|
35
|
+
],
|
|
36
|
+
"properties": {
|
|
37
|
+
"schema_version": {
|
|
38
|
+
"const": "1.0.0"
|
|
39
|
+
},
|
|
40
|
+
"message_type": {
|
|
41
|
+
"enum": ["delegate", "return", "challenge", "escalate", "decision-request", "decision-record"],
|
|
42
|
+
"description": "delegate: ask an agent to perform analysis. return: deliver a verdict to the requester. challenge: a designated challenger's adversarial finding on a proposal. escalate: stop and hand to an accountable principal. decision-request: an agent assembles proposal, alternatives, challenges and dissent for a principal (never a decision). decision-record: the principal's decision, bound to one decision-request."
|
|
43
|
+
},
|
|
44
|
+
"task_id": {
|
|
45
|
+
"$ref": "#/$defs/id"
|
|
46
|
+
},
|
|
47
|
+
"correlation_id": {
|
|
48
|
+
"$ref": "#/$defs/id"
|
|
49
|
+
},
|
|
50
|
+
"parent_task_id": {
|
|
51
|
+
"oneOf": [{ "$ref": "#/$defs/id" }, { "type": "null" }],
|
|
52
|
+
"description": "task_id of the message this one responds to; null only on the root message (hop_count 0)."
|
|
53
|
+
},
|
|
54
|
+
"hop_count": {
|
|
55
|
+
"type": "integer",
|
|
56
|
+
"minimum": 0,
|
|
57
|
+
"maximum": 32
|
|
58
|
+
},
|
|
59
|
+
"max_hops": {
|
|
60
|
+
"type": "integer",
|
|
61
|
+
"minimum": 1,
|
|
62
|
+
"maximum": 16
|
|
63
|
+
},
|
|
64
|
+
"sent_at": {
|
|
65
|
+
"$ref": "#/$defs/utc_timestamp"
|
|
66
|
+
},
|
|
67
|
+
"source": {
|
|
68
|
+
"$ref": "#/$defs/party"
|
|
69
|
+
},
|
|
70
|
+
"destination": {
|
|
71
|
+
"$ref": "#/$defs/party"
|
|
72
|
+
},
|
|
73
|
+
"objective": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"minLength": 10,
|
|
76
|
+
"maxLength": 2000,
|
|
77
|
+
"description": "The analysis question, phrased as a review question (\"Assess whether ...\"). An imperative mutation request is a stop condition, not an objective."
|
|
78
|
+
},
|
|
79
|
+
"input_schema_version": {
|
|
80
|
+
"$ref": "#/$defs/semver"
|
|
81
|
+
},
|
|
82
|
+
"subject_risk_tier": {
|
|
83
|
+
"enum": ["R0", "R1", "R2", "R3", "R4", "R5"],
|
|
84
|
+
"description": "Canonical action risk tier (docs/compliance/applicability-engine.md, schemas/audit-event.schema.json risk_tier) of the DECISION UNDER REVIEW, not of the board's own static analysis. Never redefined here."
|
|
85
|
+
},
|
|
86
|
+
"data_classification": {
|
|
87
|
+
"enum": ["public", "internal", "confidential", "restricted"],
|
|
88
|
+
"description": "Classification of the material carried in this envelope; same vocabulary as audit-event input_classification."
|
|
89
|
+
},
|
|
90
|
+
"materiality_flags": {
|
|
91
|
+
"type": "array",
|
|
92
|
+
"uniqueItems": true,
|
|
93
|
+
"items": {
|
|
94
|
+
"enum": ["financial", "regulatory", "security-critical", "external-communication", "personal-data", "irreversible"]
|
|
95
|
+
},
|
|
96
|
+
"description": "Flags that force full-depth review and principal escalation. They never remap subject_risk_tier."
|
|
97
|
+
},
|
|
98
|
+
"authorized_actions": {
|
|
99
|
+
"type": "array",
|
|
100
|
+
"minItems": 1,
|
|
101
|
+
"uniqueItems": true,
|
|
102
|
+
"items": {
|
|
103
|
+
"$ref": "#/$defs/action"
|
|
104
|
+
},
|
|
105
|
+
"description": "Board agents may only be authorized read/analyze/recommend/challenge/escalate (rule HO-NO-EXECUTION). The wider vocabulary exists so a violation is expressible and caught by its own rule."
|
|
106
|
+
},
|
|
107
|
+
"do_not_do_list": {
|
|
108
|
+
"type": "array",
|
|
109
|
+
"minItems": 1,
|
|
110
|
+
"uniqueItems": true,
|
|
111
|
+
"items": {
|
|
112
|
+
"type": "string",
|
|
113
|
+
"minLength": 3,
|
|
114
|
+
"maxLength": 300
|
|
115
|
+
},
|
|
116
|
+
"description": "Explicit prohibitions that travel with the work. Never empty; never shrinks down a chain."
|
|
117
|
+
},
|
|
118
|
+
"evidence_refs": {
|
|
119
|
+
"type": "array",
|
|
120
|
+
"items": {
|
|
121
|
+
"type": "object",
|
|
122
|
+
"additionalProperties": false,
|
|
123
|
+
"required": ["ref", "label"],
|
|
124
|
+
"properties": {
|
|
125
|
+
"ref": { "type": "string", "minLength": 3, "maxLength": 500 },
|
|
126
|
+
"label": {
|
|
127
|
+
"enum": [
|
|
128
|
+
"live-evidence",
|
|
129
|
+
"repo-evidence",
|
|
130
|
+
"user-provided-sanitized-evidence",
|
|
131
|
+
"context7-grounded",
|
|
132
|
+
"documentation-based",
|
|
133
|
+
"inference"
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
"missing_evidence": {
|
|
140
|
+
"type": "array",
|
|
141
|
+
"items": {
|
|
142
|
+
"type": "object",
|
|
143
|
+
"additionalProperties": false,
|
|
144
|
+
"required": ["item", "blocking"],
|
|
145
|
+
"properties": {
|
|
146
|
+
"item": { "type": "string", "minLength": 3, "maxLength": 300 },
|
|
147
|
+
"blocking": { "type": "boolean" }
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
"budget": {
|
|
152
|
+
"type": "object",
|
|
153
|
+
"additionalProperties": false,
|
|
154
|
+
"required": [
|
|
155
|
+
"currency",
|
|
156
|
+
"limit_tool_calls",
|
|
157
|
+
"spent_tool_calls",
|
|
158
|
+
"limit_tokens",
|
|
159
|
+
"spent_tokens",
|
|
160
|
+
"limit_cost_minor",
|
|
161
|
+
"spent_cost_minor"
|
|
162
|
+
],
|
|
163
|
+
"properties": {
|
|
164
|
+
"currency": { "$ref": "#/$defs/currency" },
|
|
165
|
+
"limit_tool_calls": { "type": "integer", "minimum": 0 },
|
|
166
|
+
"spent_tool_calls": { "type": "integer", "minimum": 0 },
|
|
167
|
+
"limit_tokens": { "type": "integer", "minimum": 0 },
|
|
168
|
+
"spent_tokens": { "type": "integer", "minimum": 0 },
|
|
169
|
+
"limit_cost_minor": { "type": "integer", "minimum": 0, "description": "Integer minor currency units (e.g. cents)." },
|
|
170
|
+
"spent_cost_minor": { "type": "integer", "minimum": 0 }
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
"deadline": {
|
|
174
|
+
"$ref": "#/$defs/utc_timestamp"
|
|
175
|
+
},
|
|
176
|
+
"approval_state": {
|
|
177
|
+
"enum": ["not-required", "pending-human-review", "approved", "rejected"],
|
|
178
|
+
"description": "Only a principal-sourced decision-record may carry approved or rejected (rules HO-AGENT-NO-APPROVAL, HO-APPROVAL-ONLY-ON-RECORD, DRC-APPROVAL-STATE)."
|
|
179
|
+
},
|
|
180
|
+
"expected_output_schema": {
|
|
181
|
+
"type": "string",
|
|
182
|
+
"pattern": "^[a-z0-9][a-z0-9-]*/[0-9]+\\.[0-9]+\\.[0-9]+$"
|
|
183
|
+
},
|
|
184
|
+
"status": {
|
|
185
|
+
"enum": ["dispatched", "completed", "escalated", "stopped"],
|
|
186
|
+
"description": "escalated means the message hands the work to a principal, so it is valid only on an envelope addressed to a principal (rule HO-ESCALATE-TO-PRINCIPAL)."
|
|
187
|
+
},
|
|
188
|
+
"stop_reasons": {
|
|
189
|
+
"type": "array",
|
|
190
|
+
"uniqueItems": true,
|
|
191
|
+
"items": {
|
|
192
|
+
"enum": [
|
|
193
|
+
"delegation-depth-exceeded",
|
|
194
|
+
"deadline-passed",
|
|
195
|
+
"budget-exhausted",
|
|
196
|
+
"missing-evidence",
|
|
197
|
+
"live-guard-intent",
|
|
198
|
+
"routing-loop",
|
|
199
|
+
"challenge-rounds-exceeded",
|
|
200
|
+
"conflicting-instructions"
|
|
201
|
+
]
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
"stop_note": {
|
|
205
|
+
"type": "string",
|
|
206
|
+
"minLength": 10,
|
|
207
|
+
"maxLength": 1000,
|
|
208
|
+
"description": "Required when conflicting-instructions is declared (it is declarable, not computable)."
|
|
209
|
+
},
|
|
210
|
+
"redactions": {
|
|
211
|
+
"type": "array",
|
|
212
|
+
"uniqueItems": true,
|
|
213
|
+
"items": { "type": "string", "minLength": 3, "maxLength": 200 }
|
|
214
|
+
},
|
|
215
|
+
"decision_class": {
|
|
216
|
+
"enum": ["architecture", "security", "automation-investment"],
|
|
217
|
+
"description": "Declared by the root delegate's sender: the class of decision this correlation is for. Required on the root of any correlation that carries a decision-request, which must match it (rule DR-CLASS-FROM-ROOT), so a proposer cannot relabel an investment to escape the value case and the finance challenger."
|
|
218
|
+
},
|
|
219
|
+
"decision_owner": {
|
|
220
|
+
"$ref": "#/$defs/principal",
|
|
221
|
+
"description": "Declared by the principal who opens a correlation that will carry a decision-request: the accountable principal every decision-request must be addressed to (rule DR-OWNER-FROM-ROOT), so the proposing agent never chooses its own decider."
|
|
222
|
+
},
|
|
223
|
+
"synthetic": {
|
|
224
|
+
"type": "boolean",
|
|
225
|
+
"description": "true for fixtures and examples. Synthetic records can never carry measured value evidence or promotion beyond pilot (rule VC-SYNTHETIC)."
|
|
226
|
+
},
|
|
227
|
+
"verdict": {
|
|
228
|
+
"type": "object",
|
|
229
|
+
"additionalProperties": false,
|
|
230
|
+
"required": ["outcome", "summary"],
|
|
231
|
+
"properties": {
|
|
232
|
+
"outcome": { "enum": ["pass", "pass-with-conditions", "block", "simpler-pattern-sufficient"] },
|
|
233
|
+
"summary": { "type": "string", "minLength": 10, "maxLength": 2000 },
|
|
234
|
+
"conditions": { "type": "array", "items": { "type": "string", "minLength": 3, "maxLength": 500 } }
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
"challenge": {
|
|
238
|
+
"type": "object",
|
|
239
|
+
"additionalProperties": false,
|
|
240
|
+
"required": ["proposal_task_id", "round", "hard_gate", "outcome", "finding"],
|
|
241
|
+
"properties": {
|
|
242
|
+
"proposal_task_id": { "$ref": "#/$defs/id" },
|
|
243
|
+
"round": { "type": "integer", "minimum": 1, "maximum": 8 },
|
|
244
|
+
"hard_gate": { "type": "boolean" },
|
|
245
|
+
"outcome": { "enum": ["sustained", "withdrawn", "unresolved"] },
|
|
246
|
+
"finding": { "type": "string", "minLength": 10, "maxLength": 2000 }
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
"escalation": {
|
|
250
|
+
"type": "object",
|
|
251
|
+
"additionalProperties": false,
|
|
252
|
+
"required": ["reason", "route_hint"],
|
|
253
|
+
"properties": {
|
|
254
|
+
"reason": { "type": "string", "minLength": 10, "maxLength": 1000 },
|
|
255
|
+
"route_hint": {
|
|
256
|
+
"type": "string",
|
|
257
|
+
"minLength": 3,
|
|
258
|
+
"maxLength": 200,
|
|
259
|
+
"description": "Where an accountable human should take the work next, e.g. the owning provider's live-guard path. A hint, never a dispatch."
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
"decision_request": {
|
|
264
|
+
"type": "object",
|
|
265
|
+
"additionalProperties": false,
|
|
266
|
+
"required": ["decision_class", "proposer_agent", "proposal_summary", "alternatives", "challenge_task_ids", "dissent", "recommended_outcome"],
|
|
267
|
+
"properties": {
|
|
268
|
+
"decision_class": { "enum": ["architecture", "security", "automation-investment"] },
|
|
269
|
+
"proposer_agent": { "$ref": "#/$defs/agent_id" },
|
|
270
|
+
"proposal_summary": { "type": "string", "minLength": 10, "maxLength": 4000 },
|
|
271
|
+
"alternatives": {
|
|
272
|
+
"type": "array",
|
|
273
|
+
"items": {
|
|
274
|
+
"type": "object",
|
|
275
|
+
"additionalProperties": false,
|
|
276
|
+
"required": ["kind", "summary", "rejected_because"],
|
|
277
|
+
"properties": {
|
|
278
|
+
"kind": { "enum": ["eliminate", "redesign", "existing-process", "deterministic-workflow", "conventional-automation", "single-agent", "multi-agent", "other"] },
|
|
279
|
+
"summary": { "type": "string", "minLength": 10, "maxLength": 1000 },
|
|
280
|
+
"rejected_because": { "type": "string", "minLength": 10, "maxLength": 1000 }
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
"challenge_task_ids": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/id" } },
|
|
285
|
+
"dissent": {
|
|
286
|
+
"type": "array",
|
|
287
|
+
"items": {
|
|
288
|
+
"type": "object",
|
|
289
|
+
"additionalProperties": false,
|
|
290
|
+
"required": ["challenge_task_id", "position"],
|
|
291
|
+
"properties": {
|
|
292
|
+
"challenge_task_id": { "$ref": "#/$defs/id" },
|
|
293
|
+
"position": { "type": "string", "minLength": 10, "maxLength": 2000 }
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
"recommended_outcome": { "enum": ["approve", "conditional-approve", "reject", "redesign", "escalate"] },
|
|
298
|
+
"supersedes_task_id": { "$ref": "#/$defs/id", "description": "A decision-request from the same proposer, sent no later than this one, that this one replaces (rule DR-ONE-REQUEST: no request is superseded twice and supersession has no cycle); like every request it goes to the root's decision_owner (rule DR-OWNER-FROM-ROOT). The decision in force is the one bound to the request nothing supersedes; a record on a superseded request is void." },
|
|
299
|
+
"value_case": { "$ref": "#/$defs/value_case" }
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
"decision_record": {
|
|
303
|
+
"type": "object",
|
|
304
|
+
"additionalProperties": false,
|
|
305
|
+
"required": ["request_task_id", "request_digest", "outcome", "decided_by", "rationale", "dissent_acknowledged"],
|
|
306
|
+
"properties": {
|
|
307
|
+
"request_task_id": { "$ref": "#/$defs/id" },
|
|
308
|
+
"request_digest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$", "description": "sha256 of the canonical JSON (sorted keys, separators ',' ':', UTF-8) of the referenced decision-request envelope. Compute it with: python3 tests/agentic-board-suite/agentic_board_rules.py --digest <request-envelope.json>." },
|
|
309
|
+
"outcome": { "enum": ["approve", "conditional-approve", "reject", "redesign"] },
|
|
310
|
+
"decided_by": { "$ref": "#/$defs/principal" },
|
|
311
|
+
"second_approver": { "$ref": "#/$defs/principal", "description": "Named on the decider's record; it counts only once that principal sends their own co-signing decision-record (rules DRC-CO-SIGNED, DRC-CO-SIGN-BINDING)." },
|
|
312
|
+
"co_signs_task_id": { "$ref": "#/$defs/id", "description": "Present only on a co-signing record: the task_id of the decider's record that named this principal as second_approver. A co-signing record repeats the same request, digest and outcome." },
|
|
313
|
+
"risk_acceptance_ref": { "type": "string", "minLength": 3, "maxLength": 300 },
|
|
314
|
+
"conditions": { "type": "array", "items": { "type": "string", "minLength": 3, "maxLength": 500 } },
|
|
315
|
+
"rationale": { "type": "string", "minLength": 10, "maxLength": 4000 },
|
|
316
|
+
"dissent_acknowledged": { "const": true }
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
"$defs": {
|
|
321
|
+
"id": {
|
|
322
|
+
"type": "string",
|
|
323
|
+
"pattern": "^[a-z0-9][a-z0-9-]{2,63}$"
|
|
324
|
+
},
|
|
325
|
+
"agent_id": {
|
|
326
|
+
"type": "string",
|
|
327
|
+
"pattern": "^[a-z0-9][a-z0-9-]*-agent$"
|
|
328
|
+
},
|
|
329
|
+
"semver": {
|
|
330
|
+
"type": "string",
|
|
331
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
|
|
332
|
+
},
|
|
333
|
+
"currency": {
|
|
334
|
+
"type": "string",
|
|
335
|
+
"pattern": "^[A-Z]{3}$"
|
|
336
|
+
},
|
|
337
|
+
"utc_timestamp": {
|
|
338
|
+
"type": "string",
|
|
339
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$",
|
|
340
|
+
"description": "RFC 3339 UTC with a literal Z and whole seconds only, so string order equals time order."
|
|
341
|
+
},
|
|
342
|
+
"action": {
|
|
343
|
+
"enum": ["read", "analyze", "recommend", "challenge", "escalate", "execute", "mutate", "deploy", "approve", "pay", "communicate-externally", "delete", "grant-access"]
|
|
344
|
+
},
|
|
345
|
+
"principal": {
|
|
346
|
+
"type": "object",
|
|
347
|
+
"additionalProperties": false,
|
|
348
|
+
"required": ["kind", "subject", "role"],
|
|
349
|
+
"properties": {
|
|
350
|
+
"kind": { "const": "principal" },
|
|
351
|
+
"subject": {
|
|
352
|
+
"type": "string",
|
|
353
|
+
"pattern": "^subject:[a-z0-9-]{2,32}:[a-f0-9]{16,64}$",
|
|
354
|
+
"description": "Opaque pseudonymous individual subject issued by the deploying organization's identity provider. Never a name, email, or shared role."
|
|
355
|
+
},
|
|
356
|
+
"role": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]{1,63}$" }
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
"agent": {
|
|
360
|
+
"type": "object",
|
|
361
|
+
"additionalProperties": false,
|
|
362
|
+
"required": ["kind", "id"],
|
|
363
|
+
"properties": {
|
|
364
|
+
"kind": { "const": "agent" },
|
|
365
|
+
"id": { "$ref": "#/$defs/agent_id" }
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
"party": {
|
|
369
|
+
"oneOf": [{ "$ref": "#/$defs/agent" }, { "$ref": "#/$defs/principal" }]
|
|
370
|
+
},
|
|
371
|
+
"money_range": {
|
|
372
|
+
"type": "object",
|
|
373
|
+
"additionalProperties": false,
|
|
374
|
+
"required": ["low", "point", "high"],
|
|
375
|
+
"properties": {
|
|
376
|
+
"low": { "type": "integer" },
|
|
377
|
+
"point": { "type": "integer" },
|
|
378
|
+
"high": { "type": "integer" }
|
|
379
|
+
},
|
|
380
|
+
"description": "Integer minor currency units; low <= point <= high (rule VC-ORDER)."
|
|
381
|
+
},
|
|
382
|
+
"value_case": {
|
|
383
|
+
"type": "object",
|
|
384
|
+
"additionalProperties": false,
|
|
385
|
+
"required": [
|
|
386
|
+
"currency",
|
|
387
|
+
"baseline_process",
|
|
388
|
+
"annual_volume",
|
|
389
|
+
"baseline_labor_error_cost",
|
|
390
|
+
"baseline_loss_leakage",
|
|
391
|
+
"intervention_rate_bp",
|
|
392
|
+
"exception_rate_bp",
|
|
393
|
+
"verified_annual_benefit",
|
|
394
|
+
"annual_run_cost",
|
|
395
|
+
"annual_oversight_cost",
|
|
396
|
+
"annualized_implementation_cost",
|
|
397
|
+
"expected_risk_loss",
|
|
398
|
+
"net_annual_value",
|
|
399
|
+
"runs",
|
|
400
|
+
"successful_runs",
|
|
401
|
+
"cost_per_successful_task_minor",
|
|
402
|
+
"counterfactuals",
|
|
403
|
+
"confidence",
|
|
404
|
+
"promotion_state",
|
|
405
|
+
"measurement_plan"
|
|
406
|
+
],
|
|
407
|
+
"properties": {
|
|
408
|
+
"currency": { "$ref": "#/$defs/currency" },
|
|
409
|
+
"baseline_process": { "type": "string", "minLength": 10, "maxLength": 1000 },
|
|
410
|
+
"annual_volume": { "type": "integer", "minimum": 0 },
|
|
411
|
+
"baseline_labor_error_cost": { "type": "integer", "minimum": 0 },
|
|
412
|
+
"baseline_loss_leakage": { "type": "integer", "minimum": 0 },
|
|
413
|
+
"intervention_rate_bp": { "type": "integer", "minimum": 0, "maximum": 10000, "description": "Share of cases needing human intervention, in basis points." },
|
|
414
|
+
"exception_rate_bp": { "type": "integer", "minimum": 0, "maximum": 10000 },
|
|
415
|
+
"verified_annual_benefit": { "$ref": "#/$defs/money_range" },
|
|
416
|
+
"annual_run_cost": { "$ref": "#/$defs/money_range" },
|
|
417
|
+
"annual_oversight_cost": { "$ref": "#/$defs/money_range" },
|
|
418
|
+
"annualized_implementation_cost": { "$ref": "#/$defs/money_range" },
|
|
419
|
+
"expected_risk_loss": { "$ref": "#/$defs/money_range" },
|
|
420
|
+
"net_annual_value": { "$ref": "#/$defs/money_range" },
|
|
421
|
+
"runs": { "type": "integer", "minimum": 0 },
|
|
422
|
+
"successful_runs": { "type": "integer", "minimum": 0 },
|
|
423
|
+
"cost_per_successful_task_minor": { "type": "integer", "minimum": 0 },
|
|
424
|
+
"counterfactuals": {
|
|
425
|
+
"type": "array",
|
|
426
|
+
"items": {
|
|
427
|
+
"type": "object",
|
|
428
|
+
"additionalProperties": false,
|
|
429
|
+
"required": ["kind", "net_annual_value", "basis"],
|
|
430
|
+
"properties": {
|
|
431
|
+
"kind": { "enum": ["existing-process", "conventional-automation", "deterministic-workflow", "single-agent", "multi-agent"] },
|
|
432
|
+
"net_annual_value": { "$ref": "#/$defs/money_range" },
|
|
433
|
+
"basis": { "type": "string", "minLength": 10, "maxLength": 1000 }
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
},
|
|
437
|
+
"confidence": { "enum": ["assumption", "estimate", "benchmark", "measured"] },
|
|
438
|
+
"promotion_state": { "enum": ["candidate", "pilot", "limited-production", "production"] },
|
|
439
|
+
"measurement_plan": { "type": "string", "minLength": 10, "maxLength": 2000 }
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
@@ -311,7 +311,7 @@ const DERIVED_KEYWORDS = {
|
|
|
311
311
|
marketing: ["marketing-governance", "consent-compliance", "advertising-fairness", "email-authentication"],
|
|
312
312
|
hr: ["hr-governance", "employment-risk", "compensation-equity", "recruiting"],
|
|
313
313
|
legal: ["legal-risk", "contract-review", "privacy-compliance", "regulatory"],
|
|
314
|
-
generic: ["test-quality", "ci-pipeline", "helm-chart", "manifest-review"],
|
|
314
|
+
generic: ["test-quality", "ci-pipeline", "helm-chart", "manifest-review", "agentic-security", "multi-agent-architecture"],
|
|
315
315
|
"multi-cloud": ["finops", "cloud-pricing", "cost-optimization", "reserved-instances"],
|
|
316
316
|
backstage: ["backstage", "scaffolder", "software-templates", "developer-portal"],
|
|
317
317
|
"cert-manager": ["cert-manager", "x509", "certificate-lifecycle", "pki"],
|
|
@@ -386,6 +386,16 @@ function deriveTopics(entries) {
|
|
|
386
386
|
return topics.join(", ");
|
|
387
387
|
}
|
|
388
388
|
|
|
389
|
+
/**
|
|
390
|
+
* Directories under agents/ that actually hold a provider's agents. The provider id is
|
|
391
|
+
* not a path: generic agents live in agents/qa/ and agents/cross-functional/, so naming
|
|
392
|
+
* agents/<provider>/ would point readers at a directory that does not exist.
|
|
393
|
+
*/
|
|
394
|
+
function agentDirs(entries) {
|
|
395
|
+
const dirs = [...new Set(entries.map((e) => e.path.split("/")[1]))].sort();
|
|
396
|
+
return dirs.map((d) => `agents/${d}/`).join(" and ");
|
|
397
|
+
}
|
|
398
|
+
|
|
389
399
|
/**
|
|
390
400
|
* Select the routing maestro for a provider's Power.
|
|
391
401
|
*
|
|
@@ -503,7 +513,7 @@ function deriveProviderConfig(provider, catalogEntries) {
|
|
|
503
513
|
} else {
|
|
504
514
|
// Multiple agents, no maestro
|
|
505
515
|
const topics = deriveTopics(entries);
|
|
506
|
-
description = `Curated ${displayLabel} review agents covering ${topics}. Reference agents directly under
|
|
516
|
+
description = `Curated ${displayLabel} review agents covering ${topics}. Reference agents directly under ${agentDirs(entries)}. Static review only; no live mutations.`;
|
|
507
517
|
}
|
|
508
518
|
|
|
509
519
|
// Keywords
|
|
@@ -547,7 +557,7 @@ function deriveProviderConfig(provider, catalogEntries) {
|
|
|
547
557
|
} else if (provider === "multi-cloud") {
|
|
548
558
|
invariants.push("Cost recommendations are estimates based on public pricing; verify against actual billing before acting.");
|
|
549
559
|
} else if (provider === "generic") {
|
|
550
|
-
invariants.push("Agents are provider-agnostic
|
|
560
|
+
invariants.push("Agents are provider-agnostic: CI, Helm, manifest, and test-quality review under agents/qa/; cross-tier revenue-journey integrity and vendor-neutral agentic system architecture and security review under agents/cross-functional/. The agentic reviewers hand off through skills/cross-functional/agentic-board-protocol and never approve or execute.");
|
|
551
561
|
} else if (provider === "argocd") {
|
|
552
562
|
invariants.push("Sync and rollout strategies must be validated against the target cluster GitOps workflow.");
|
|
553
563
|
} else if (provider === "backstage") {
|
|
@@ -619,11 +629,12 @@ function summarize(provider) {
|
|
|
619
629
|
maestro,
|
|
620
630
|
liveMaestro,
|
|
621
631
|
liveGuards,
|
|
632
|
+
dirs: agentDirs(entries),
|
|
622
633
|
};
|
|
623
634
|
}
|
|
624
635
|
|
|
625
636
|
function renderPower(provider, cfg) {
|
|
626
|
-
const { total, kiroAvailable, maestro, liveMaestro, liveGuards } = summarize(provider);
|
|
637
|
+
const { total, kiroAvailable, maestro, liveMaestro, liveGuards, dirs } = summarize(provider);
|
|
627
638
|
const frontmatter = [
|
|
628
639
|
"---",
|
|
629
640
|
`name: "vanguard-${provider}"`,
|
|
@@ -676,7 +687,7 @@ function renderPower(provider, cfg) {
|
|
|
676
687
|
? liveMaestro
|
|
677
688
|
? `This board has two planes with two routers. Send static-review work to \`${maestro.id}\` — its contract refuses live operations, so it must never be given a mutation task. Send live control-plane work to \`${liveMaestro.id}\`, which is the only router that gates the live-guard operators below. Classify first, then dispatch to one specialist or a small parallel team; never have either maestro execute a mutation itself.`
|
|
678
689
|
: "Use the maestro as the entry point: classify the task, then dispatch to one specialist or a parallel team of specialists. Never have the maestro itself execute a live mutation."
|
|
679
|
-
: "Reference agents directly from
|
|
690
|
+
: "Reference agents directly from " + dirs + " without maestro-based routing.",
|
|
680
691
|
"",
|
|
681
692
|
"## Live-guard agents (gate_mode only)",
|
|
682
693
|
"",
|
|
@@ -692,7 +703,7 @@ function renderPower(provider, cfg) {
|
|
|
692
703
|
"",
|
|
693
704
|
"## Where the agents live",
|
|
694
705
|
"",
|
|
695
|
-
`Agent specs and adapters are part of the [Vanguard Frontier Agentic](https://github.com/VincentChuWaiChow/vanguard-frontier-agentic) marketplace. For this provider, see
|
|
706
|
+
`Agent specs and adapters are part of the [Vanguard Frontier Agentic](https://github.com/VincentChuWaiChow/vanguard-frontier-agentic) marketplace. For this provider, see ${dirs.split(" and ").map((d) => "`" + d + "`").join(" and ")} in that repository. ${adapterNote}`,
|
|
696
707
|
"",
|
|
697
708
|
"## Companion install paths",
|
|
698
709
|
"",
|