Summary
dependency-model's merge step drops the provenance fields that layer 1 works to establish.
merge_envelopes (dependency-model/scripts/depgraphlib/merge.py) keeps only categories, so
scan.confidence (high | partial | low), seeded_by, and each envelope's target never
reach the synthesis contract.
The consequence is that report — the terminal artifact a human actually reads — can never tell
that the scan behind a category was low-confidence. A partial scan and a thorough one render
identically.
Schema and code currently agree, so this is not a defect against the published contract. It is a
design gap: for a plugin whose entire discipline is provenance and evidence, losing the confidence
signal at the join is the one place that discipline breaks.
Surfaced by the whole-branch review of #49 (finding I8), which explicitly recommended filing it
rather than widening that branch — it is a schema addition and therefore a scope call.
Acceptance Criteria
Notes
Summary
dependency-model's merge step drops the provenance fields that layer 1 works to establish.merge_envelopes(dependency-model/scripts/depgraphlib/merge.py) keeps onlycategories, soscan.confidence(high|partial|low),seeded_by, and each envelope'stargetneverreach the
synthesiscontract.The consequence is that
report— the terminal artifact a human actually reads — can never tellthat the scan behind a category was low-confidence. A partial scan and a thorough one render
identically.
Schema and code currently agree, so this is not a defect against the published contract. It is a
design gap: for a plugin whose entire discipline is provenance and evidence, losing the confidence
signal at the join is the one place that discipline breaks.
Surfaced by the whole-branch review of #49 (finding I8), which explicitly recommended filing it
rather than widening that branch — it is a schema addition and therefore a scope call.
Acceptance Criteria
synthesis.schema.jsoncarries per-category provenance (at minimumconfidence; considerseeded_byandtarget), withcontract_versionbumped per the versioning policymerge_envelopespropagates those fields rather than discarding themfailedstatus already doesreportstates a category's scan confidence when it is nothigh, and never presents alow-confidence result as settled
references/contracts/examples/demonstrates a non-highcaseNotes
contract_versionis deliberately pinned at1.0.0until the feature is declaredproductionized. This change is the kind that should move it — confirm before bumping.
merge.py's existingfailed-never-downgrades rule is the precedent for how a per-categoryfield should behave when envelopes disagree.