6.4 KiB
6.4 KiB
Research: Provider-neutral Artifact Source Taxonomy
Decision 1: Use one shared descriptor over existing artifact truth, not a new artifact table
- Decision: represent provider-neutral artifact lineage through one shared descriptor carried by existing finding, evidence, stored-report, inventory, and review-summary seams.
- Why: the repo already stores the underlying truth in
Finding,EvidenceSnapshotItem,StoredReport, andInventoryItem. A new artifact-source table would duplicate that truth and create lifecycle or ownership questions that the current release does not need. - Alternatives considered:
- new
artifact_sourcestable: rejected because it adds persistence and drift risk with no current-release operator value - page-local aliasing only: rejected because it would preserve conflicting summaries across findings, evidence, reports, inventory, and review sections
- new
Decision 2: Pin exact inventories for source_family, source_kind, and source_target_kind
- Decision: keep the initial inventories exact and small.
- Pinned
source_familyset:findingstored_reportevidence_snapshotinventoryoperation_run
- Pinned
source_kindset:model_summarystored_reportoperation_rollupinventory_projection
- Pinned
source_target_kindset:managed_environmentgoverned_subjectprovider_connectionoperation_run
- Why: the repo memory and readiness rules require exact inventories when a package introduces a bounded semantic family. Keeping the set explicit prevents later prep or implementation drift.
- Alternatives considered:
- open-ended family strings with only prose guidance: rejected because readiness analysis can flag vague inventories as premature
- predeclaring package-output or multi-provider families now: rejected because those values are future-facing and not required by current repo truth
Decision 3: Standardize detector_key and control_key placement without creating new registries
- Decision:
284standardizes wheredetector_keyandcontrol_keylive in the shared descriptor and touched view models, but it does not introduce a closed detector catalog or a broader control-catalog expansion. - Why: the repo already has working canonical-control resolution. The real problem is inconsistent placement and summary wording, not the absence of a second registry.
- Alternatives considered:
- detector catalog or detector registry: rejected because it is future-facing and wider than current repo truth
- control-catalog expansion in the same slice: rejected because
284is about artifact-source semantics, not broader control governance
Decision 4: Keep provider-native fields as nested detail
- Decision:
finding_type,report_type, rawpolicy_type, provider object types, report domains, and Graph-facing detector detail remain provider-owned nested evidence. - Why: the current release is still Microsoft-first in runtime. The goal is to stop using provider-native fields as top-level platform truth, not to erase them.
- Alternatives considered:
- full generic rewrite of provider detail: rejected because it would over-abstract current repo truth
- leaving provider-native fields as top-level summary nouns: rejected because that preserves the current artifact interpretation drift
Decision 5: Inventory type separation should live beside existing inventory metadata helpers
- Decision: keep
canonical_type,provider_object_type, andprovider_display_typeclose toInventoryPolicyTypeMetaand the inventory read model rather than creating a new cross-product taxonomy engine. - Why:
InventoryPolicyTypeMetais already the narrowest place where inventory type meaning is derived and displayed. - Alternatives considered:
- new global type registry for every artifact family: rejected because it is broader than the current inventory-only problem
- leaving inventory on raw
policy_type: rejected because it would keep one of the explicit 284 acceptance gaps alive
Decision 6: Legacy rows should normalize on read, not through backfill
- Decision: preserve the candidate's no-backfill rule and normalize legacy artifacts on read or during future writes only.
- Why: the repo is still pre-production, but
284does not need a backfill program to deliver operator and contributor value. Read-time normalization is enough for current artifact families. - Alternatives considered:
- historical backfill migration: rejected because it adds risk and operational work without increasing the core value of the slice
- leaving legacy rows unreadable until rewritten: rejected because acceptance requires current Microsoft outputs to remain valid as Microsoft provider sources
Decision 7: Support or AI alignment stays bounded and package runtime remains deferred
- Decision: if
SupportDiagnosticBundleBuilder,AiUseCaseCatalog, or adjacentsource_familyconsumers are touched, align them to the pinned source-family nouns only. Keeppackage_run_idoptional and nullable; do not create package-execution runtime. - Why: the candidate explicitly says later package execution should be able to build on the descriptor, but
284must not implement package runtime now. - Alternatives considered:
- package-output or package-run implementation in the same slice: rejected because it is adjacent future work
- ignoring existing
source_familyconsumers entirely: rejected because they can become a second naming drift if touched later without the 284 vocabulary
Implementation prerequisites present in current repo truth
- Spec
281provider-neutral provider-connection scope is already present in repo runtime. - Spec
282workspace-first artifact surfaces are already present in repo runtime. - Spec
283provider capability registry is already present in repo runtime.
Because those inherited prerequisites are already present on the current branch, the remaining blocker is narrower: runtime work for 284 stays prerequisite-blocked until SCOPE-001 ownership compliance for the touched tenant-owned artifact tables is satisfied or explicitly excepted.
Explicit non-goals carried into design
- no new artifact table or ledger
- no provider framework
- no detector registry
- no full control-catalog expansion
- no package runtime or package-output surfaces
- no historical backfill
- no workspace-first RBAC redesign
- no copy or localization neutralization