7e6ed25ea9
Tier 1 mechanical: I1 regression-gate-as-policy (REQ-304/305), I2 contract-shape (REQ-295), I3 stack-IR rules (REQ-297). Tier 2 backend-enriched: I4 plan-JSON RULE_MAP mirrors (REQ-300), I5 meta-policies (REQ-303). Deferred: I6 env-transition (stateful, not policy-shaped), I7 drift (D-096 blocker), I8 cross-project (single-project). Quality improvement headline: I1 — capability regression becomes a declarative policy artifact, not imperative Python. ---ci--- project: acdl phase: 0 milestone: v1.25 status: ideate ---/ci---
157 lines
7.7 KiB
Markdown
157 lines
7.7 KiB
Markdown
# IDEATE — v1.25 kyverno-json Unified Policy Engine
|
|
|
|
> **Autonomy:** full. 3-tier ideation per `config.json ideation.enabled:
|
|
> true`. `cross_project.enabled: false` → cross-project tier scoped to
|
|
> single-project (deferred ideas only, no cross-project candidates
|
|
> accepted). `confidence_threshold: 0.6`, `max_ideas: 20`.
|
|
> Categories: security, quality, architecture, coverage, improvement.
|
|
|
|
## Tier 1 — Mechanical (pattern-driven, codebase-grounded)
|
|
|
|
### I1 — Regression-gate-as-policy ✅ ACCEPTED (REQ-304, REQ-305)
|
|
|
|
**Category:** quality, coverage
|
|
**Confidence:** 0.90
|
|
**Pattern:** imperative check → declarative policy (the milestone's
|
|
core thesis applied to Nova's own regression gate).
|
|
**Source:** `core/regression_verify.py` (CAP-013, CAP-023, CAP-024)
|
|
are imperative Python checks. The milestone makes compliance
|
|
declarative; Nova's own capability regression should follow.
|
|
**Idea:** Port the three capability checks into
|
|
`adapters/kyverno-json/policies/regression/` as declarative policies
|
|
over the capability-inventory JSON frontmatter. The imperative
|
|
`regression_verify.py` stays (it drives the CI gate); the policies are
|
|
the declarative mirror that makes capability regression auditable as a
|
|
policy artifact.
|
|
**Accepted into:** REQ-304 (policies), REQ-305 (tests). Phase P4.
|
|
|
|
### I2 — Contract-shape validation as policy ✅ ACCEPTED (REQ-295)
|
|
|
|
**Category:** security, architecture
|
|
**Confidence:** 0.92
|
|
**Pattern:** jsonschema constraint → declarative policy (same constraint,
|
|
different language, Nova posture on top).
|
|
**Source:** `schemas/contract.schema.json` required/pattern/enum.
|
|
**Idea:** The 4 contract policies (`require-id-pattern`,
|
|
`require-env-in-enum`, `require-infrastructure-min-1`, `forbid-unknown-
|
|
fields`) are the declarative equivalent of the jsonschema constraints —
|
|
they let Nova apply its own compliance posture (e.g. forbid a specific
|
|
env for a specific consumer) on top of schema validity without editing
|
|
the jsonschema.
|
|
**Accepted into:** REQ-295. Phase P2.
|
|
|
|
### I3 — Stack-IR imperative rules → declarative policies ✅ ACCEPTED (REQ-297)
|
|
|
|
**Category:** security, architecture
|
|
**Confidence:** 0.88
|
|
**Pattern:** imperative Python rule → declarative kyverno-json policy.
|
|
**Source:** `adapters/terraform/policy/custom_rules/nova_tagging.py`
|
|
(tagging), the v1.0 demo `public-ingress: true` rule, the v1.8
|
|
D-encryption-default rule.
|
|
**Idea:** Port the three highest-impact imperative rules into
|
|
declarative kyverno-json policies over the resolved Stack IR. The
|
|
tagging rule is a cross-check (D-118 — both engines, agree meta-policy);
|
|
public-ingress and encryption-by-default are kyverno-json only (the IR
|
|
is the earliest point these can be caught).
|
|
**Accepted into:** REQ-297. Phase P2.
|
|
|
|
## Tier 2 — Backend-enriched (signal-driven)
|
|
|
|
### I4 — Plan-JSON Checkov RULE_MAP → kyverno-json mirrors ✅ ACCEPTED (REQ-300)
|
|
|
|
**Category:** security, coverage
|
|
**Confidence:** 0.85
|
|
**Pattern:** existing engine rule → declarative mirror in the new engine
|
|
(defense-in-depth against engine drift).
|
|
**Source:** `checkov_adapter.py:RULE_MAP` (CKV_AWS_41/45/46, CKV_AWS_1/40,
|
|
CKV_AWS_7/33).
|
|
**Idea:** Port the 6 Checkov rules over `terraform_plan` into declarative
|
|
kyverno-json policies over `terraform show -json` output. The Checkov
|
|
rules stay the source of truth for HCL scanning; the kyverno-json
|
|
policies are mirrors (different rule language, same plan JSON). Defense-
|
|
in-depth: if Checkov and kyverno-json disagree on the same plan, the
|
|
divergence is visible (two PCRs with different results for the same
|
|
resource).
|
|
**Accepted into:** REQ-300. Phase P3.
|
|
|
|
### I5 — Meta-policy over the merged PCR list ✅ ACCEPTED (REQ-303)
|
|
|
|
**Category:** architecture, quality
|
|
**Confidence:** 0.90
|
|
**Pattern:** the policy result list is itself a policy target (the most
|
|
novel use of kyverno-json in v1.25).
|
|
**Source:** `core/confidence_signal.py` PENALTY hardcode (critical
|
|
override), the D-118 tagging cross-check.
|
|
**Idea:** `block-on-any-critical` (declarative "critical = block") +
|
|
`tagging-rules-agree` (Checkov vs kj agree). The meta-policies consume
|
|
the merged PCR list as their payload. The critical-block meta-policy is
|
|
the declarative source of truth; the `confidence_signal.py` hard-override
|
|
stays as defense-in-depth (D-119).
|
|
**Accepted into:** REQ-303. Phase P3.
|
|
|
|
### I6 — Env-transition destroy as a declarative policy ❌ DEFERRED
|
|
|
|
**Category:** improvement
|
|
**Confidence:** 0.55 (below threshold — deferred, not rejected)
|
|
**Pattern:** imperative lifecycle Python → declarative policy.
|
|
**Source:** `core/env_transition.py` (v1.24 detect-and-destroy).
|
|
**Idea:** The v1.24 env-transition destroy logic (detect env change via
|
|
DynamoDB, destroy prior env, fail-closed) is imperative Python. A
|
|
declarative kyverno-json policy could assert "if `environment` changed
|
|
on a stable `contract.id`, a destroy event MUST precede the apply" —
|
|
turning the lifecycle enforcement into an auditable policy artifact.
|
|
**Reason deferred:** The env-transition logic is *stateful* (DynamoDB
|
|
queries, terraform state inspection) — kyverno-json policies are
|
|
*stateless* (payload in, PCRs out). A policy can assert the *contract*
|
|
shape (the env value is valid) but not the *lifecycle* (the prior env
|
|
was destroyed). The stateful check stays in `core/env_transition.py`;
|
|
a future milestone could emit a `nova.env.destroyed` event that a
|
|
kyverno-json policy then asserts is present in the evidence stream
|
|
(event-as-policy). Recorded as a future-idea, not a v1.25 requirement.
|
|
|
|
### I7 — Drift detection as policy ❌ DEFERRED
|
|
|
|
**Category:** security, coverage
|
|
**Confidence:** 0.40 (below threshold — deferred)
|
|
**Pattern:** scheduled job → policy over the drift report.
|
|
**Source:** NORTH_STAR.md Non-Goal #4 (drift detection scheduled job,
|
|
deferred — D-096 + no scheduler).
|
|
**Idea:** A kyverno-json policy over a terraform drift report could
|
|
assert "no drifted resources" declaratively. But drift detection itself
|
|
requires a scheduled `terraform plan -detailed-exitcode` job, which is
|
|
deferred (no scheduler). The policy is the easy part; the emitter is the
|
|
blocking dependency.
|
|
**Reason deferred:** Blocked by D-096 + no scheduler (same as NORTH_STAR
|
|
Non-Goal #4). The policy shape is documented for when the emitter ships.
|
|
|
|
## Tier 3 — Cross-project (deferred — single project)
|
|
|
|
### I8 — Cross-project policy sharing ❌ DEFERRED (config)
|
|
|
|
**Category:** improvement
|
|
**Confidence:** N/A
|
|
**Pattern:** policies shared across projects in a multi-project org.
|
|
**Source:** `config.json ideation.cross_project.enabled: false`.
|
|
**Idea:** In a multi-project org, kyverno-json policies could be shared
|
|
across projects (a tagging standard policy applies to all projects).
|
|
**Reason deferred:** ACDL is single-project (`active_projects: ["acdl"]`).
|
|
Cross-project ideation is disabled in config. Recorded for when the
|
|
org grows.
|
|
|
|
## Summary
|
|
|
|
- 5 ideas accepted (I1..I5) → already captured as REQ-295, REQ-297,
|
|
REQ-300, REQ-303, REQ-304, REQ-305.
|
|
- 3 ideas deferred (I6, I7, I8) with documented blocking reasons.
|
|
- 0 ideas rejected (below-threshold ideas are deferred, not rejected —
|
|
they may activate when their blockers lift).
|
|
- The accepted ideas are the **quality improvement** the user asked for
|
|
("ideate and explore how it can be used within the Nova platform to
|
|
improve quality of the platform checks"): I1 (regression-gate-as-
|
|
policy) is the headline quality improvement; I4 + I5 are the defense-
|
|
in-depth coverage improvements; I2 + I3 are the architecture
|
|
improvements (imperative → declarative).
|
|
- No new requirements added beyond REQ-291..309 (the accepted ideas are
|
|
already scoped into the existing requirements). The IDEATE pass
|
|
validated the requirement set rather than expanding it — the ideas
|
|
were anticipated in the SPECIFY stage and explicitly captured. |