platformforge 0.1.0__py3-none-any.whl
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.
- platformforge/__init__.py +7 -0
- platformforge/__main__.py +5 -0
- platformforge/_forge_portal.py +913 -0
- platformforge/_graphstudio.py +376 -0
- platformforge/_graphview.py +181 -0
- platformforge/_installkit.py +1706 -0
- platformforge/agents/__init__.py +156 -0
- platformforge/agents/bench.py +61 -0
- platformforge/agents/contextpack.py +137 -0
- platformforge/agents/contracts.py +394 -0
- platformforge/agents/coordinators.py +98 -0
- platformforge/agents/critic.py +113 -0
- platformforge/agents/debate.py +161 -0
- platformforge/agents/executors.py +160 -0
- platformforge/agents/guardian.py +48 -0
- platformforge/agents/mirrors.py +240 -0
- platformforge/agents/orchestrator.py +295 -0
- platformforge/agents/planner.py +116 -0
- platformforge/agents/playbook.py +51 -0
- platformforge/agents/referee.py +132 -0
- platformforge/agents/reviewers.py +113 -0
- platformforge/agents/roster.py +893 -0
- platformforge/agents/runledger.py +85 -0
- platformforge/agents/runstore.py +74 -0
- platformforge/agents/specialists.py +73 -0
- platformforge/agents/taskspec.py +94 -0
- platformforge/agents/uniqueness.py +115 -0
- platformforge/agents/verifier.py +106 -0
- platformforge/aiplat/__init__.py +4 -0
- platformforge/aiplat/models.py +175 -0
- platformforge/analytics/__init__.py +6 -0
- platformforge/analytics/capacity.py +109 -0
- platformforge/analytics/debt.py +92 -0
- platformforge/analytics/dx.py +69 -0
- platformforge/analytics/finops_v4.py +171 -0
- platformforge/analytics/goldenpath.py +131 -0
- platformforge/analytics/history.py +233 -0
- platformforge/analytics/measurement.py +149 -0
- platformforge/analytics/models.py +127 -0
- platformforge/analytics/opsanalytics.py +119 -0
- platformforge/analytics/policyintel.py +139 -0
- platformforge/analytics/reliability.py +106 -0
- platformforge/analytics/soak.py +135 -0
- platformforge/analytics/store.py +254 -0
- platformforge/bench.py +174 -0
- platformforge/cases/__init__.py +13 -0
- platformforge/cases/casefile.py +106 -0
- platformforge/cases/context_audit.py +134 -0
- platformforge/cases/ledgers.py +174 -0
- platformforge/cases/replay.py +142 -0
- platformforge/cases/routing_audit.py +162 -0
- platformforge/caveman/__init__.py +11 -0
- platformforge/caveman/compress.py +156 -0
- platformforge/cicd/__init__.py +16 -0
- platformforge/cicd/backstage.py +51 -0
- platformforge/cicd/dockerfile.py +64 -0
- platformforge/cicd/github_actions.py +122 -0
- platformforge/cicd/gitlab_ci.py +56 -0
- platformforge/cicd/gitops.py +130 -0
- platformforge/cli/__init__.py +0 -0
- platformforge/cli/fleetcmd.py +457 -0
- platformforge/cli/main.py +3832 -0
- platformforge/cloud/__init__.py +8 -0
- platformforge/cloud/aws.py +254 -0
- platformforge/cloud/common.py +69 -0
- platformforge/cloud/multicloud.py +143 -0
- platformforge/collect/__init__.py +11 -0
- platformforge/collect/detect.py +254 -0
- platformforge/context/__init__.py +10 -0
- platformforge/context/capsule.py +60 -0
- platformforge/context/gateway.py +227 -0
- platformforge/context/refs.py +49 -0
- platformforge/context/sufficiency.py +50 -0
- platformforge/core/__init__.py +1 -0
- platformforge/core/hashing.py +39 -0
- platformforge/core/ownership.py +220 -0
- platformforge/core/receipts.py +74 -0
- platformforge/core/redaction.py +97 -0
- platformforge/core/store.py +119 -0
- platformforge/core/workspace.py +89 -0
- platformforge/data/contracts/agent-handoff.schema.json +26 -0
- platformforge/data/contracts/agent-run.schema.json +27 -0
- platformforge/data/contracts/agent-spec.schema.json +43 -0
- platformforge/data/contracts/capability.schema.json +23 -0
- platformforge/data/contracts/change-event.schema.json +22 -0
- platformforge/data/contracts/change-intent.schema.json +62 -0
- platformforge/data/contracts/change-plan.schema.json +43 -0
- platformforge/data/contracts/collector-receipt.schema.json +36 -0
- platformforge/data/contracts/context-pack.schema.json +29 -0
- platformforge/data/contracts/debate.schema.json +31 -0
- platformforge/data/contracts/distribution-manifest-v1.schema.json +81 -0
- platformforge/data/contracts/drift-event.schema.json +21 -0
- platformforge/data/contracts/fact.schema.json +35 -0
- platformforge/data/contracts/finding.schema.json +20 -0
- platformforge/data/contracts/graph-v2.schema.json +67 -0
- platformforge/data/contracts/graph.schema.json +40 -0
- platformforge/data/contracts/install-receipt-v1.schema.json +49 -0
- platformforge/data/contracts/observation.schema.json +93 -0
- platformforge/data/contracts/receipt.schema.json +21 -0
- platformforge/data/contracts/recommendation.schema.json +32 -0
- platformforge/data/contracts/refusal.schema.json +16 -0
- platformforge/data/contracts/slo-contract.schema.json +25 -0
- platformforge/data/contracts/task-spec.schema.json +37 -0
- platformforge/data/contracts/workspace-manifest-v1.schema.json +62 -0
- platformforge/data/evals/cases/agent-budget-exhaustion/case.yaml +6 -0
- platformforge/data/evals/cases/agent-conflicting-specialists/case.yaml +11 -0
- platformforge/data/evals/cases/agent-fleet-optimization/case.yaml +13 -0
- platformforge/data/evals/cases/agent-host-no-subagents/case.yaml +6 -0
- platformforge/data/evals/cases/agent-incident-multi/case.yaml +13 -0
- platformforge/data/evals/cases/agent-missing-evidence/case.yaml +6 -0
- platformforge/data/evals/cases/agent-multi-domain-audit/case.yaml +14 -0
- platformforge/data/evals/cases/agent-production-change/case.yaml +15 -0
- platformforge/data/evals/cases/agent-security-mandatory/case.yaml +12 -0
- platformforge/data/evals/cases/agent-simple-iac/case.yaml +14 -0
- platformforge/data/evals/cases/approval-integrity-seal/case.yaml +6 -0
- platformforge/data/evals/cases/capacity-hot/case.yaml +7 -0
- platformforge/data/evals/cases/capacity-hot/fixture/capacity.json +5 -0
- platformforge/data/evals/cases/catalog-noowner/case.yaml +7 -0
- platformforge/data/evals/cases/catalog-noowner/fixture/catalog-info.yaml +6 -0
- platformforge/data/evals/cases/contract-fact/case.yaml +5 -0
- platformforge/data/evals/cases/contract-fact/fixture/doc.json +2 -0
- platformforge/data/evals/cases/cosign-unverified/case.yaml +8 -0
- platformforge/data/evals/cases/cosign-unverified/fixture/sig.json +33 -0
- platformforge/data/evals/cases/expected-delta-refusal/case.yaml +6 -0
- platformforge/data/evals/cases/finops-noattr/case.yaml +9 -0
- platformforge/data/evals/cases/finops-noattr/fixture/costs.json +7 -0
- platformforge/data/evals/cases/fleet-inv-absent-allocation-unknown/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-centrality-not-criticality/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-correlation-not-causality/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-dx-no-person-metrics/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-federation-restricted-denied/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-federation-secret-denied/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-history-window-deterministic/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-low-util-not-deletable/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-member-key-deterministic/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-missing-denominator/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-partial-coverage-visible/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-plan-changeintent-only/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-report-all-cited/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-small-sample-confidence/case.yaml +7 -0
- platformforge/data/evals/cases/fleet-inv-uncertain-optimization-suppressed/case.yaml +7 -0
- platformforge/data/evals/cases/gha-dangerous/case.yaml +12 -0
- platformforge/data/evals/cases/gha-dangerous/fixture/.github/workflows/ci.yaml +11 -0
- platformforge/data/evals/cases/gitops-v2/case.yaml +11 -0
- platformforge/data/evals/cases/gitops-v2/fixture/argo.yaml +41 -0
- platformforge/data/evals/cases/graph-k8s-blast/case.yaml +7 -0
- platformforge/data/evals/cases/graph-k8s-blast/fixture/deploy.yaml +15 -0
- platformforge/data/evals/cases/iac-module-nopin/case.yaml +8 -0
- platformforge/data/evals/cases/iac-module-nopin/fixture/main.tf +3 -0
- platformforge/data/evals/cases/iac-plan-replace/case.yaml +8 -0
- platformforge/data/evals/cases/iac-plan-replace/fixture/plan.json +12 -0
- platformforge/data/evals/cases/iac-sg-open/case.yaml +8 -0
- platformforge/data/evals/cases/iac-sg-open/fixture/main.tf +9 -0
- platformforge/data/evals/cases/iam-oidc/case.yaml +8 -0
- platformforge/data/evals/cases/iam-oidc/fixture/policy.json +11 -0
- platformforge/data/evals/cases/iam-wildcard-positive/case.yaml +8 -0
- platformforge/data/evals/cases/iam-wildcard-positive/fixture/policy.json +3 -0
- platformforge/data/evals/cases/k8s-bad-actor/case.yaml +19 -0
- platformforge/data/evals/cases/k8s-bad-actor/fixture/app.yaml +97 -0
- platformforge/data/evals/cases/k8s-beta-api/case.yaml +8 -0
- platformforge/data/evals/cases/k8s-beta-api/fixture/cr.yaml +7 -0
- platformforge/data/evals/cases/k8s-dep-api-boundary/case.yaml +15 -0
- platformforge/data/evals/cases/k8s-dep-api-boundary/fixture/app.yaml +25 -0
- platformforge/data/evals/cases/k8s-dep-api-clean/case.yaml +12 -0
- platformforge/data/evals/cases/k8s-dep-api-clean/fixture/app.yaml +29 -0
- platformforge/data/evals/cases/k8s-dep-api-unknown/case.yaml +11 -0
- platformforge/data/evals/cases/k8s-dep-api-unknown/fixture/app.yaml +25 -0
- platformforge/data/evals/cases/k8s-dep-api-v120/case.yaml +12 -0
- platformforge/data/evals/cases/k8s-dep-api-v120/fixture/app.yaml +25 -0
- platformforge/data/evals/cases/k8s-dep-api-v129/case.yaml +9 -0
- platformforge/data/evals/cases/k8s-dep-api-v129/fixture/app.yaml +25 -0
- platformforge/data/evals/cases/k8s-hpa-noreq/case.yaml +8 -0
- platformforge/data/evals/cases/k8s-hpa-noreq/fixture/app.yaml +28 -0
- platformforge/data/evals/cases/k8s-limits-boundary/case.yaml +10 -0
- platformforge/data/evals/cases/k8s-limits-boundary/fixture/app.yaml +15 -0
- platformforge/data/evals/cases/k8s-limits-negative/case.yaml +8 -0
- platformforge/data/evals/cases/k8s-limits-negative/fixture/deploy.yaml +15 -0
- platformforge/data/evals/cases/k8s-limits-positive/case.yaml +8 -0
- platformforge/data/evals/cases/k8s-limits-positive/fixture/deploy.yaml +14 -0
- platformforge/data/evals/cases/k8s-nopdb/case.yaml +7 -0
- platformforge/data/evals/cases/k8s-nopdb/fixture/app.yaml +34 -0
- platformforge/data/evals/cases/knowledge-registry/case.yaml +10 -0
- platformforge/data/evals/cases/kyverno-dep/case.yaml +10 -0
- platformforge/data/evals/cases/kyverno-dep/fixture/pol.yaml +18 -0
- platformforge/data/evals/cases/kyverno-legacy/case.yaml +8 -0
- platformforge/data/evals/cases/kyverno-legacy/fixture/pol.yaml +7 -0
- platformforge/data/evals/cases/live-aws-collect/case.yaml +11 -0
- platformforge/data/evals/cases/live-aws-collect/fixture/aws/ec2_describe-vpcs.json +15 -0
- platformforge/data/evals/cases/live-aws-collect/fixture/aws/iam_list-users.denied.txt +1 -0
- platformforge/data/evals/cases/live-aws-collect/fixture/aws/sts_get-caller-identity.json +5 -0
- platformforge/data/evals/cases/live-drift/case.yaml +8 -0
- platformforge/data/evals/cases/live-drift/fixture/after.json +22 -0
- platformforge/data/evals/cases/live-drift/fixture/before.json +22 -0
- platformforge/data/evals/cases/live-incident/case.yaml +7 -0
- platformforge/data/evals/cases/live-incident/fixture/changes.json +8 -0
- platformforge/data/evals/cases/live-incident/fixture/incident.json +7 -0
- platformforge/data/evals/cases/live-k8s-collect/case.yaml +10 -0
- platformforge/data/evals/cases/live-k8s-collect/fixture/kubectl/get_configmaps.denied.txt +1 -0
- platformforge/data/evals/cases/live-k8s-collect/fixture/kubectl/get_deployments.apps.json +25 -0
- platformforge/data/evals/cases/live-k8s-collect/fixture/kubectl/get_pods.json +17 -0
- platformforge/data/evals/cases/live-k8s-collect/fixture/kubectl/get_secrets.json +13 -0
- platformforge/data/evals/cases/live-multicluster/case.yaml +7 -0
- platformforge/data/evals/cases/live-multicluster/fixture/clusters.json +6 -0
- platformforge/data/evals/cases/live-plan/case.yaml +7 -0
- platformforge/data/evals/cases/live-plan/fixture/drift.json +8 -0
- platformforge/data/evals/cases/live-reconcile/case.yaml +7 -0
- platformforge/data/evals/cases/live-reconcile/fixture/desired.json +7 -0
- platformforge/data/evals/cases/live-reconcile/fixture/observed.json +18 -0
- platformforge/data/evals/cases/live-secrets-boundary/case.yaml +8 -0
- platformforge/data/evals/cases/live-secrets-boundary/fixture/envelope.json +16 -0
- platformforge/data/evals/cases/live-temporal-graph/case.yaml +10 -0
- platformforge/data/evals/cases/live-temporal-graph/fixture/graph.json +22 -0
- platformforge/data/evals/cases/ops-approval/case.yaml +6 -0
- platformforge/data/evals/cases/ops-convergence/case.yaml +6 -0
- platformforge/data/evals/cases/ops-execution-safety/case.yaml +6 -0
- platformforge/data/evals/cases/ops-intent/case.yaml +6 -0
- platformforge/data/evals/cases/ops-planning/case.yaml +6 -0
- platformforge/data/evals/cases/ops-policy/case.yaml +6 -0
- platformforge/data/evals/cases/ops-rollback/case.yaml +6 -0
- platformforge/data/evals/cases/ops-verification/case.yaml +6 -0
- platformforge/data/evals/cases/rollback-argocd-revision/case.yaml +6 -0
- platformforge/data/evals/cases/rollback-blind-inverse/case.yaml +6 -0
- platformforge/data/evals/cases/rollback-git-commit/case.yaml +6 -0
- platformforge/data/evals/cases/rollback-impossible/case.yaml +6 -0
- platformforge/data/evals/cases/rollback-k8s-annotation-restore/case.yaml +6 -0
- platformforge/data/evals/cases/rollback-k8s-scale/case.yaml +6 -0
- platformforge/data/evals/cases/rollback-material-tamper/case.yaml +6 -0
- platformforge/data/evals/cases/rollback-terraform-replan/case.yaml +6 -0
- platformforge/data/evals/cases/rollback-unknown/case.yaml +6 -0
- platformforge/data/evals/cases/routing-specialist/case.yaml +9 -0
- platformforge/data/evals/cases/rtk-roundtrip/case.yaml +5 -0
- platformforge/data/evals/cases/rtk-roundtrip/fixture/verbose.txt +300 -0
- platformforge/data/evals/cases/sbom-vuln/case.yaml +9 -0
- platformforge/data/evals/cases/sbom-vuln/fixture/sbom.json +9 -0
- platformforge/data/evals/cases/secret-prose-mixed/fixture/app.env +1 -0
- platformforge/data/evals/cases/secret-prose-mixed/fixture/policy-notes.md +7 -0
- platformforge/data/evals/cases/secrets-noleak/case.yaml +5 -0
- platformforge/data/evals/cases/secrets-noleak/fixture/app.env +2 -0
- platformforge/data/evals/cases/slo-fastburn/case.yaml +8 -0
- platformforge/data/evals/cases/slo-fastburn/fixture/events.yaml +2 -0
- platformforge/data/evals/cases/slo-fastburn/fixture/slo.yaml +4 -0
- platformforge/data/evals/cases/slo-noinput/case.yaml +8 -0
- platformforge/data/evals/cases/slo-noinput/fixture/events.yaml +1 -0
- platformforge/data/evals/cases/slo-noinput/fixture/slo.yaml +4 -0
- platformforge/data/evals/cases/sot-conflict/case.yaml +6 -0
- platformforge/data/evals/cases/token-budget/case.yaml +6 -0
- platformforge/data/evals/cases/token-budget/fixture/big.py +50 -0
- platformforge/data/evals/cases/xr-delete/case.yaml +8 -0
- platformforge/data/evals/cases/xr-delete/fixture/xr.yaml +10 -0
- platformforge/data/evals/cases/xr-graph-chain/case.yaml +8 -0
- platformforge/data/evals/cases/xr-graph-chain/fixture/xrd.yaml +90 -0
- platformforge/data/evals/cases/xr-negative-crd/case.yaml +8 -0
- platformforge/data/evals/cases/xr-negative-crd/fixture/widget.yaml +19 -0
- platformforge/data/evals/cases/xr-upbound-mr/case.yaml +8 -0
- platformforge/data/evals/cases/xr-upbound-mr/fixture/bucket.yaml +12 -0
- platformforge/data/evals/qpt-bench/change-review/case.yaml +5 -0
- platformforge/data/evals/qpt-bench/change-review/fixture/plan.json +9 -0
- platformforge/data/evals/qpt-bench/gha-security/case.yaml +5 -0
- platformforge/data/evals/qpt-bench/gha-security/fixture/ci.yml +10 -0
- platformforge/data/evals/qpt-bench/iam-investigate/case.yaml +5 -0
- platformforge/data/evals/qpt-bench/iam-investigate/fixture/policy.json +6 -0
- platformforge/data/evals/qpt-bench/incident-analysis/case.yaml +5 -0
- platformforge/data/evals/qpt-bench/incident-analysis/fixture/query.json +5 -0
- platformforge/data/evals/qpt-bench/incident-analysis/fixture/rules.yaml +6 -0
- platformforge/data/evals/qpt-bench/k8s-review/case.yaml +6 -0
- platformforge/data/evals/qpt-bench/k8s-review/fixture/deploy.yaml +15 -0
- platformforge/data/evals/qpt-bench/tf-security/case.yaml +5 -0
- platformforge/data/evals/qpt-bench/tf-security/fixture/main.tf +17 -0
- platformforge/data/knowledge/aws/eks.yaml +20 -0
- platformforge/data/knowledge/aws/iam.yaml +28 -0
- platformforge/data/knowledge/aws/network-exposure.yaml +19 -0
- platformforge/data/knowledge/aws/organizations.yaml +19 -0
- platformforge/data/knowledge/crossplane/composition-providers.yaml +20 -0
- platformforge/data/knowledge/crossplane/managed-resources.yaml +26 -0
- platformforge/data/knowledge/crossplane/v1-v2.yaml +25 -0
- platformforge/data/knowledge/kubernetes/api-deprecations.yaml +33 -0
- platformforge/data/knowledge/kubernetes/autoscaling-rbac.yaml +27 -0
- platformforge/data/knowledge/kubernetes/gateway-api.yaml +20 -0
- platformforge/data/knowledge/kubernetes/pod-security.yaml +26 -0
- platformforge/data/knowledge/sources.yaml +516 -0
- platformforge/data/knowledge/terraform/lifecycle.yaml +18 -0
- platformforge/data/knowledge/terraform/plan-semantics.yaml +26 -0
- platformforge/data/lab/chaos-pod-kill/chaos.yaml +3 -0
- platformforge/data/lab/chaos-pod-kill/facts.json +13 -0
- platformforge/data/lab/fleets/acme/capacity.yaml +35 -0
- platformforge/data/lab/fleets/acme/costs.yaml +25 -0
- platformforge/data/lab/fleets/acme/events.yaml +41 -0
- platformforge/data/lab/fleets/acme/fleet.yaml +51 -0
- platformforge/data/lab/fleets/acme/graph.yaml +45 -0
- platformforge/data/lab/fleets/acme/policies.yaml +28 -0
- platformforge/data/lab/fleets/acme/requests.yaml +24 -0
- platformforge/data/lab/scenarios/argo-bad-rollout/expected.yaml +6 -0
- platformforge/data/lab/scenarios/argo-bad-rollout/fixture/app.yaml +9 -0
- platformforge/data/lab/scenarios/aws-dump/expected.yaml +19 -0
- platformforge/data/lab/scenarios/aws-dump/fixture/compute.json +4 -0
- platformforge/data/lab/scenarios/aws-dump/fixture/iam.json +7 -0
- platformforge/data/lab/scenarios/aws-dump/fixture/network.json +6 -0
- platformforge/data/lab/scenarios/aws-dump/fixture/org.json +4 -0
- platformforge/data/lab/scenarios/aws-dump/fixture/storage.json +4 -0
- platformforge/data/lab/scenarios/container-unsigned/expected.yaml +5 -0
- platformforge/data/lab/scenarios/container-unsigned/fixture/supply.json +11 -0
- platformforge/data/lab/scenarios/cost-idle-workload/expected.yaml +5 -0
- platformforge/data/lab/scenarios/cost-idle-workload/fixture/costs.json +12 -0
- platformforge/data/lab/scenarios/crossplane-platform/expected.yaml +16 -0
- platformforge/data/lab/scenarios/crossplane-platform/fixture/negative.yaml +18 -0
- platformforge/data/lab/scenarios/crossplane-platform/fixture/xrd.yaml +90 -0
- platformforge/data/lab/scenarios/demo-platform/expected.yaml +16 -0
- platformforge/data/lab/scenarios/demo-platform/fixture/.github/workflows/ci.yml +10 -0
- platformforge/data/lab/scenarios/demo-platform/fixture/deploy.yaml +16 -0
- platformforge/data/lab/scenarios/demo-platform/fixture/infra.tf +5 -0
- platformforge/data/lab/scenarios/fleet-ai/expected.yaml +12 -0
- platformforge/data/lab/scenarios/fleet-capacity/expected.yaml +12 -0
- platformforge/data/lab/scenarios/fleet-cost/expected.yaml +18 -0
- platformforge/data/lab/scenarios/fleet-federation/expected.yaml +11 -0
- platformforge/data/lab/scenarios/fleet-golden-path/expected.yaml +18 -0
- platformforge/data/lab/scenarios/fleet-op-hotspot/expected.yaml +11 -0
- platformforge/data/lab/scenarios/fleet-ownership/expected.yaml +17 -0
- platformforge/data/lab/scenarios/fleet-partial/expected.yaml +10 -0
- platformforge/data/lab/scenarios/fleet-policy-friction/expected.yaml +10 -0
- platformforge/data/lab/scenarios/fleet-recurring-incident/expected.yaml +12 -0
- platformforge/data/lab/scenarios/fleet-report/expected.yaml +13 -0
- platformforge/data/lab/scenarios/fleet-risk/expected.yaml +18 -0
- platformforge/data/lab/scenarios/gitops-drift/expected.yaml +6 -0
- platformforge/data/lab/scenarios/gitops-drift/fixture/app.yaml +12 -0
- platformforge/data/lab/scenarios/k8s-bad-readiness/expected.yaml +6 -0
- platformforge/data/lab/scenarios/k8s-bad-readiness/fixture/deploy.yaml +23 -0
- platformforge/data/lab/scenarios/k8s-bad-readiness/fixture/netpol.yaml +9 -0
- platformforge/data/lab/scenarios/k8s-missing-limits/expected.yaml +6 -0
- platformforge/data/lab/scenarios/k8s-missing-limits/fixture/deploy.yaml +26 -0
- platformforge/data/lab/scenarios/k8s-missing-limits/fixture/netpol.yaml +9 -0
- platformforge/data/lab/scenarios/k8s-single-replica/expected.yaml +5 -0
- platformforge/data/lab/scenarios/k8s-single-replica/fixture/deploy.yaml +26 -0
- platformforge/data/lab/scenarios/k8s-single-replica/fixture/netpol.yaml +4 -0
- platformforge/data/lab/scenarios/live-aws-collect/expected.yaml +4 -0
- platformforge/data/lab/scenarios/live-aws-collect/fixture/aws/ec2_describe-vpcs.json +15 -0
- platformforge/data/lab/scenarios/live-aws-collect/fixture/aws/iam_list-users.denied.txt +1 -0
- platformforge/data/lab/scenarios/live-aws-collect/fixture/aws/sts_get-caller-identity.json +5 -0
- platformforge/data/lab/scenarios/live-k8s-collect/expected.yaml +4 -0
- platformforge/data/lab/scenarios/live-k8s-collect/fixture/kubectl/get_configmaps.denied.txt +1 -0
- platformforge/data/lab/scenarios/live-k8s-collect/fixture/kubectl/get_deployments.apps.json +25 -0
- platformforge/data/lab/scenarios/live-k8s-collect/fixture/kubectl/get_pods.json +17 -0
- platformforge/data/lab/scenarios/live-k8s-collect/fixture/kubectl/get_secrets.json +13 -0
- platformforge/data/lab/scenarios/live-kind/expected.yaml +14 -0
- platformforge/data/lab/scenarios/live-kind/fixture/kubectl/get_configmaps.denied.txt +1 -0
- platformforge/data/lab/scenarios/live-kind/fixture/kubectl/get_deployments.apps.json +25 -0
- platformforge/data/lab/scenarios/live-kind/fixture/kubectl/get_pods.json +17 -0
- platformforge/data/lab/scenarios/live-kind/fixture/kubectl/get_secrets.json +13 -0
- platformforge/data/lab/scenarios/network-policy-missing/expected.yaml +6 -0
- platformforge/data/lab/scenarios/network-policy-missing/fixture/deploy.yaml +26 -0
- platformforge/data/lab/scenarios/ops-bad-rollout/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-bad-rollout/fixture/ops.yaml +33 -0
- platformforge/data/lab/scenarios/ops-break-glass/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-break-glass/fixture/ops.yaml +21 -0
- platformforge/data/lab/scenarios/ops-broken-selector/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-broken-selector/fixture/ops.yaml +21 -0
- platformforge/data/lab/scenarios/ops-changed-plan-hash/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-changed-plan-hash/fixture/ops.yaml +20 -0
- platformforge/data/lab/scenarios/ops-conflicting-operation/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-conflicting-operation/fixture/ops.yaml +21 -0
- platformforge/data/lab/scenarios/ops-expired-approval/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-expired-approval/fixture/ops.yaml +20 -0
- platformforge/data/lab/scenarios/ops-partial-failure/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-partial-failure/fixture/ops.yaml +24 -0
- platformforge/data/lab/scenarios/ops-policy-denial/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-policy-denial/fixture/ops.yaml +17 -0
- platformforge/data/lab/scenarios/ops-replica-drift/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-replica-drift/fixture/ops.yaml +28 -0
- platformforge/data/lab/scenarios/ops-rollback-annotate/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-rollback-annotate/fixture/ops.yaml +41 -0
- platformforge/data/lab/scenarios/ops-rollback-gitops/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-rollback-gitops/fixture/ops.yaml +38 -0
- platformforge/data/lab/scenarios/ops-rollback-impossible/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-rollback-impossible/fixture/ops.yaml +34 -0
- platformforge/data/lab/scenarios/ops-rollback-scale/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-rollback-scale/fixture/ops.yaml +40 -0
- platformforge/data/lab/scenarios/ops-rollback-terraform/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-rollback-terraform/fixture/ops.yaml +38 -0
- platformforge/data/lab/scenarios/ops-rollback-terraform/fixture/tf/tfplan.bin +1 -0
- platformforge/data/lab/scenarios/ops-stale-observation/expected.yaml +3 -0
- platformforge/data/lab/scenarios/ops-stale-observation/fixture/ops.yaml +20 -0
- platformforge/data/lab/scenarios/secret-exposure/expected.yaml +5 -0
- platformforge/data/lab/scenarios/secret-exposure/fixture/app.env +2 -0
- platformforge/data/lab/scenarios/slo-burn/expected.yaml +5 -0
- platformforge/data/lab/scenarios/slo-burn/fixture/events.yaml +2 -0
- platformforge/data/lab/scenarios/slo-burn/fixture/slo.yaml +4 -0
- platformforge/data/lab/scenarios/terraform-iam-wildcard/expected.yaml +5 -0
- platformforge/data/lab/scenarios/terraform-iam-wildcard/fixture/policy.json +14 -0
- platformforge/data/lab/scenarios/terraform-public-bucket/expected.yaml +6 -0
- platformforge/data/lab/scenarios/terraform-public-bucket/fixture/main.tf +5 -0
- platformforge/data/portable_skills/platformforge-agents/SKILL.md +47 -0
- platformforge/data/portable_skills/platformforge-change/SKILL.md +41 -0
- platformforge/data/portable_skills/platformforge-core/SKILL.md +62 -0
- platformforge/data/portable_skills/platformforge-economy/SKILL.md +42 -0
- platformforge/data/portable_skills/platformforge-finops/SKILL.md +34 -0
- platformforge/data/portable_skills/platformforge-fleet/SKILL.md +39 -0
- platformforge/data/portable_skills/platformforge-governance/SKILL.md +76 -0
- platformforge/data/portable_skills/platformforge-graph/SKILL.md +46 -0
- platformforge/data/portable_skills/platformforge-lab/SKILL.md +39 -0
- platformforge/data/portable_skills/platformforge-sdd/SKILL.md +39 -0
- platformforge/data/portable_skills/platformforge-security/SKILL.md +38 -0
- platformforge/data/portable_skills/platformforge-sre/SKILL.md +41 -0
- platformforge/data/rules/catalog/finops.yaml +26 -0
- platformforge/data/rules/catalog/gitops.yaml +161 -0
- platformforge/data/rules/catalog/iac.yaml +84 -0
- platformforge/data/rules/catalog/k8s.yaml +322 -0
- platformforge/data/rules/catalog/orchestration.yaml +99 -0
- platformforge/data/rules/catalog/product.yaml +42 -0
- platformforge/data/rules/catalog/routing.yaml +122 -0
- platformforge/data/rules/catalog/security.yaml +159 -0
- platformforge/data/rules/catalog/sre.yaml +67 -0
- platformforge/diagnose/__init__.py +75 -0
- platformforge/distribution/__init__.py +18 -0
- platformforge/distribution/bundle.py +127 -0
- platformforge/distribution/hostflow.py +247 -0
- platformforge/distribution/models.py +80 -0
- platformforge/distribution/service.py +225 -0
- platformforge/economy/__init__.py +27 -0
- platformforge/economy/bench.py +66 -0
- platformforge/economy/budget.py +198 -0
- platformforge/economy/cache.py +287 -0
- platformforge/economy/checkpoint.py +112 -0
- platformforge/economy/collection.py +142 -0
- platformforge/economy/doctor.py +207 -0
- platformforge/economy/engine.py +158 -0
- platformforge/economy/envelope.py +61 -0
- platformforge/economy/fleetpack.py +86 -0
- platformforge/economy/ledger.py +232 -0
- platformforge/economy/plan.py +131 -0
- platformforge/economy/pricing.py +101 -0
- platformforge/economy/qpt.py +286 -0
- platformforge/economy/reconcile.py +86 -0
- platformforge/economy/verifyplan.py +107 -0
- platformforge/economy/waste.py +123 -0
- platformforge/evals/__init__.py +16 -0
- platformforge/evals/coverage.py +140 -0
- platformforge/evals/fleet_invariants.py +260 -0
- platformforge/evals/ops_invariants.py +158 -0
- platformforge/evals/runner.py +541 -0
- platformforge/federation/__init__.py +4 -0
- platformforge/federation/node.py +135 -0
- platformforge/finops/__init__.py +14 -0
- platformforge/finops/alloc.py +31 -0
- platformforge/finops/costs.py +79 -0
- platformforge/finops/focus.py +100 -0
- platformforge/finops/graph_cost.py +51 -0
- platformforge/finops/ingest.py +144 -0
- platformforge/finops/insights.py +193 -0
- platformforge/finops/unit.py +36 -0
- platformforge/fleet/__init__.py +5 -0
- platformforge/fleet/loader.py +73 -0
- platformforge/fleet/models.py +155 -0
- platformforge/fleet/orggraph.py +172 -0
- platformforge/fleet/query.py +154 -0
- platformforge/forge/__init__.py +9 -0
- platformforge/forge/collect.py +88 -0
- platformforge/forge/delegate.py +77 -0
- platformforge/forge/manifest.py +106 -0
- platformforge/freeze/__init__.py +22 -0
- platformforge/freeze/exceptions.py +56 -0
- platformforge/freeze/manifest.py +167 -0
- platformforge/freeze/snapshots.py +108 -0
- platformforge/graph/__init__.py +39 -0
- platformforge/graph/backend.py +174 -0
- platformforge/graph/bench.py +245 -0
- platformforge/graph/build.py +130 -0
- platformforge/graph/delivery.py +183 -0
- platformforge/graph/diff.py +292 -0
- platformforge/graph/events.py +116 -0
- platformforge/graph/migrate.py +44 -0
- platformforge/graph/model.py +264 -0
- platformforge/graph/persist.py +97 -0
- platformforge/graph/query.py +290 -0
- platformforge/graph/temporal.py +78 -0
- platformforge/graph/vocab.py +63 -0
- platformforge/graphview.py +94 -0
- platformforge/iac/__init__.py +7 -0
- platformforge/iac/drift.py +53 -0
- platformforge/iac/plan.py +84 -0
- platformforge/iac/terraform.py +123 -0
- platformforge/install/__init__.py +1 -0
- platformforge/install/service.py +421 -0
- platformforge/k8s/__init__.py +8 -0
- platformforge/k8s/helm.py +152 -0
- platformforge/k8s/hubble.py +87 -0
- platformforge/k8s/manifests.py +513 -0
- platformforge/knowledge/__init__.py +1 -0
- platformforge/knowledge/packs.py +157 -0
- platformforge/knowledge/registry.py +249 -0
- platformforge/knowledge/select.py +127 -0
- platformforge/lab/__init__.py +5 -0
- platformforge/lab/chaos.py +71 -0
- platformforge/lab/fleetlab.py +351 -0
- platformforge/lab/opslab.py +271 -0
- platformforge/lab/runner.py +219 -0
- platformforge/live/__init__.py +36 -0
- platformforge/live/budget.py +92 -0
- platformforge/live/capability.py +80 -0
- platformforge/live/collectors/__init__.py +6 -0
- platformforge/live/collectors/aws.py +370 -0
- platformforge/live/collectors/aws_transport.py +98 -0
- platformforge/live/collectors/k8s.py +389 -0
- platformforge/live/collectors/k8s_transport.py +85 -0
- platformforge/live/cursors.py +48 -0
- platformforge/live/drift.py +130 -0
- platformforge/live/envelope.py +85 -0
- platformforge/live/federation.py +113 -0
- platformforge/live/fixtures.py +168 -0
- platformforge/live/identity.py +258 -0
- platformforge/live/incident.py +200 -0
- platformforge/live/models.py +435 -0
- platformforge/live/reconcile.py +382 -0
- platformforge/live/remediate.py +169 -0
- platformforge/live/store.py +256 -0
- platformforge/live/topology.py +249 -0
- platformforge/mcp/__init__.py +7 -0
- platformforge/mcp/parity.py +69 -0
- platformforge/mcp/registry.py +427 -0
- platformforge/mcp/server.py +84 -0
- platformforge/mcp/tools.py +732 -0
- platformforge/models/__init__.py +21 -0
- platformforge/models/base.py +214 -0
- platformforge/observe/__init__.py +26 -0
- platformforge/observe/capacity.py +39 -0
- platformforge/observe/dr.py +67 -0
- platformforge/observe/grafana.py +76 -0
- platformforge/observe/incident.py +58 -0
- platformforge/observe/otel.py +135 -0
- platformforge/observe/postmortem.py +72 -0
- platformforge/observe/prometheus.py +88 -0
- platformforge/observe/slo.py +125 -0
- platformforge/ops/__init__.py +8 -0
- platformforge/ops/actions.py +215 -0
- platformforge/ops/analytics.py +83 -0
- platformforge/ops/approval.py +275 -0
- platformforge/ops/autorem.py +101 -0
- platformforge/ops/config.py +175 -0
- platformforge/ops/engine.py +758 -0
- platformforge/ops/envelope.py +135 -0
- platformforge/ops/executors/__init__.py +1 -0
- platformforge/ops/executors/base.py +211 -0
- platformforge/ops/executors/git.py +77 -0
- platformforge/ops/executors/gitops.py +134 -0
- platformforge/ops/executors/terraform.py +84 -0
- platformforge/ops/gates.py +135 -0
- platformforge/ops/goldenpath.py +180 -0
- platformforge/ops/material.py +181 -0
- platformforge/ops/models.py +421 -0
- platformforge/ops/operation.py +335 -0
- platformforge/ops/opgraph.py +233 -0
- platformforge/ops/policy.py +275 -0
- platformforge/ops/preconditions.py +109 -0
- platformforge/ops/registry.py +101 -0
- platformforge/ops/risk.py +216 -0
- platformforge/ops/rollback.py +287 -0
- platformforge/ops/rollback_builders.py +163 -0
- platformforge/ops/runbook.py +269 -0
- platformforge/ops/simulate.py +125 -0
- platformforge/ops/source_of_truth.py +198 -0
- platformforge/ops/store.py +157 -0
- platformforge/ops/verify.py +190 -0
- platformforge/optimize/__init__.py +4 -0
- platformforge/optimize/engine.py +109 -0
- platformforge/optimize/models.py +68 -0
- platformforge/optimize/scan.py +196 -0
- platformforge/plan/__init__.py +107 -0
- platformforge/portable_cli.py +199 -0
- platformforge/portal_adapter.py +740 -0
- platformforge/portal_assets/chunk-7_l-b4Tr.js +1 -0
- platformforge/portal_assets/chunk-B0Iad6pD.js +1 -0
- platformforge/portal_assets/chunk-B605XnCF.js +1 -0
- platformforge/portal_assets/chunk-B7N3TXcn.js +1 -0
- platformforge/portal_assets/chunk-BAj6yGem.js +1 -0
- platformforge/portal_assets/chunk-BGUitn2r.js +1 -0
- platformforge/portal_assets/chunk-BVKnCv85.js +1 -0
- platformforge/portal_assets/chunk-BYyM9V_w.js +1 -0
- platformforge/portal_assets/chunk-BaQMhq-G.js +1 -0
- platformforge/portal_assets/chunk-BavOrxVm.js +1 -0
- platformforge/portal_assets/chunk-Bb0C24YV.js +1 -0
- platformforge/portal_assets/chunk-BfCFGPzs.js +1 -0
- platformforge/portal_assets/chunk-C2t4OUVu.js +1 -0
- platformforge/portal_assets/chunk-C3pI4QjU.js +1 -0
- platformforge/portal_assets/chunk-C4gpbtbP.js +1 -0
- platformforge/portal_assets/chunk-CGWeHhKY.js +1 -0
- platformforge/portal_assets/chunk-CJCT86Dr.js +1 -0
- platformforge/portal_assets/chunk-CXcsLDPJ.js +1 -0
- platformforge/portal_assets/chunk-CcjxoLxw.js +1 -0
- platformforge/portal_assets/chunk-D-gBPXHa.js +1 -0
- platformforge/portal_assets/chunk-D3eZogIe.js +1 -0
- platformforge/portal_assets/chunk-DQU0VyoQ.js +1 -0
- platformforge/portal_assets/chunk-DqWNkF1O.js +1 -0
- platformforge/portal_assets/chunk-DuPPkSIE.js +3 -0
- platformforge/portal_assets/chunk-DyIHOW_a.js +1 -0
- platformforge/portal_assets/chunk-Fx4zSGL5.js +1 -0
- platformforge/portal_assets/chunk-UBKt05Rg.js +1 -0
- platformforge/portal_assets/chunk-htnJDQEY.js +1 -0
- platformforge/portal_assets/chunk-kXRFMGqe.js +1 -0
- platformforge/portal_assets/chunk-qe3u763a.js +1 -0
- platformforge/portal_assets/favicon.ico +0 -0
- platformforge/portal_assets/index.html +13 -0
- platformforge/portal_assets/main-QDFVZK3T.js +5 -0
- platformforge/portal_assets/styles-MQEBDFDX.css +1 -0
- platformforge/product/__init__.py +10 -0
- platformforge/product/backstage.py +49 -0
- platformforge/product/catalog.py +74 -0
- platformforge/product/crossplane.py +341 -0
- platformforge/product/golden_paths/__init__.py +5 -0
- platformforge/product/golden_paths/engine.py +97 -0
- platformforge/product/golden_paths/library.yaml +198 -0
- platformforge/product/golden_paths/model.py +84 -0
- platformforge/product/maturity.py +107 -0
- platformforge/product/scorecards.py +84 -0
- platformforge/resources.py +36 -0
- platformforge/risk/__init__.py +5 -0
- platformforge/risk/engine.py +95 -0
- platformforge/risk/signals.py +49 -0
- platformforge/routing/__init__.py +13 -0
- platformforge/routing/decision.py +191 -0
- platformforge/routing/router.py +328 -0
- platformforge/rtk/__init__.py +9 -0
- platformforge/rtk/compact.py +127 -0
- platformforge/rtk/parsers.py +199 -0
- platformforge/rules/__init__.py +5 -0
- platformforge/rules/engine.py +345 -0
- platformforge/sandbox/__init__.py +7 -0
- platformforge/sandbox/env.py +151 -0
- platformforge/sandbox/review.py +92 -0
- platformforge/sdd/__init__.py +8 -0
- platformforge/sdd/lifecycle.py +239 -0
- platformforge/security/__init__.py +19 -0
- platformforge/security/cosign.py +67 -0
- platformforge/security/iam.py +112 -0
- platformforge/security/identity.py +84 -0
- platformforge/security/kyverno.py +106 -0
- platformforge/security/sbom.py +59 -0
- platformforge/security/scan.py +63 -0
- platformforge/security/slsa.py +86 -0
- platformforge/security/supply.py +62 -0
- platformforge/tokensave/__init__.py +20 -0
- platformforge/tokensave/budget.py +62 -0
- platformforge/tokensave/estimate.py +21 -0
- platformforge/tokensave/index.py +172 -0
- platformforge/tokensave/ledger.py +121 -0
- platformforge/tokensave/packs.py +285 -0
- platformforge/ui/__init__.py +28 -0
- platformforge/ui/app.py +465 -0
- platformforge/ui/home.py +113 -0
- platformforge/ui/i18n.py +143 -0
- platformforge/ui/kit.py +689 -0
- platformforge/ui/screen.py +628 -0
- platformforge/ui/tui.py +94 -0
- platformforge/ui/wizard.py +309 -0
- platformforge/workspace/__init__.py +13 -0
- platformforge/workspace/models.py +35 -0
- platformforge/workspace/service.py +69 -0
- platformforge-0.1.0.dist-info/METADATA +212 -0
- platformforge-0.1.0.dist-info/RECORD +659 -0
- platformforge-0.1.0.dist-info/WHEEL +4 -0
- platformforge-0.1.0.dist-info/entry_points.txt +3 -0
- platformforge-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,893 @@
|
|
|
1
|
+
"""Canonical agent roster — one definition, generated host mirrors.
|
|
2
|
+
|
|
3
|
+
AgentSpec v2 (cycle5.1 §6–§11): every agent declares what it does AND
|
|
4
|
+
what it does not do (negative capability), typed access tier, model
|
|
5
|
+
tier (never a provider name), budgets, delegation boundary, reviewers
|
|
6
|
+
and verifier. Coordinators/orchestrators dispatch; specialists and
|
|
7
|
+
executors never spawn uncontrolled trees.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from platformforge.agents.contracts import ACCESS_TIERS, MODEL_TIERS, ROLES, SCHEMA_AGENT_SPEC, WRITE_SCOPES
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass(frozen=True)
|
|
19
|
+
class AgentSpec:
|
|
20
|
+
"""Canonical agent contract — `platformforge/agent-spec/v1`.
|
|
21
|
+
|
|
22
|
+
name unique slug (platform-* or pf-*)
|
|
23
|
+
role orchestrator|planner|coordinator|specialist|
|
|
24
|
+
executor|reviewer|critic|referee|verifier|guardian
|
|
25
|
+
domains capability domains it reasons about
|
|
26
|
+
mission one-line responsibility
|
|
27
|
+
when_to_enter activation condition (used by routing + mirrors)
|
|
28
|
+
when_not_to_enter explicit non-trigger (negative capability #1)
|
|
29
|
+
inputs / outputs accepted artifacts / emitted contract
|
|
30
|
+
required_evidence evidence classes it must cite or stay unresolved
|
|
31
|
+
allowed_verbs platformforge verbs it may invoke
|
|
32
|
+
allowed_tools host tool classes (mapped per-host, §106)
|
|
33
|
+
allowed_capabilities capability ids it may request (§102–103)
|
|
34
|
+
access ACCESS_TIERS value
|
|
35
|
+
write_scope WRITE_SCOPES value — what it may persist
|
|
36
|
+
model_tier MODEL_TIERS value — tier, not provider
|
|
37
|
+
max_context_budget context bytes ceiling per invocation
|
|
38
|
+
max_tool_calls tool call ceiling per invocation
|
|
39
|
+
max_parallelism max concurrent sub-steps it may request
|
|
40
|
+
delegates_to agents it may hand off to
|
|
41
|
+
cannot_delegate_to delegation boundary (explicit denial)
|
|
42
|
+
reviewers mandatory reviewers of its output
|
|
43
|
+
verifier agent that closes the loop (never itself)
|
|
44
|
+
escalation where it escalates when stuck
|
|
45
|
+
done_when completion contract
|
|
46
|
+
never hard prohibitions (negative capability #2)
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
name: str
|
|
50
|
+
role: str
|
|
51
|
+
domains: tuple[str, ...]
|
|
52
|
+
mission: str = ""
|
|
53
|
+
when_to_enter: str = ""
|
|
54
|
+
when_not_to_enter: str = ""
|
|
55
|
+
inputs: tuple[str, ...] = ()
|
|
56
|
+
outputs: tuple[str, ...] = ("findings", "unresolved", "evidence_ids")
|
|
57
|
+
required_evidence: tuple[str, ...] = ()
|
|
58
|
+
allowed_verbs: tuple[str, ...] = ()
|
|
59
|
+
allowed_tools: tuple[str, ...] = ()
|
|
60
|
+
allowed_capabilities: tuple[str, ...] = ()
|
|
61
|
+
access: str = "read-only"
|
|
62
|
+
write_scope: str = "none"
|
|
63
|
+
model_tier: str = "standard"
|
|
64
|
+
max_context_budget: int = 120_000
|
|
65
|
+
max_tool_calls: int = 24
|
|
66
|
+
max_parallelism: int = 1
|
|
67
|
+
delegates_to: tuple[str, ...] = ()
|
|
68
|
+
cannot_delegate_to: tuple[str, ...] = ()
|
|
69
|
+
reviewers: tuple[str, ...] = ()
|
|
70
|
+
verifier: str = ""
|
|
71
|
+
escalation: str = ""
|
|
72
|
+
done_when: str = ""
|
|
73
|
+
never: str = ""
|
|
74
|
+
|
|
75
|
+
# --- legacy accessors (pre-v2 field names) ------------------------
|
|
76
|
+
@property
|
|
77
|
+
def when(self) -> str:
|
|
78
|
+
return self.when_to_enter
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def verbs(self) -> tuple[str, ...]:
|
|
82
|
+
return self.allowed_verbs
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def executors(self) -> tuple[str, ...]:
|
|
86
|
+
return self.delegates_to
|
|
87
|
+
|
|
88
|
+
def contract_errors(self) -> list[str]:
|
|
89
|
+
"""Deterministic lint of a single spec — the agents-contract gate."""
|
|
90
|
+
bad = []
|
|
91
|
+
if self.role not in ROLES:
|
|
92
|
+
bad.append(f"role {self.role!r} not in {ROLES}")
|
|
93
|
+
if self.access not in ACCESS_TIERS:
|
|
94
|
+
bad.append(f"access {self.access!r} not in {ACCESS_TIERS}")
|
|
95
|
+
if self.write_scope not in WRITE_SCOPES:
|
|
96
|
+
bad.append(f"write_scope {self.write_scope!r} not in {WRITE_SCOPES}")
|
|
97
|
+
if self.model_tier not in MODEL_TIERS:
|
|
98
|
+
bad.append(f"model_tier {self.model_tier!r} not in {MODEL_TIERS}")
|
|
99
|
+
if not self.when_to_enter:
|
|
100
|
+
bad.append("missing when_to_enter")
|
|
101
|
+
if not self.when_not_to_enter:
|
|
102
|
+
bad.append("missing when_not_to_enter (negative capability)")
|
|
103
|
+
if not self.never:
|
|
104
|
+
bad.append("missing never (negative capability)")
|
|
105
|
+
if self.role in ("orchestrator", "coordinator") \
|
|
106
|
+
and not self.delegates_to:
|
|
107
|
+
bad.append("coordinator without delegates_to")
|
|
108
|
+
if self.role == "executor" and self.delegates_to:
|
|
109
|
+
bad.append("executor must not delegate (§66)")
|
|
110
|
+
if self.role in ("specialist", "reviewer", "critic",
|
|
111
|
+
"verifier", "executor") and self.access != "read-only":
|
|
112
|
+
bad.append("only orchestrator/coordinator paths may hold "
|
|
113
|
+
"non-read-only access")
|
|
114
|
+
if self.verifier and self.verifier == self.name:
|
|
115
|
+
bad.append("agent cannot verify itself (§21)")
|
|
116
|
+
return bad
|
|
117
|
+
|
|
118
|
+
def to_dict(self) -> dict[str, Any]:
|
|
119
|
+
return {"schema": SCHEMA_AGENT_SPEC,
|
|
120
|
+
"name": self.name, "role": self.role,
|
|
121
|
+
"domains": list(self.domains), "mission": self.mission,
|
|
122
|
+
"when_to_enter": self.when_to_enter,
|
|
123
|
+
"when_not_to_enter": self.when_not_to_enter,
|
|
124
|
+
"inputs": list(self.inputs), "outputs": list(self.outputs),
|
|
125
|
+
"required_evidence": list(self.required_evidence),
|
|
126
|
+
"allowed_verbs": list(self.allowed_verbs),
|
|
127
|
+
"allowed_tools": list(self.allowed_tools),
|
|
128
|
+
"allowed_capabilities": list(self.allowed_capabilities),
|
|
129
|
+
"access": self.access, "write_scope": self.write_scope,
|
|
130
|
+
"model_tier": self.model_tier,
|
|
131
|
+
"max_context_budget": self.max_context_budget,
|
|
132
|
+
"max_tool_calls": self.max_tool_calls,
|
|
133
|
+
"max_parallelism": self.max_parallelism,
|
|
134
|
+
"delegates_to": list(self.delegates_to),
|
|
135
|
+
"cannot_delegate_to": list(self.cannot_delegate_to),
|
|
136
|
+
"reviewers": list(self.reviewers),
|
|
137
|
+
"verifier": self.verifier, "escalation": self.escalation,
|
|
138
|
+
"done_when": self.done_when, "never": self.never}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
AGENTS: dict[str, AgentSpec] = {a.name: a for a in [
|
|
142
|
+
# --- coordinators ------------------------------------------------
|
|
143
|
+
AgentSpec(
|
|
144
|
+
name="platform-orchestrator", role="orchestrator",
|
|
145
|
+
domains=("all",),
|
|
146
|
+
mission="decompose cross-domain platform questions into "
|
|
147
|
+
"specialist work and collect evidence",
|
|
148
|
+
when_to_enter="cross-domain platform question — "
|
|
149
|
+
"'analise minha plataforma'",
|
|
150
|
+
when_not_to_enter="single-domain question answerable by one "
|
|
151
|
+
"specialist; deterministic lookup",
|
|
152
|
+
allowed_verbs=("inspect", "analyze", "judge", "graph", "route",
|
|
153
|
+
"observe", "finops", "product"),
|
|
154
|
+
allowed_capabilities=("platform.inspect", "platform.analyze",
|
|
155
|
+
"platform.judge", "platform.graph.query"),
|
|
156
|
+
never="executes analysis itself; mutates; picks specialists by "
|
|
157
|
+
"vibe instead of routing.yaml; declares itself done",
|
|
158
|
+
inputs=("intent", "repo_root"),
|
|
159
|
+
delegates_to=("platform-iac-specialist",
|
|
160
|
+
"platform-kubernetes-specialist",
|
|
161
|
+
"platform-gitops-specialist",
|
|
162
|
+
"platform-sre-specialist",
|
|
163
|
+
"platform-finops-specialist",
|
|
164
|
+
"platform-security-specialist",
|
|
165
|
+
"platform-graph-specialist"),
|
|
166
|
+
reviewers=("platform-evidence-reviewer",),
|
|
167
|
+
verifier="platform-verifier",
|
|
168
|
+
access="state-writer", write_scope="runs",
|
|
169
|
+
model_tier="standard", max_parallelism=4,
|
|
170
|
+
done_when="every specialist answered or named unresolved, "
|
|
171
|
+
"evidence reviewer passed, handoff complete",
|
|
172
|
+
escalation="human operator",
|
|
173
|
+
),
|
|
174
|
+
AgentSpec(
|
|
175
|
+
name="platform-planner", role="planner", domains=("all",),
|
|
176
|
+
mission="turn a sealed TaskSpec into a loop choice + DAG draft",
|
|
177
|
+
when_to_enter="a task needs orchestration beyond one specialist",
|
|
178
|
+
when_not_to_enter="deterministic lookup; unsealed complex spec",
|
|
179
|
+
allowed_verbs=("route", "graph deps"),
|
|
180
|
+
allowed_capabilities=("platform.route",),
|
|
181
|
+
never="executes stages; approves the spec it planned; invents "
|
|
182
|
+
"capabilities not in the catalog",
|
|
183
|
+
inputs=("task_spec", "routing_table", "orchestration_loops"),
|
|
184
|
+
outputs=("plan", "dag_draft", "budget"),
|
|
185
|
+
model_tier="standard",
|
|
186
|
+
done_when="loop + DAG + envelope emitted or refused",
|
|
187
|
+
escalation="platform-orchestrator",
|
|
188
|
+
),
|
|
189
|
+
# --- coordinators (§28–34) ----------------------------------------
|
|
190
|
+
AgentSpec(
|
|
191
|
+
name="platform-incident-coordinator", role="coordinator",
|
|
192
|
+
domains=("incident", "sre", "runtime"),
|
|
193
|
+
mission="own incident scope, timeline, runtime evidence, "
|
|
194
|
+
"change correlation and candidate causes",
|
|
195
|
+
when_to_enter="incident/outage/regression question",
|
|
196
|
+
when_not_to_enter="no runtime evidence; hypothetical postmortem",
|
|
197
|
+
allowed_verbs=("observe", "correlate", "graph blast",
|
|
198
|
+
"route", "judge"),
|
|
199
|
+
allowed_capabilities=("platform.observe", "platform.graph.query",
|
|
200
|
+
"platform.route"),
|
|
201
|
+
never="declares 'last deploy = cause' without evidence; "
|
|
202
|
+
"restarts/rolls back anything itself",
|
|
203
|
+
inputs=("alerts", "spans", "deploy timeline", "task_spec"),
|
|
204
|
+
delegates_to=("platform-sre-specialist",
|
|
205
|
+
"platform-kubernetes-specialist",
|
|
206
|
+
"platform-aws-specialist",
|
|
207
|
+
"platform-security-specialist",
|
|
208
|
+
"platform-graph-specialist",
|
|
209
|
+
"platform-gitops-specialist"),
|
|
210
|
+
reviewers=("platform-evidence-reviewer",),
|
|
211
|
+
verifier="platform-verifier",
|
|
212
|
+
access="state-writer", write_scope="runs", model_tier="standard",
|
|
213
|
+
max_parallelism=4,
|
|
214
|
+
done_when="scope+timeline+candidate causes with evidence or "
|
|
215
|
+
"unresolved named; verifier closed",
|
|
216
|
+
escalation="human operator",
|
|
217
|
+
),
|
|
218
|
+
AgentSpec(
|
|
219
|
+
name="platform-change-coordinator", role="coordinator",
|
|
220
|
+
domains=("change", "ops"),
|
|
221
|
+
mission="drive Finding→Recommendation→ChangeIntent→Simulation→"
|
|
222
|
+
"Risk→Policy→Approval→Operation plan",
|
|
223
|
+
when_to_enter="a proposed change needs governed review",
|
|
224
|
+
when_not_to_enter="no finding/recommendation to govern; "
|
|
225
|
+
"execution request (refused)",
|
|
226
|
+
allowed_verbs=("change review", "risk", "ops simulate",
|
|
227
|
+
"policy check", "route"),
|
|
228
|
+
allowed_capabilities=("platform.ops.simulate", "platform.judge",
|
|
229
|
+
"platform.route"),
|
|
230
|
+
never="executes the change — execution stays in the "
|
|
231
|
+
"deterministic ops engine behind the human gate",
|
|
232
|
+
inputs=("finding", "recommendation", "change_intent"),
|
|
233
|
+
outputs=("operation_plan", "approval_requirement"),
|
|
234
|
+
delegates_to=("platform-iac-specialist",
|
|
235
|
+
"platform-kubernetes-specialist",
|
|
236
|
+
"platform-gitops-specialist",
|
|
237
|
+
"platform-policy-specialist"),
|
|
238
|
+
reviewers=("platform-operations-safety-reviewer",),
|
|
239
|
+
verifier="platform-verifier",
|
|
240
|
+
access="state-writer", write_scope="runs", model_tier="standard",
|
|
241
|
+
max_parallelism=3,
|
|
242
|
+
done_when="operation plan + approval requirement emitted; "
|
|
243
|
+
"human gate named",
|
|
244
|
+
escalation="human operator",
|
|
245
|
+
),
|
|
246
|
+
AgentSpec(
|
|
247
|
+
name="platform-fleet-coordinator", role="coordinator",
|
|
248
|
+
domains=("fleet",),
|
|
249
|
+
mission="fleet-wide analysis: coverage, org graph, portfolio, "
|
|
250
|
+
"capacity, cost, reliability, policy, golden paths",
|
|
251
|
+
when_to_enter="fleet/portfolio/org-wide question",
|
|
252
|
+
when_not_to_enter="single-repo question; no fleet inventory",
|
|
253
|
+
allowed_verbs=("fleet analyze", "analyze drift", "finops costs",
|
|
254
|
+
"route"),
|
|
255
|
+
allowed_capabilities=("platform.fleet.analyze",
|
|
256
|
+
"platform.route"),
|
|
257
|
+
never="extrapolates one member to the whole fleet; skips "
|
|
258
|
+
"coverage evidence",
|
|
259
|
+
inputs=("workspace.yaml", "member observations"),
|
|
260
|
+
delegates_to=("platform-fleet-specialist",
|
|
261
|
+
"platform-finops-specialist",
|
|
262
|
+
"platform-capacity-specialist",
|
|
263
|
+
"platform-sre-specialist",
|
|
264
|
+
"platform-security-specialist",
|
|
265
|
+
"platform-policy-specialist",
|
|
266
|
+
"platform-product-specialist",
|
|
267
|
+
"platform-optimization-coordinator"),
|
|
268
|
+
reviewers=("platform-evidence-reviewer",
|
|
269
|
+
"platform-privacy-reviewer"),
|
|
270
|
+
verifier="platform-verifier",
|
|
271
|
+
access="state-writer", write_scope="runs", model_tier="standard",
|
|
272
|
+
max_parallelism=6,
|
|
273
|
+
done_when="coverage map + per-member evidence or unresolved "
|
|
274
|
+
"named; verifier closed",
|
|
275
|
+
escalation="human operator",
|
|
276
|
+
),
|
|
277
|
+
AgentSpec(
|
|
278
|
+
name="platform-optimization-coordinator", role="coordinator",
|
|
279
|
+
domains=("optimization", "finops", "capacity"),
|
|
280
|
+
mission="coordinate finops/capacity/reliability/security/ops/"
|
|
281
|
+
"golden-path/fleet/ai-platform signals into one "
|
|
282
|
+
"OptimizationRecommendation",
|
|
283
|
+
when_to_enter="cost/efficiency/rightsizing question or "
|
|
284
|
+
"optimization wave",
|
|
285
|
+
when_not_to_enter="no measured baseline; request to execute "
|
|
286
|
+
"the recommendation",
|
|
287
|
+
allowed_verbs=("finops costs", "observe capacity", "route",
|
|
288
|
+
"economy"),
|
|
289
|
+
allowed_capabilities=("platform.finops.analyze",
|
|
290
|
+
"platform.route"),
|
|
291
|
+
never="emits an ExecutionEnvelope — output is a "
|
|
292
|
+
"OptimizationRecommendation; ChangeIntent only if "
|
|
293
|
+
"accepted",
|
|
294
|
+
inputs=("signals", "baselines"),
|
|
295
|
+
outputs=("optimization_recommendation",),
|
|
296
|
+
delegates_to=("platform-finops-specialist",
|
|
297
|
+
"platform-capacity-specialist",
|
|
298
|
+
"platform-sre-specialist",
|
|
299
|
+
"platform-security-specialist",
|
|
300
|
+
"platform-product-specialist",
|
|
301
|
+
"platform-fleet-specialist",
|
|
302
|
+
"platform-ai-infra-specialist"),
|
|
303
|
+
reviewers=("platform-evidence-reviewer",
|
|
304
|
+
"platform-economy-reviewer"),
|
|
305
|
+
verifier="platform-verifier",
|
|
306
|
+
access="state-writer", write_scope="runs", model_tier="standard",
|
|
307
|
+
max_parallelism=6,
|
|
308
|
+
done_when="recommendation with measured baseline + expected "
|
|
309
|
+
"delta, or unresolved named",
|
|
310
|
+
escalation="platform-change-coordinator",
|
|
311
|
+
),
|
|
312
|
+
AgentSpec(
|
|
313
|
+
name="platform-product-coordinator", role="coordinator",
|
|
314
|
+
domains=("product", "dx", "golden-paths"),
|
|
315
|
+
mission="golden paths, self-service, PlatformRequest, "
|
|
316
|
+
"capability health, adoption, friction, maturity, DX",
|
|
317
|
+
when_to_enter="adoption/DX/golden-path/maturity question",
|
|
318
|
+
when_not_to_enter="pure infra question with no DX angle",
|
|
319
|
+
allowed_verbs=("product", "capability list", "route"),
|
|
320
|
+
allowed_capabilities=("platform.product", "platform.route"),
|
|
321
|
+
never="invents adoption metrics; counts unmeasured usage as "
|
|
322
|
+
"adoption",
|
|
323
|
+
inputs=("capability health", "usage signals", "requests"),
|
|
324
|
+
delegates_to=("platform-product-specialist",
|
|
325
|
+
"platform-fleet-specialist",
|
|
326
|
+
"platform-policy-specialist"),
|
|
327
|
+
reviewers=("platform-evidence-reviewer",
|
|
328
|
+
"platform-privacy-reviewer"),
|
|
329
|
+
verifier="platform-verifier",
|
|
330
|
+
access="state-writer", write_scope="runs", model_tier="standard",
|
|
331
|
+
max_parallelism=3,
|
|
332
|
+
done_when="DX/maturity findings with measured signals or "
|
|
333
|
+
"unresolved named",
|
|
334
|
+
escalation="human operator",
|
|
335
|
+
),
|
|
336
|
+
# --- specialists --------------------------------------------------
|
|
337
|
+
AgentSpec(
|
|
338
|
+
name="platform-iac-specialist", role="specialist", domains=("iac", "terraform"),
|
|
339
|
+
mission="read IaC artifacts into facts; judge them against rules",
|
|
340
|
+
when_to_enter="HCL/plan/state artifacts present or IaC question",
|
|
341
|
+
when_not_to_enter="no IaC artifacts in scope; live cloud query",
|
|
342
|
+
allowed_verbs=("analyze iac", "analyze plan", "analyze state",
|
|
343
|
+
"analyze drift", "judge"),
|
|
344
|
+
allowed_capabilities=("platform.analyze.iac", "platform.judge"),
|
|
345
|
+
required_evidence=("fact_ids",),
|
|
346
|
+
never="applies plans; touches cloud APIs; treats plan as observed",
|
|
347
|
+
inputs=("*.tf", "plan.json", "state.json"),
|
|
348
|
+
done_when="facts+judge emitted or unresolved named with the "
|
|
349
|
+
"missing artifact",
|
|
350
|
+
),
|
|
351
|
+
AgentSpec(
|
|
352
|
+
name="platform-kubernetes-specialist", role="specialist", domains=("k8s", "helm"),
|
|
353
|
+
mission="read manifests/Helm/Kustomize into facts; judge them",
|
|
354
|
+
when_to_enter="manifests/Helm/Kustomize present or workload question",
|
|
355
|
+
when_not_to_enter="live cluster question without an observation "
|
|
356
|
+
"envelope",
|
|
357
|
+
allowed_verbs=("analyze k8s", "judge", "graph deps",
|
|
358
|
+
"graph blast"),
|
|
359
|
+
allowed_capabilities=("platform.analyze.k8s", "platform.judge",
|
|
360
|
+
"platform.graph.query"),
|
|
361
|
+
required_evidence=("fact_ids",),
|
|
362
|
+
never="kubectl apply; mutates clusters; infers runtime state "
|
|
363
|
+
"from manifests alone",
|
|
364
|
+
inputs=("*.yaml manifests",),
|
|
365
|
+
done_when="facts+judge emitted or unresolved named",
|
|
366
|
+
),
|
|
367
|
+
AgentSpec(
|
|
368
|
+
name="platform-gitops-specialist", role="specialist",
|
|
369
|
+
domains=("gitops", "cicd"),
|
|
370
|
+
mission="read ArgoCD/Flux/pipeline artifacts; check delivery path",
|
|
371
|
+
when_to_enter="ArgoCD/Flux/GHA artifacts or delivery-path question",
|
|
372
|
+
when_not_to_enter="no delivery artifacts; commit/rollback request",
|
|
373
|
+
allowed_verbs=("analyze gitops", "analyze gha", "judge"),
|
|
374
|
+
allowed_capabilities=("platform.analyze.gitops", "platform.judge"),
|
|
375
|
+
required_evidence=("fact_ids",),
|
|
376
|
+
never="commits to git; triggers pipelines; treats desired as "
|
|
377
|
+
"observed",
|
|
378
|
+
inputs=("argocd apps", "flux resources", "workflows"),
|
|
379
|
+
done_when="facts+judge emitted or unresolved named",
|
|
380
|
+
),
|
|
381
|
+
AgentSpec(
|
|
382
|
+
name="platform-sre-specialist", role="specialist",
|
|
383
|
+
domains=("sre", "slo", "incident", "capacity", "otel"),
|
|
384
|
+
mission="interpret telemetry/SLO/incident evidence",
|
|
385
|
+
when_to_enter="reliability/latency/incident question or telemetry "
|
|
386
|
+
"present",
|
|
387
|
+
when_not_to_enter="no telemetry scope; root-cause claim without "
|
|
388
|
+
"evidence",
|
|
389
|
+
allowed_verbs=("observe slo", "observe otel", "observe incident",
|
|
390
|
+
"observe capacity", "judge"),
|
|
391
|
+
allowed_capabilities=("platform.observe", "platform.judge"),
|
|
392
|
+
required_evidence=("fact_ids", "freshness"),
|
|
393
|
+
never="declares causation from correlation; invents SLOs",
|
|
394
|
+
inputs=("spans", "alerts", "slo contracts", "metrics dumps"),
|
|
395
|
+
done_when="facts+judge emitted or unresolved named",
|
|
396
|
+
),
|
|
397
|
+
AgentSpec(
|
|
398
|
+
name="platform-finops-specialist", role="specialist", domains=("finops",),
|
|
399
|
+
mission="decompose cost evidence into findings",
|
|
400
|
+
when_to_enter="cost/allocation/unit-economics question or billing "
|
|
401
|
+
"export",
|
|
402
|
+
when_not_to_enter="no billing data; savings claim without baseline",
|
|
403
|
+
allowed_verbs=("finops costs", "finops allocate", "finops graph",
|
|
404
|
+
"finops focus"),
|
|
405
|
+
allowed_capabilities=("platform.finops.analyze",),
|
|
406
|
+
required_evidence=("fact_ids", "denominators"),
|
|
407
|
+
never="claims savings without a measured baseline",
|
|
408
|
+
inputs=("billing export", "cost rows"),
|
|
409
|
+
done_when="facts+judge emitted or unresolved named",
|
|
410
|
+
),
|
|
411
|
+
AgentSpec(
|
|
412
|
+
name="platform-security-specialist", role="specialist", domains=("security",),
|
|
413
|
+
mission="analyze IAM/SBOM/supply-chain/secrets evidence",
|
|
414
|
+
when_to_enter="IAM/SBOM/supply-chain/secrets question",
|
|
415
|
+
when_not_to_enter="request to print or emit secret material",
|
|
416
|
+
allowed_verbs=("analyze iam", "analyze sbom", "analyze secrets",
|
|
417
|
+
"analyze supply", "judge"),
|
|
418
|
+
allowed_capabilities=("platform.analyze.security",
|
|
419
|
+
"platform.judge"),
|
|
420
|
+
required_evidence=("fact_ids",),
|
|
421
|
+
never="prints secret values; verifies signatures offline only "
|
|
422
|
+
"against provided material",
|
|
423
|
+
inputs=("policies", "sboms", "artifact inventories"),
|
|
424
|
+
done_when="facts+judge emitted or unresolved named",
|
|
425
|
+
),
|
|
426
|
+
AgentSpec(
|
|
427
|
+
name="platform-graph-specialist", role="specialist", domains=("graph",),
|
|
428
|
+
mission="build and query the platform graph",
|
|
429
|
+
when_to_enter="dependency/impact/blast-radius question",
|
|
430
|
+
when_not_to_enter="no facts to build from",
|
|
431
|
+
allowed_verbs=("graph build", "graph deps", "graph dependents",
|
|
432
|
+
"graph blast", "graph paths", "graph gaps",
|
|
433
|
+
"graph diff"),
|
|
434
|
+
allowed_capabilities=("platform.graph.build",
|
|
435
|
+
"platform.graph.query"),
|
|
436
|
+
required_evidence=("fact_ids",),
|
|
437
|
+
never="treats proximity as causality",
|
|
438
|
+
inputs=("facts", "snapshots"),
|
|
439
|
+
done_when="graph answer emitted with provenance or unresolved "
|
|
440
|
+
"named",
|
|
441
|
+
),
|
|
442
|
+
AgentSpec(
|
|
443
|
+
name="platform-aws-specialist", role="specialist",
|
|
444
|
+
domains=("aws", "cloud"),
|
|
445
|
+
mission="read cloud inventory/IAM/VPC/EKS/RDS/S3 evidence",
|
|
446
|
+
when_to_enter="cloud account/organization/resource question",
|
|
447
|
+
when_not_to_enter="no inventory or live-snapshot evidence",
|
|
448
|
+
allowed_verbs=("analyze iam", "analyze sbom", "inventory",
|
|
449
|
+
"judge"),
|
|
450
|
+
allowed_capabilities=("platform.live.aws.snapshot",
|
|
451
|
+
"platform.analyze.security",
|
|
452
|
+
"platform.judge"),
|
|
453
|
+
required_evidence=("fact_ids", "coverage"),
|
|
454
|
+
never="calls provider APIs itself — snapshots arrive through "
|
|
455
|
+
"adapters; treats a partial inventory as complete",
|
|
456
|
+
inputs=("inventory", "iam policies", "config snapshots"),
|
|
457
|
+
done_when="facts+judge emitted with coverage or unresolved "
|
|
458
|
+
"named",
|
|
459
|
+
),
|
|
460
|
+
AgentSpec(
|
|
461
|
+
name="platform-crossplane-specialist", role="specialist",
|
|
462
|
+
domains=("crossplane",),
|
|
463
|
+
mission="read XRD/XR/Claim/Composition/provider evidence",
|
|
464
|
+
when_to_enter="Crossplane artifacts or managed-resource question",
|
|
465
|
+
when_not_to_enter="no Crossplane artifacts in scope",
|
|
466
|
+
allowed_verbs=("analyze crossplane", "judge"),
|
|
467
|
+
allowed_capabilities=("platform.analyze.crossplane",
|
|
468
|
+
"platform.judge"),
|
|
469
|
+
required_evidence=("fact_ids",),
|
|
470
|
+
never="treats a Claim as provisioned without observed state",
|
|
471
|
+
inputs=("xrd", "compositions", "claims"),
|
|
472
|
+
done_when="facts+judge emitted or unresolved named",
|
|
473
|
+
),
|
|
474
|
+
AgentSpec(
|
|
475
|
+
name="platform-fleet-specialist", role="specialist",
|
|
476
|
+
domains=("fleet",),
|
|
477
|
+
mission="fleet coverage, org topology, multi-cluster/"
|
|
478
|
+
"multi-account portfolio evidence",
|
|
479
|
+
when_to_enter="fleet/member/portfolio question",
|
|
480
|
+
when_not_to_enter="no workspace.yaml members or observations",
|
|
481
|
+
allowed_verbs=("fleet analyze", "fleet status",
|
|
482
|
+
"analyze drift"),
|
|
483
|
+
allowed_capabilities=("platform.fleet.analyze",),
|
|
484
|
+
required_evidence=("coverage",),
|
|
485
|
+
never="extrapolates one member to the fleet; hides uncovered "
|
|
486
|
+
"members",
|
|
487
|
+
inputs=("member observations", "workspace.yaml"),
|
|
488
|
+
done_when="coverage map emitted; uncovered members named",
|
|
489
|
+
),
|
|
490
|
+
AgentSpec(
|
|
491
|
+
name="platform-policy-specialist", role="specialist",
|
|
492
|
+
domains=("policy", "governance"),
|
|
493
|
+
mission="OPA/Rego/Kyverno/CEL evidence, policy analytics, "
|
|
494
|
+
"exceptions, approval rules, autonomy boundaries",
|
|
495
|
+
when_to_enter="policy/governance/exceptions question",
|
|
496
|
+
when_not_to_enter="no policy artifacts; approval decision "
|
|
497
|
+
"itself (governance gate)",
|
|
498
|
+
allowed_verbs=("policy check", "judge", "explain"),
|
|
499
|
+
allowed_capabilities=("platform.judge", "platform.policy"),
|
|
500
|
+
required_evidence=("fact_ids",),
|
|
501
|
+
never="approves or denies a change — it reads policy; the "
|
|
502
|
+
"human gate decides",
|
|
503
|
+
inputs=("policies", "exceptions", "approvals"),
|
|
504
|
+
done_when="policy findings emitted or unresolved named",
|
|
505
|
+
),
|
|
506
|
+
AgentSpec(
|
|
507
|
+
name="platform-capacity-specialist", role="specialist",
|
|
508
|
+
domains=("capacity", "reliability"),
|
|
509
|
+
mission="capacity/headroom/quota/failure-domain/reliability "
|
|
510
|
+
"hotspot evidence",
|
|
511
|
+
when_to_enter="capacity/headroom/quota/reliability question",
|
|
512
|
+
when_not_to_enter="no capacity or telemetry facts",
|
|
513
|
+
allowed_verbs=("observe capacity", "observe slo", "judge"),
|
|
514
|
+
allowed_capabilities=("platform.observe", "platform.judge"),
|
|
515
|
+
required_evidence=("fact_ids", "freshness"),
|
|
516
|
+
never="projects capacity without measured headroom",
|
|
517
|
+
inputs=("quota facts", "usage metrics", "topology"),
|
|
518
|
+
done_when="facts+judge emitted or unresolved named",
|
|
519
|
+
),
|
|
520
|
+
AgentSpec(
|
|
521
|
+
name="platform-product-specialist", role="specialist",
|
|
522
|
+
domains=("product", "dx"),
|
|
523
|
+
mission="self-service/golden-path/developer-friction/capability-"
|
|
524
|
+
"health/maturity evidence",
|
|
525
|
+
when_to_enter="DX/adoption/golden-path question",
|
|
526
|
+
when_not_to_enter="no usage or request signals",
|
|
527
|
+
allowed_verbs=("product", "capability list"),
|
|
528
|
+
allowed_capabilities=("platform.product",),
|
|
529
|
+
required_evidence=("fact_ids",),
|
|
530
|
+
never="invents adoption; counts intention as usage",
|
|
531
|
+
inputs=("usage signals", "requests", "capability health"),
|
|
532
|
+
done_when="DX findings emitted or unresolved named",
|
|
533
|
+
),
|
|
534
|
+
AgentSpec(
|
|
535
|
+
name="platform-ai-infra-specialist", role="specialist",
|
|
536
|
+
domains=("ai", "gpu"),
|
|
537
|
+
mission="AI infrastructure only: GPU/MIG/model-serving/AI "
|
|
538
|
+
"capacity/cost/SLO evidence",
|
|
539
|
+
when_to_enter="GPU/model-serving/ai-capacity question",
|
|
540
|
+
when_not_to_enter="model development, prompt engineering or "
|
|
541
|
+
"RAG architecture (explicitly out of scope)",
|
|
542
|
+
allowed_verbs=("analyze ai", "finops costs", "judge"),
|
|
543
|
+
allowed_capabilities=("platform.analyze.ai",
|
|
544
|
+
"platform.finops.analyze"),
|
|
545
|
+
required_evidence=("fact_ids",),
|
|
546
|
+
never="advises on model quality/prompts; claims GPU savings "
|
|
547
|
+
"without measured utilization",
|
|
548
|
+
inputs=("gpu inventory", "serving metrics", "cost rows"),
|
|
549
|
+
done_when="facts+judge emitted or unresolved named",
|
|
550
|
+
),
|
|
551
|
+
AgentSpec(
|
|
552
|
+
name="platform-federation-specialist", role="specialist",
|
|
553
|
+
domains=("federation",),
|
|
554
|
+
mission="ForgeNode/export-policy/summary-exchange/authority-"
|
|
555
|
+
"boundary/fleet-federation evidence",
|
|
556
|
+
when_to_enter="federation/forgenode/sibling-forge question",
|
|
557
|
+
when_not_to_enter="no federation config or export policy",
|
|
558
|
+
allowed_verbs=("federation status", "federation export",
|
|
559
|
+
"judge"),
|
|
560
|
+
allowed_capabilities=("platform.federation",),
|
|
561
|
+
required_evidence=("fact_ids",),
|
|
562
|
+
never="exports raw facts across the authority boundary — "
|
|
563
|
+
"summaries only, per export policy",
|
|
564
|
+
inputs=("forgenode configs", "export policies"),
|
|
565
|
+
done_when="federation findings emitted or unresolved named",
|
|
566
|
+
),
|
|
567
|
+
# --- reviewers / referee ------------------------------------------
|
|
568
|
+
AgentSpec(
|
|
569
|
+
name="platform-evidence-reviewer", role="reviewer", domains=("evidence",),
|
|
570
|
+
mission="gate conclusions on cited evidence",
|
|
571
|
+
when_to_enter="before any conclusion ships",
|
|
572
|
+
when_not_to_enter="no conclusion produced yet",
|
|
573
|
+
allowed_verbs=("judge", "status"),
|
|
574
|
+
allowed_capabilities=("platform.judge",),
|
|
575
|
+
required_evidence=("fact_ids",),
|
|
576
|
+
never="accepts findings with empty evidence",
|
|
577
|
+
inputs=("findings", "facts"),
|
|
578
|
+
outputs=("verdict", "missing_evidence"),
|
|
579
|
+
model_tier="critical-review",
|
|
580
|
+
done_when="every finding carries evidence or is marked "
|
|
581
|
+
"unresolved",
|
|
582
|
+
),
|
|
583
|
+
AgentSpec(
|
|
584
|
+
name="platform-debate-referee", role="referee", domains=("conflicts",),
|
|
585
|
+
mission="adjudicate specialist disagreement on declared axes",
|
|
586
|
+
when_to_enter="two specialists disagree",
|
|
587
|
+
when_not_to_enter="single uncontested position; no evidence on "
|
|
588
|
+
"either side",
|
|
589
|
+
allowed_verbs=("route", "judge"),
|
|
590
|
+
allowed_capabilities=("platform.judge",),
|
|
591
|
+
never="averages positions; ranks by vibes — evidence tier decides",
|
|
592
|
+
inputs=("competing findings",),
|
|
593
|
+
outputs=("adjudication", "receipt"),
|
|
594
|
+
model_tier="critical-review",
|
|
595
|
+
done_when="winner/tied/unresolved returned with receipt",
|
|
596
|
+
),
|
|
597
|
+
AgentSpec(
|
|
598
|
+
name="platform-operations-safety-reviewer", role="reviewer",
|
|
599
|
+
domains=("ops", "change"),
|
|
600
|
+
mission="gate proposed operations on source-of-truth, risk, "
|
|
601
|
+
"approval, rollback material, expected delta, locks, "
|
|
602
|
+
"idempotency, verification (§51)",
|
|
603
|
+
when_to_enter="a change/operation plan awaits review",
|
|
604
|
+
when_not_to_enter="no plan exists; production mutation request "
|
|
605
|
+
"itself (refused)",
|
|
606
|
+
allowed_verbs=("change review", "ops simulate", "judge"),
|
|
607
|
+
allowed_capabilities=("platform.ops.simulate", "platform.judge"),
|
|
608
|
+
required_evidence=("fact_ids",),
|
|
609
|
+
never="approves — it reports safety gaps; approval is the "
|
|
610
|
+
"human gate",
|
|
611
|
+
inputs=("operation_plan", "simulation", "rollback material"),
|
|
612
|
+
outputs=("safety_verdict", "gaps"),
|
|
613
|
+
model_tier="critical-review",
|
|
614
|
+
done_when="every §51 checklist item answered pass|gap",
|
|
615
|
+
),
|
|
616
|
+
AgentSpec(
|
|
617
|
+
name="platform-security-reviewer", role="reviewer",
|
|
618
|
+
domains=("security",),
|
|
619
|
+
mission="review another agent's security conclusion/change — "
|
|
620
|
+
"analysis is the specialist's; this reviews it (§52)",
|
|
621
|
+
when_to_enter="a security-affecting finding or change is "
|
|
622
|
+
"proposed",
|
|
623
|
+
when_not_to_enter="no proposal to review; raw secret material "
|
|
624
|
+
"in scope",
|
|
625
|
+
allowed_verbs=("judge", "analyze iam", "analyze secrets"),
|
|
626
|
+
allowed_capabilities=("platform.analyze.security",
|
|
627
|
+
"platform.judge"),
|
|
628
|
+
required_evidence=("fact_ids",),
|
|
629
|
+
never="prints secret values; performs fresh analysis instead "
|
|
630
|
+
"of reviewing the proposal",
|
|
631
|
+
inputs=("proposed finding", "change plan"),
|
|
632
|
+
outputs=("review_verdict", "issues"),
|
|
633
|
+
model_tier="critical-review",
|
|
634
|
+
done_when="verdict with issues list emitted",
|
|
635
|
+
),
|
|
636
|
+
AgentSpec(
|
|
637
|
+
name="platform-architecture-reviewer", role="reviewer",
|
|
638
|
+
domains=("architecture",),
|
|
639
|
+
mission="review platform-wide changes, new capabilities, new "
|
|
640
|
+
"subsystems, new contracts, high blast radius (§53)",
|
|
641
|
+
when_to_enter="new subsystem/contract/capability or "
|
|
642
|
+
"high-blast-radius change",
|
|
643
|
+
when_not_to_enter="routine single-domain finding",
|
|
644
|
+
allowed_verbs=("graph blast", "judge", "explain"),
|
|
645
|
+
allowed_capabilities=("platform.graph.query",
|
|
646
|
+
"platform.judge"),
|
|
647
|
+
required_evidence=("fact_ids",),
|
|
648
|
+
never="blocks by taste — every objection cites blast radius "
|
|
649
|
+
"or a violated boundary",
|
|
650
|
+
inputs=("proposal", "graph", "contract diffs"),
|
|
651
|
+
outputs=("review_verdict", "objections"),
|
|
652
|
+
model_tier="critical-review",
|
|
653
|
+
done_when="verdict + objections (each citing evidence) emitted",
|
|
654
|
+
),
|
|
655
|
+
AgentSpec(
|
|
656
|
+
name="platform-privacy-reviewer", role="reviewer",
|
|
657
|
+
domains=("privacy",),
|
|
658
|
+
mission="review fleet/DX analytics, federation exchanges, "
|
|
659
|
+
"exports and history for privacy posture (§56)",
|
|
660
|
+
when_to_enter="analytics/federation/export/history output is "
|
|
661
|
+
"produced",
|
|
662
|
+
when_not_to_enter="no data crosses a boundary",
|
|
663
|
+
allowed_verbs=("privacy check", "judge"),
|
|
664
|
+
allowed_capabilities=("platform.privacy", "platform.judge"),
|
|
665
|
+
required_evidence=("fact_ids",),
|
|
666
|
+
never="treats aggregation as anonymization; approves exports "
|
|
667
|
+
"with unresolved identifiers",
|
|
668
|
+
inputs=("export", "analytics output", "history rows"),
|
|
669
|
+
outputs=("review_verdict", "exposures"),
|
|
670
|
+
model_tier="critical-review",
|
|
671
|
+
done_when="verdict + exposure list emitted or pass recorded",
|
|
672
|
+
),
|
|
673
|
+
AgentSpec(
|
|
674
|
+
name="platform-task-spec-reviewer", role="reviewer",
|
|
675
|
+
domains=("tasks",),
|
|
676
|
+
mission="review and seal TaskSpecs before orchestration",
|
|
677
|
+
when_to_enter="a draft TaskSpec exists",
|
|
678
|
+
when_not_to_enter="spec already sealed; spec it wrote itself",
|
|
679
|
+
allowed_verbs=("route", "capability check"),
|
|
680
|
+
allowed_capabilities=("platform.route",),
|
|
681
|
+
never="seals its own spec; edits intent — it rejects, "
|
|
682
|
+
"it does not rewrite",
|
|
683
|
+
inputs=("draft_spec",),
|
|
684
|
+
outputs=("seal", "rejection", "questions"),
|
|
685
|
+
model_tier="fast",
|
|
686
|
+
done_when="spec sealed with hash or rejected with reasons",
|
|
687
|
+
),
|
|
688
|
+
AgentSpec(
|
|
689
|
+
name="platform-adversarial-critic", role="critic",
|
|
690
|
+
domains=("plans",),
|
|
691
|
+
mission="attack the plan before acceptance on the §22 axes",
|
|
692
|
+
when_to_enter="a DAG draft exists and has not run yet",
|
|
693
|
+
when_not_to_enter="post-run closure — that is the verifier's job",
|
|
694
|
+
allowed_verbs=("judge",),
|
|
695
|
+
allowed_capabilities=("platform.judge",),
|
|
696
|
+
never="verifies — it finds how this could be wrong, "
|
|
697
|
+
"not that it is right",
|
|
698
|
+
inputs=("plan", "spec"),
|
|
699
|
+
outputs=("attacks", "open_risks"),
|
|
700
|
+
model_tier="critical-review",
|
|
701
|
+
done_when="every attack axis answered ok|risk",
|
|
702
|
+
),
|
|
703
|
+
AgentSpec(
|
|
704
|
+
name="platform-verifier", role="verifier", domains=("closure",),
|
|
705
|
+
mission="independently check a run before closure",
|
|
706
|
+
when_to_enter="a run record is complete",
|
|
707
|
+
when_not_to_enter="it produced any output in the run it is "
|
|
708
|
+
"verifying (independence)",
|
|
709
|
+
allowed_verbs=("judge", "diff", "graph query"),
|
|
710
|
+
allowed_capabilities=("platform.judge",),
|
|
711
|
+
required_evidence=("fact_ids",),
|
|
712
|
+
never="verifies its own work; upgrades a refuted claim; "
|
|
713
|
+
"accepts missing criteria as passed",
|
|
714
|
+
inputs=("run_record", "spec", "evidence_index"),
|
|
715
|
+
outputs=("verdict", "receipt"),
|
|
716
|
+
model_tier="critical-review",
|
|
717
|
+
done_when="confirmed|unresolved verdict + receipt emitted",
|
|
718
|
+
),
|
|
719
|
+
AgentSpec(
|
|
720
|
+
name="platform-release-guardian", role="guardian",
|
|
721
|
+
domains=("release",),
|
|
722
|
+
mission="deterministic closure review — READY or blockers",
|
|
723
|
+
when_to_enter="release/freeze question",
|
|
724
|
+
when_not_to_enter="any signal unmeasured — missing is a blocker",
|
|
725
|
+
allowed_verbs=("validate", "status", "evals run", "lab run-all"),
|
|
726
|
+
allowed_capabilities=("platform.validate",),
|
|
727
|
+
never="runs the gates itself; calls unmeasured signals passed",
|
|
728
|
+
inputs=("gate_signals", "receipts"),
|
|
729
|
+
outputs=("verdict", "blockers"),
|
|
730
|
+
model_tier="deterministic",
|
|
731
|
+
done_when="READY or an explicit blocker list emitted",
|
|
732
|
+
),
|
|
733
|
+
AgentSpec(
|
|
734
|
+
name="platform-economy-reviewer", role="reviewer", domains=("economy",),
|
|
735
|
+
mission="audit token/context spend claims",
|
|
736
|
+
when_to_enter="context spend is questioned",
|
|
737
|
+
when_not_to_enter="no ledger/pack data to measure",
|
|
738
|
+
allowed_verbs=("economy", "tokens stats", "tokens ledger"),
|
|
739
|
+
allowed_capabilities=("platform.economy",),
|
|
740
|
+
required_evidence=("ledger",),
|
|
741
|
+
never="claims token savings without measured bytes",
|
|
742
|
+
inputs=("ledger", "packs"),
|
|
743
|
+
outputs=("report",),
|
|
744
|
+
done_when="spend reported with measured bytes or unresolved "
|
|
745
|
+
"named",
|
|
746
|
+
),
|
|
747
|
+
# --- executor subagents (§57–66): one job, structured I/O, -------
|
|
748
|
+
# --- never dispatch, never self-verify ---------------------------
|
|
749
|
+
AgentSpec(
|
|
750
|
+
name="pf-inventory", role="executor", domains=("inventory",),
|
|
751
|
+
mission="discover artifacts, domains and available evidence; "
|
|
752
|
+
"emit a coverage map",
|
|
753
|
+
when_to_enter="a root needs artifact discovery",
|
|
754
|
+
when_not_to_enter="judgment or severity is asked for",
|
|
755
|
+
allowed_verbs=("collect",),
|
|
756
|
+
allowed_capabilities=("platform.collect",),
|
|
757
|
+
inputs=("path",), outputs=("coverage_map", "artifact_list"),
|
|
758
|
+
model_tier="deterministic", max_tool_calls=8,
|
|
759
|
+
never="judges; assigns severity; touches providers",
|
|
760
|
+
done_when="coverage map + artifact list emitted",
|
|
761
|
+
),
|
|
762
|
+
AgentSpec(
|
|
763
|
+
name="pf-extractor", role="executor", domains=("extract",),
|
|
764
|
+
mission="artifact → facts",
|
|
765
|
+
when_to_enter="artifacts need fact extraction",
|
|
766
|
+
when_not_to_enter="severity or recommendation is asked for",
|
|
767
|
+
allowed_verbs=("collect", "analyze"),
|
|
768
|
+
allowed_capabilities=("platform.collect",),
|
|
769
|
+
inputs=("artifacts",), outputs=("facts",),
|
|
770
|
+
model_tier="deterministic", max_tool_calls=16,
|
|
771
|
+
never="assigns severity; filters facts silently",
|
|
772
|
+
done_when="facts with fact_ids emitted or artifact named "
|
|
773
|
+
"unextractable",
|
|
774
|
+
),
|
|
775
|
+
AgentSpec(
|
|
776
|
+
name="pf-judge", role="executor", domains=("rules",),
|
|
777
|
+
mission="facts → rules → findings",
|
|
778
|
+
when_to_enter="facts need rule evaluation",
|
|
779
|
+
when_not_to_enter="no rules loaded; change recommendation "
|
|
780
|
+
"is asked for",
|
|
781
|
+
allowed_verbs=("judge",),
|
|
782
|
+
allowed_capabilities=("platform.judge",),
|
|
783
|
+
inputs=("facts", "rules"), outputs=("findings", "skipped"),
|
|
784
|
+
model_tier="deterministic", max_tool_calls=16,
|
|
785
|
+
never="recommends changes; drops skipped rules silently",
|
|
786
|
+
done_when="findings + skipped-with-reason emitted",
|
|
787
|
+
),
|
|
788
|
+
AgentSpec(
|
|
789
|
+
name="pf-graph-builder", role="executor", domains=("graph",),
|
|
790
|
+
mission="facts → Graphfy graph",
|
|
791
|
+
when_to_enter="facts need graph materialization",
|
|
792
|
+
when_not_to_enter="no facts; relationship without evidence "
|
|
793
|
+
"is asked for",
|
|
794
|
+
allowed_verbs=("graph build",),
|
|
795
|
+
allowed_capabilities=("platform.graph.build",),
|
|
796
|
+
inputs=("facts",), outputs=("graph",),
|
|
797
|
+
model_tier="deterministic", max_tool_calls=16,
|
|
798
|
+
never="creates an edge without a contributing fact_id",
|
|
799
|
+
done_when="graph emitted; unprovenanced edges reported",
|
|
800
|
+
),
|
|
801
|
+
AgentSpec(
|
|
802
|
+
name="pf-reconciler", role="executor", domains=("drift",),
|
|
803
|
+
mission="reconcile desired / planned / observed / runtime",
|
|
804
|
+
when_to_enter="state sets need reconciliation",
|
|
805
|
+
when_not_to_enter="only one state exists",
|
|
806
|
+
allowed_verbs=("diff", "analyze drift"),
|
|
807
|
+
allowed_capabilities=("platform.diff",),
|
|
808
|
+
inputs=("desired", "planned", "observed"),
|
|
809
|
+
outputs=("reconciliation",),
|
|
810
|
+
model_tier="deterministic", max_tool_calls=8,
|
|
811
|
+
never="collapses states; resolves drift by picking a side",
|
|
812
|
+
done_when="reconciliation doc with both states emitted",
|
|
813
|
+
),
|
|
814
|
+
AgentSpec(
|
|
815
|
+
name="pf-simulator", role="executor", domains=("simulate",),
|
|
816
|
+
mission="safe simulation: planned graph → expected delta",
|
|
817
|
+
when_to_enter="a change needs an expected-delta document",
|
|
818
|
+
when_not_to_enter="production execution is asked for",
|
|
819
|
+
allowed_verbs=("ops simulate", "diff"),
|
|
820
|
+
allowed_capabilities=("platform.ops.simulate",),
|
|
821
|
+
inputs=("observed_graph", "planned_graph"),
|
|
822
|
+
outputs=("expected_delta",),
|
|
823
|
+
model_tier="deterministic", max_tool_calls=8,
|
|
824
|
+
never="executes; touches production; omits limitations",
|
|
825
|
+
done_when="expected delta + limitations emitted",
|
|
826
|
+
),
|
|
827
|
+
AgentSpec(
|
|
828
|
+
name="pf-synthesizer", role="executor", domains=("compose",),
|
|
829
|
+
mission="compose findings + graph + reviews + referee "
|
|
830
|
+
"decisions into the final document",
|
|
831
|
+
when_to_enter="a run has material to compose",
|
|
832
|
+
when_not_to_enter="new facts are needed — it references, "
|
|
833
|
+
"never mints",
|
|
834
|
+
allowed_verbs=(),
|
|
835
|
+
allowed_capabilities=(),
|
|
836
|
+
inputs=("findings", "graph", "reviews", "referee"),
|
|
837
|
+
outputs=("synthesis",),
|
|
838
|
+
model_tier="fast", max_tool_calls=4,
|
|
839
|
+
never="creates new facts; hides unresolved items",
|
|
840
|
+
done_when="synthesis emitted citing only its inputs",
|
|
841
|
+
),
|
|
842
|
+
AgentSpec(
|
|
843
|
+
name="pf-verifier", role="executor", domains=("proof",),
|
|
844
|
+
mission="mechanical proof checks: hashes, receipts, "
|
|
845
|
+
"acceptance shape — used by platform-verifier (§65)",
|
|
846
|
+
when_to_enter="a document needs mechanical verification",
|
|
847
|
+
when_not_to_enter="judgment is required — that stays with "
|
|
848
|
+
"platform-verifier",
|
|
849
|
+
allowed_verbs=("diff",),
|
|
850
|
+
allowed_capabilities=("platform.judge",),
|
|
851
|
+
inputs=("document", "expected_hash"),
|
|
852
|
+
outputs=("check_result",),
|
|
853
|
+
model_tier="deterministic", max_tool_calls=4,
|
|
854
|
+
never="verifies itself; judges semantics — checks shape and "
|
|
855
|
+
"hashes only",
|
|
856
|
+
done_when="ok|problems emitted",
|
|
857
|
+
),
|
|
858
|
+
]}
|
|
859
|
+
|
|
860
|
+
|
|
861
|
+
# Legacy names still resolve — one source of truth, no silent drift.
|
|
862
|
+
LEGACY_NAMES: dict[str, str] = {
|
|
863
|
+
"platform-coordinator": "platform-orchestrator",
|
|
864
|
+
"iac-analyst": "platform-iac-specialist",
|
|
865
|
+
"k8s-analyst": "platform-kubernetes-specialist",
|
|
866
|
+
"gitops-analyst": "platform-gitops-specialist",
|
|
867
|
+
"sre-analyst": "platform-sre-specialist",
|
|
868
|
+
"finops-analyst": "platform-finops-specialist",
|
|
869
|
+
"security-analyst": "platform-security-specialist",
|
|
870
|
+
"graph-analyst": "platform-graph-specialist",
|
|
871
|
+
"evidence-reviewer": "platform-evidence-reviewer",
|
|
872
|
+
"consistency-referee": "platform-debate-referee",
|
|
873
|
+
"economy-reviewer": "platform-economy-reviewer",
|
|
874
|
+
# routing.yaml v1 names (pre-5.1 drift) resolve to canonical agents
|
|
875
|
+
"incident-coordinator": "platform-incident-coordinator",
|
|
876
|
+
"security-reviewer": "platform-security-reviewer",
|
|
877
|
+
"architecture-reviewer": "platform-architecture-reviewer",
|
|
878
|
+
"change-risk-reviewer": "platform-operations-safety-reviewer",
|
|
879
|
+
"finops-coordinator": "platform-finops-specialist",
|
|
880
|
+
"kubernetes-specialist": "platform-kubernetes-specialist",
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
def resolve(name: str) -> AgentSpec | None:
|
|
885
|
+
"""Canonical-name lookup; legacy aliases resolve with no ambiguity."""
|
|
886
|
+
return AGENTS.get(name) or AGENTS.get(LEGACY_NAMES.get(name, ""))
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
def coordinator_for(domain: str) -> AgentSpec | None:
|
|
890
|
+
for a in AGENTS.values():
|
|
891
|
+
if a.role == "specialist" and domain in a.domains:
|
|
892
|
+
return a
|
|
893
|
+
return AGENTS["platform-orchestrator"]
|