15 KiB
Minimal Evidence Context Implementation Plan
Objective
Implement the target state defined in
Minimal Evidence Context: retain the optional
evidence-context.json output and its existing configuration while replacing
its provenance-heavy payload with the ordered, deduplicated union of selected
generic source units.
This plan intentionally changes the existing v1 contract in place. Notarius is pre-release, so do not add legacy decoding, schema-version branching, migration, dual publication, or other backward-compatibility machinery.
Global Implementation Rules
Apply these rules in every stage:
- Follow
docs/policy/architecture.md,docs/policy/documentation.md, anddocs/policy/testing.md. - Treat the normalized lane artifacts as authoritative for citations and the source document as authoritative for source-unit content.
- Preserve the typed evidence-projection boundary. Generic code must not inspect domain JSON or depend on D&D artifact types.
- Preserve the logical filename
evidence-context.json, artifact kindsource/evidence-context, media typeapplication/json, schema IDnotarius.source.evidence_context, schema namenotarius_source_evidence_context_v1, and schema versionv1. - Preserve the current configuration keys, validation, lane allowlist
semantics, and default
window_unitsvalue. - Do not introduce a payload wrapper. The durable JSON value is a top-level
array of generic source units; the empty value is
[]. - Preserve source-unit fields and metadata exactly as represented in the validated generic source document. Add no evidence-context-specific fields.
- Do not add byte-count, token-count, or compression-ratio tests. Test the structural boundedness and behavioral contract instead.
- Use focused tests while iterating and leave the repository compiling and its relevant test suites passing at the end of every stage.
Stage 1: Replace The Core Evidence-Context Contract
Goal
Replace the context/provenance model with a strict top-level source-unit array and simplify construction to select the union of expanded source ranges.
Required Changes
- Update
internal/framework/evidencecontext/model.go:- represent
Documentas the durable collection ofsource.SourceUnitvalues that serializes directly as a JSON array; - retain the existing artifact identity constants;
- reduce
BuildRequesttoSource,WindowUnits, and a flat collection of projectedSourceRefs; - remove
Context,EvidenceRef,LaneEvidence, and any other types whose only purpose was durable lane attribution or context grouping.
- represent
- Update
internal/framework/evidencecontext/build.go:- validate the window and complete source document, including its digest;
- validate every projected source reference against the source index;
- convert referenced endpoints to source positions, expand and clamp them, and merge their union;
- append owned copies of the selected source units once in document-position order;
- return an initialized empty document when there are no references;
- remove sorting keys and helpers that exist only to order lane attribution or evidence records.
- Update
internal/framework/evidencecontext/codec.goandinternal/framework/evidencecontext/assets/schemas/source_evidence_context.v1.json:- define the root schema as an array of strict source-unit objects;
- preserve the existing source-unit contract: required
id,kind,text, andref, with optional open-ended source-ownedmetadata; - ensure decode rejects
null, wrapper objects, malformed units, unknown fixed unit/reference fields, invalid self-references, and noncanonical documents; - ensure encode and decode own all slice and nested metadata values and
serialize an empty document as
[]; - remove canonicalization logic used only by the deleted wrapper and context structures.
- Replace the fixture in
internal/framework/evidencecontext/testdata/source_evidence_context.v1.jsonwith a compact top-level unit array. - Rewrite
internal/framework/evidencecontext/evidencecontext_test.goaround durable behavior:- cover expanded overlapping and adjacent ranges, boundary clamping, repeated references, and non-monotonic unit IDs;
- prove that the output is source-ordered, contains each selected source unit once, and never invents a unit;
- prove preservation and ownership of source-unit metadata;
- cover empty-array encoding and strict invalid-input rejection;
- retain artifact identity and deterministic round-trip coverage without testing deleted internal structures.
- Adapt
internal/framework/pipeline/evidence_output.goso it flattens the typed references from prepared selected lanes into the new build request. Preserve all existing checks for duplicate accepted lane outputs, source and artifact-kind compatibility, codec decoding, and evidence projection failures. - Adapt the pipeline debug summary and its use in
runner.goas necessary:- calculate selected lanes, window size, and source digest from the prepared plan and source document rather than the payload;
- report the emitted unit count directly;
- remove
context_count; - keep source text and unit metadata out of debug summaries.
- Rewrite the focused tests in
internal/framework/pipeline/evidence_output_test.goto assert the new payload while preserving coverage of selected accepted outputs, absent and rejected lanes, incompatible artifacts, failure propagation, ownership, checkpoint reconstruction, opt-in behavior, and redacted debug reporting.
Acceptance Criteria
- The evidence-context package has no durable or internal model for context groups, lane attribution, or published evidence references.
- Its codec accepts and emits only the new top-level array contract.
- Its builder returns the exact ordered union of source units selected by the expanded validated ranges.
- Pipeline construction still obtains references exclusively through prepared typed evidence projections.
- The payload remains absent when publication is not configured and is
[]when enabled with no contributing evidence. - Focused framework tests pass.
Validation
gofmt -w internal/framework/evidencecontext internal/framework/pipeline/evidence_output.go internal/framework/pipeline/evidence_output_test.go
go test ./internal/framework/evidencecontext ./internal/framework/pipeline
Prompt Scope
This is one coherent but substantial gpt-5.6-terra prompt. Keep the work limited to the core contract, its pipeline construction boundary, and their focused tests; do not update generic JSON output tests, production integration tests, or documentation in this stage.
Stage 2: Update Output And Production Integration Coverage
Goal
Carry the revised artifact through the generic JSON output and representative assembled D&D workflows without changing publication or discovery semantics.
Required Changes
- Review
internal/modules/generic/output/json/encoder.goand retain the existing option decoding, default window, lane validation, logical filename, artifact identity checks, pretty JSON publication, andindex.jsondescriptor. Change production code only where it assumes the old payload. - Rewrite evidence-context fixtures and assertions in
internal/modules/generic/output/json/encoder_test.go:- validate and publish a top-level unit array;
- retain descriptor, omission, strict artifact validation, and content-nondisclosure failure tests;
- remove expectations for wrapper fields or contexts.
- Update evidence assertions in the representative integration and CLI
contract tests, including:
internal/modules/integration/dnd_npc_grounded_test.go;internal/modules/integration/dnd_location_registry_runner_test.go;internal/cli/dnd_enemy_events_contract_test.go; and- any additional test located by searching for
evidence-context,EvidenceContext,Contexts,context_count, or old fixture fields.
- Ensure the integration assertions protect the behavior that matters:
- only selected accepted lanes contribute references;
- multiple lanes and overlapping windows produce one ordered unit union;
- non-monotonic unit IDs do not change source-position order;
- scene-description selection remains explicit;
- the output descriptor remains pipeline-wide rather than a lane artifact.
- Remove obsolete helpers and fixtures that only inspect old context groups or per-lane evidence records. Do not preserve compatibility helpers.
Acceptance Criteria
- The generic JSON encoder publishes the new payload under the existing filename and descriptor.
- Maintained integration and CLI workflows observe a deduplicated array of unchanged source units.
- No production code or test outside the archived roadmap refers to deleted payload fields or types.
- Focused output, integration, and CLI tests pass.
Validation
gofmt -w internal/modules/generic/output/json internal/modules/integration internal/cli
go test ./internal/modules/generic/output/json ./internal/modules/integration ./internal/cli
rg -n 'context_ref|evidence_refs|selected_lanes|source_digest|context_count|\.Contexts\b' internal --glob '*.go' --glob '*.json'
Review every remaining search result rather than requiring the search to be
empty: source_digest and similar terms are valid in unrelated contracts and
content-free debug state.
Prompt Scope
This stage is appropriately sized for one gpt-5.6-terra prompt. It owns output and assembled-workflow adaptation only; do not revise public documentation in this stage.
Stage 3: Rewrite The Canonical Documentation
Goal
Make all current documentation describe the implemented minimal evidence excerpt, with the durable contract defined in one canonical location.
Required Changes
- Rewrite
docs/integrations/evidence-context.mdas the canonical durable contract:- retain identity, discovery, filename, and optionality;
- define the top-level source-unit array and empty-array behavior;
- define typed-evidence selection, window expansion, union, deduplication, source-position ordering, and unchanged-unit semantics;
- state that the excerpt can include at most every generic source unit once but has no byte/token-size guarantee;
- state that lane artifacts remain authoritative for citations and the excerpt contains no lane attribution;
- preserve sensitivity and consumer validation guidance.
- Update
docs/config.mdonly where it describes the result ofevidence_context. Preserve the existing keys, validation rules, and default window. Link to the integration contract for payload details. - Update
docs/integrations/json-output.mdto describe the logical file as the optional selected source-unit excerpt without duplicating its schema. - Update
docs/consumers/subprocess.mdso consumers decode the array and use lane artifacts—not the excerpt—for authoritative citations and lane provenance. - Update
docs/operations.md,docs/internal/modules.md, and any other current documentation that describes context groups, provenance records, or the old wrapper. Keep operational sensitivity guidance and internal ownership in their canonical documents. - Review
examples/dnd-complete.config.yml. Retain the currentevidence_contextconfiguration and lane list unless repository inspection reveals an independently stale module key. Do not add a new example solely for this unchanged configuration surface. - Do not modify ADRs or add a new ADR. Do not rewrite archived audit history to match current behavior.
Acceptance Criteria
docs/integrations/evidence-context.mdis the sole canonical definition of the payload.- Other current documents accurately summarize their audience-specific aspect and link to the contract instead of duplicating it.
- No current documentation claims that
evidence-context.jsoncontains context groups, evidence-reference records, lane attribution, source-level wrapper metadata, or a guaranteed byte/token reduction. - The maintained complete example remains valid and reflects implemented configuration.
Validation
rg -n 'context_ref|evidence_refs|selected_lanes|context_count' README.md docs examples --glob '!docs/roadmap/**' --glob '!docs/adr/**'
go test ./internal/config ./internal/modules/generic/output/json ./internal/cli
Inspect any search matches for legitimate historical or unrelated use. If the repository provides no automated Markdown link checker, manually verify every link changed in this stage.
Prompt Scope
This documentation migration is small enough for one gpt-5.6-terra prompt.
Stage 4: Final Verification And Cleanup
Goal
Verify the complete feature across package, integration, documentation, and repository boundaries, then remove only obsolete implementation debris found by that verification.
Required Changes
- Review the diff against
docs/roadmap/evidence-context.mdand confirm every acceptance criterion is implemented. - Search the non-archived repository for deleted Go types, old JSON fields, obsolete fixture shapes, and statements that describe the former contract.
- Confirm the schema, codec, builder, pipeline request, debug summary, output encoder, index descriptor, example configuration, and integration contract agree on the final shape and identities.
- Run formatting and the complete offline validation suite.
- Make only narrowly scoped corrections required by failed checks or direct roadmap divergence. Do not introduce unrelated refactors or new features.
- Leave the active roadmap documents in place for post-implementation review; retirement occurs only when separately requested after the implementation is accepted.
Acceptance Criteria
- All roadmap acceptance criteria are satisfied with no legacy compatibility path.
- No current code, schema, fixture, example, or documentation depends on the former wrapper/context/provenance payload.
- The structural bound is protected: the artifact contains only distinct, unchanged units from the source document in source order.
- Repository formatting, tests, vet, and build all pass.
- The worktree contains only intentional feature changes.
Validation
gofmt -w internal/framework/evidencecontext internal/framework/pipeline internal/modules/generic/output/json internal/modules/integration internal/cli
go test ./...
go vet ./...
go build ./cmd/notarius
git diff --check
git status --short
Prompt Scope
This verification pass is small enough for one gpt-5.6-terra prompt. If it uncovers a material unrelated defect, report it separately instead of widening this feature.