400 lines
19 KiB
Markdown
400 lines
19 KiB
Markdown
# Warning Signal And Presentation Audit Plan
|
|
|
|
## Purpose
|
|
|
|
This document defines the audit required before redesigning Notarius warning
|
|
semantics and presentation. The audit must explain why an ordinary successful
|
|
D&D run can produce dozens of warnings, distinguish actionable degradation
|
|
from routine diagnostic observations, and recommend a bounded, deterministic
|
|
warning contract that operators will actually review.
|
|
|
|
This is an audit plan, not a feature design or implementation plan. The audit
|
|
must first establish the current producers, propagation behavior, empirical
|
|
volume, public contracts, and compatibility constraints. The completed audit
|
|
selects the target behavior from those findings; `implementation.md` owns the
|
|
subsequent implementation sequence.
|
|
|
|
## Context
|
|
|
|
Notarius currently uses one `contracts.Warning` shape—optional `scope`, required
|
|
`reason_code`, and required `message`—for findings from modules, validators,
|
|
normalizers, reference preparation, retries, and framework policy. Accepted
|
|
warnings are collected by the pipeline, counted by the CLI and machine-readable
|
|
run receipt, and published as a flat array in `warnings.json`.
|
|
|
|
The architecture already guarantees deterministic public ordering and bounded
|
|
warning production at several local boundaries. Recent validation work also
|
|
gave incomplete validation explicit provenance. Those guarantees must be
|
|
preserved. The observed problem is signal quality and aggregate volume: a
|
|
successful run can report many warnings even when most describe routine,
|
|
expected cleanup or weak heuristic observations rather than conditions that
|
|
require operator action.
|
|
|
|
Initial repository inspection identifies several likely warning families:
|
|
|
|
- D&D source-relatedness validators can produce one warning per artifact
|
|
record when a contextual name is not found in its cited text;
|
|
- deterministic normalizers report canonicalization, whitespace cleanup,
|
|
ordering changes, source-reference cleanup, and duplicate consolidation;
|
|
- semantic registry reconciliation reports discarded proposals, exhausted
|
|
fallback, and duplicate consolidation;
|
|
- optional reference materialization can report unavailable or skipped
|
|
reference inputs;
|
|
- the producer-attempt state machine reports validators that exhausted their
|
|
execution budgets under `warn_continue`; and
|
|
- producer modules can return their own warnings, which are promoted only from
|
|
the terminal accepted or rejected attempt.
|
|
|
|
These are audit hypotheses. The audit must verify exact behavior and frequency
|
|
from current code and representative runs rather than assume that every family
|
|
is noisy or incorrectly classified.
|
|
|
|
## Policy And Architecture Constraints
|
|
|
|
The audit and its recommendations must follow:
|
|
|
|
- `docs/policy/architecture.md` for module/framework ownership, deterministic
|
|
ordering, validation semantics, durable provenance, and sensitive-data
|
|
boundaries;
|
|
- `docs/policy/documentation.md` for canonical documentation ownership and the
|
|
distinction between current and future behavior;
|
|
- `docs/policy/testing.md` for risk-based, behavior-oriented test
|
|
recommendations; and
|
|
- ADR-0014 for the distinction between semantic rejection, validator failure,
|
|
correction guidance, and durable diagnostic provenance.
|
|
|
|
In particular:
|
|
|
|
- modules and validators may report findings, but the framework and output
|
|
boundaries own aggregation and presentation;
|
|
- reducing warning volume must not silently change artifact acceptance,
|
|
validation policy, retry behavior, rejection behavior, or process exit
|
|
status;
|
|
- genuine validator execution failures and validation-incomplete outcomes must
|
|
remain visible and auditable;
|
|
- public ordering must remain deterministic despite concurrent lane execution;
|
|
- aggregation must be bounded and must not leak raw model responses,
|
|
correction guidance, credentials, private reference content, or unnecessary
|
|
transcript text; and
|
|
- detailed diagnostics may move to a more appropriate durable or debug surface,
|
|
but must not be discarded when they are needed to understand a lossy or
|
|
degraded result.
|
|
|
|
## Audit Objectives
|
|
|
|
The audit must answer five questions.
|
|
|
|
1. Which code paths produce warnings, under what conditions, and with what
|
|
expected multiplicity?
|
|
2. How are warnings cloned, bounded, replayed, ordered, promoted, persisted,
|
|
counted, and presented from their producer through the final CLI and output
|
|
bundle?
|
|
3. Which warnings identify actionable degradation or data-quality risk, and
|
|
which merely describe routine successful transformations or advisory
|
|
heuristics?
|
|
4. What aggregation and presentation model would materially reduce operator
|
|
noise without hiding genuine failures, lossy fallback, or incomplete
|
|
validation?
|
|
5. Which proposed changes affect only presentation, and which would alter a
|
|
public receipt, durable output contract, validation invariant, or other
|
|
compatibility boundary?
|
|
|
|
## Scope
|
|
|
|
### Warning Producers
|
|
|
|
Inventory every production warning constructor and direct warning literal
|
|
under `internal/`. Include warnings originating from:
|
|
|
|
- input, chunk, extract, merge, normalize, and output modules;
|
|
- typed, chunk, and serialized validators;
|
|
- semantic reconciliation and normalizer fallback;
|
|
- external and generated reference materialization;
|
|
- chunk-plan and checkpoint reuse or fallback;
|
|
- producer-attempt exhaustion and validation-incomplete continuation;
|
|
- pipeline orchestration and cancellation handling; and
|
|
- CLI or publication logic, if it creates warnings rather than only presenting
|
|
them.
|
|
|
|
Do not infer completeness from one textual search. Inspect shared constructors,
|
|
returned result types, reason-code constants, registration paths, and tests that
|
|
exercise warning behavior.
|
|
|
|
### Warning Propagation
|
|
|
|
Trace each warning family through:
|
|
|
|
- stage result and validation result contracts;
|
|
- producer attempts, including abandoned attempts, semantic retries, structural
|
|
retries, terminal rejection, and `warn_continue`;
|
|
- concurrent lane collection and stable public ordering;
|
|
- merge and normalize continuation;
|
|
- chunk-plan caching and checkpoint recording or hydration;
|
|
- ordered step output merging and generated-reference handoff;
|
|
- `RunOutput`, run manifests, validation summaries, debug records, and CLI
|
|
result construction;
|
|
- `warnings.json`, `manifest.json`, the run-result receipt, human-readable
|
|
standard error, and debug bundles.
|
|
|
|
For every boundary, determine whether warnings are copied, filtered,
|
|
deduplicated, bounded, summarized, replayed from reusable state, or dropped.
|
|
Pay particular attention to amplification across chunks, lanes, validators,
|
|
retries, and resumed runs.
|
|
|
|
### D&D Warning Semantics
|
|
|
|
Review every implemented D&D artifact family. At minimum, distinguish:
|
|
|
|
- evidence/source-relatedness advisories;
|
|
- deterministic canonicalization or whitespace changes;
|
|
- order and source-reference normalization;
|
|
- exact and semantic duplicate consolidation;
|
|
- unresolved catalog or registry membership;
|
|
- semantic-reconciliation proposal failure or fallback; and
|
|
- validator execution incompleteness.
|
|
|
|
Determine whether the reason-code vocabulary is consistent across artifact
|
|
families, whether scopes are sufficiently contextual, and whether equivalent
|
|
conditions produce near-duplicate warnings with different codes or prose.
|
|
|
|
### Public And Operator Surfaces
|
|
|
|
Review the implemented contracts and documentation for:
|
|
|
|
- CLI success output and warning-count output;
|
|
- `notarius.run-result.v1` and its `warning_count` and validation fields;
|
|
- `warnings.json` and the published JSON index;
|
|
- manifest validation summaries and rejection summaries;
|
|
- debug summary and detailed debug artifacts; and
|
|
- downstream subprocess guidance, especially the complete D&D consumer
|
|
workflow.
|
|
|
|
Identify which surfaces are intended for immediate operator attention, durable
|
|
machine consumption, forensic detail, or debugging. Record any places where
|
|
the same flat count or warning list is being asked to serve incompatible
|
|
audiences.
|
|
|
|
### Tests And Documentation
|
|
|
|
Inventory tests that protect warning production, bounds, ordering, retry
|
|
promotion, checkpoint replay, JSON publication, receipt counts, and CLI stream
|
|
behavior. Identify meaningful gaps, redundant exact-prose assertions, and tests
|
|
that would unnecessarily obstruct a taxonomy or aggregation redesign.
|
|
|
|
Review `docs/cli.md`, `docs/config.md`, `docs/operations.md`,
|
|
`docs/integrations/json-output.md`, `docs/integrations/run-result.md`,
|
|
`docs/consumers/`, and relevant internal documentation for current warning
|
|
claims. Record the canonical document that would own each future contract
|
|
change; do not rewrite those documents during the audit.
|
|
|
|
## Out Of Scope
|
|
|
|
The audit must not:
|
|
|
|
- implement warning filtering, severity levels, aggregation, or new CLI flags;
|
|
- change validator decisions, default chains, retry budgets, or terminal
|
|
validation policy;
|
|
- suppress warnings merely to meet a numerical target;
|
|
- redesign rejections, errors, logs, metrics, or debug bundles except where
|
|
their boundary with warnings must be clarified;
|
|
- add the planned D&D combat-scene semantic validator;
|
|
- create deterministic tests that assert one exact global warning count for
|
|
all future runs; or
|
|
- use live paid LLM calls as part of the default automated test suite.
|
|
|
|
## Inventory Method
|
|
|
|
Create a warning inventory with one row per semantically distinct production
|
|
condition. Each row should record:
|
|
|
|
| Field | Required analysis |
|
|
| --- | --- |
|
|
| Producer | Package, function, module or validator key, stage, and artifact family. |
|
|
| Trigger | Exact condition that emits the warning and whether it follows successful mutation, heuristic doubt, fallback, or failure. |
|
|
| Identity | Reason code, scope format, and whether either is stable enough for aggregation or machine use. |
|
|
| Multiplicity | Maximum per record, chunk, lane, validator, attempt, step, and run. |
|
|
| Lifecycle | Whether abandoned attempts are discarded, terminal warnings promoted, and cached or checkpointed warnings replayed. |
|
|
| Consequence | Whether data changed, evidence is questionable, output is incomplete, fallback occurred, or no externally meaningful consequence exists. |
|
|
| Actionability | What an operator can reasonably do in response, if anything. |
|
|
| Surfaces | CLI, receipt count, `warnings.json`, manifest, rejection, checkpoint, or debug presence. |
|
|
| Bounds | Existing local caps, message limits, omission records, and any missing aggregate bound. |
|
|
| Sensitivity | Whether scope or message can contain source-derived or otherwise sensitive content. |
|
|
| Coverage | Existing tests and the meaningful regression risk they protect. |
|
|
|
|
Treat different reason codes that represent the same operator condition as
|
|
potential consolidation candidates, but do not merge them in the audit
|
|
document without explaining lost diagnostic information.
|
|
|
|
## Propagation Analysis
|
|
|
|
Produce a compact propagation map from warning creation to each terminal
|
|
surface. The analysis must explicitly verify:
|
|
|
|
- only the terminal candidate's warnings are promoted after retries;
|
|
- whether rejected candidates retain warnings and where;
|
|
- whether `warn_continue` creates one warning per exhausted validator and how
|
|
that relates to validation summaries;
|
|
- whether cached chunk plans or hydrated checkpoints replay historical warnings
|
|
into the current run;
|
|
- whether the same warning can be appended at more than one handoff boundary;
|
|
- how concurrent completion is reordered before publication;
|
|
- whether local per-module caps compose into an unbounded or excessively large
|
|
run-level result; and
|
|
- whether warning counts on stderr, receipts, manifests, and `warnings.json`
|
|
refer to exactly the same collection.
|
|
|
|
Any suspected duplicate append or unstable ordering is a correctness finding,
|
|
not merely a presentation concern.
|
|
|
|
## Empirical D&D Run Analysis
|
|
|
|
Static inspection must be supplemented with representative run evidence. Use
|
|
at least:
|
|
|
|
- one ordinary successful complete D&D run known to produce high warning
|
|
volume;
|
|
- one smaller maintained example or synthetic run;
|
|
- one run with semantic registry reconciliation activity;
|
|
- one run with a validator execution failure allowed through
|
|
`warn_continue`, using an offline test double where practical; and
|
|
- one retrying producer case to verify abandoned-attempt warning treatment.
|
|
|
|
For real campaign runs, analyze only bounded metadata unless the operator
|
|
explicitly provides source content for review. Record counts grouped by stage,
|
|
lane, module or validator, reason code, and scope family. Also record unique
|
|
reason-code count, repeated-message count, maximum group size, validation
|
|
status, rejected-output count, and whether each warning led to a plausible
|
|
operator action.
|
|
|
|
Compare the same logical run under ordinary execution and checkpoint resume
|
|
when practical. The audit must distinguish warning volume caused by actual data
|
|
conditions from volume caused by orchestration or replay.
|
|
|
|
Do not make a model-quality judgment solely from warning frequency. Manually
|
|
inspect a bounded sample from each high-volume reason code to estimate false
|
|
positive rate and operational value.
|
|
|
|
## Classification Rubric
|
|
|
|
Classify each warning condition along independent dimensions rather than force
|
|
an immediate single severity enum:
|
|
|
|
- **result impact:** none, routine mutation, lossy mutation, uncertain data
|
|
quality, fallback, or incomplete validation;
|
|
- **operator action:** none, informational review, configuration or reference
|
|
correction, source/model review, or rerun required;
|
|
- **scope:** record, chunk, lane, step, pipeline, or infrastructure;
|
|
- **persistence need:** top-level attention, durable detail, debug-only detail,
|
|
or metric/trace candidate; and
|
|
- **confidence:** deterministic fact, heuristic advisory, or execution failure.
|
|
|
|
The audit should then test whether a small durable taxonomy can represent the
|
|
meaningful combinations. A promising starting hypothesis is that top-level
|
|
operator warnings should be limited to actionable degradation, incomplete
|
|
validation, lossy fallback, and material data-quality risk, while routine
|
|
successful normalization observations remain available as lower-level durable
|
|
diagnostics. The audit must validate or revise that hypothesis from evidence.
|
|
|
|
## Design Questions The Audit Must Resolve
|
|
|
|
The findings must give a recommendation, with at least one viable alternative
|
|
and tradeoffs, for each of these questions:
|
|
|
|
1. Should warning severity or disposition become an explicit contract field,
|
|
or should stable reason-code metadata drive presentation policy outside the
|
|
warning payload?
|
|
2. Should `warnings.json` remain the complete durable detail while the CLI and
|
|
receipt expose an aggregated actionable summary, or should durable warnings
|
|
themselves be separated from routine observations?
|
|
3. Where should global deduplication and aggregation live so modules retain
|
|
semantic ownership but concurrent pipeline results remain deterministic?
|
|
4. What is the stable aggregation key: reason code, stage/lane/module identity,
|
|
normalized scope, message template, or an explicit structured grouping key?
|
|
5. How should bounded samples and omitted counts be represented without
|
|
converting a summary record into another warning that inflates the count?
|
|
6. Should `warning_count` continue to mean the length of `warnings.json`, or
|
|
should a new receipt or schema field distinguish actionable warning groups
|
|
from detailed observations?
|
|
7. Which normalization changes are sufficiently lossy or surprising to remain
|
|
warnings, and which are ordinary provenance that belongs in manifest or
|
|
debug data?
|
|
8. Should heuristic source-relatedness findings remain warnings, become
|
|
grouped data-quality advisories, or be strengthened into configurable
|
|
validation decisions only after demonstrated precision?
|
|
9. How should warnings loaded from checkpoints be identified or aggregated
|
|
relative to newly produced warnings?
|
|
10. Does the chosen target alter durable or validation semantics enough to
|
|
require a new ADR or a versioned run-result/output contract?
|
|
|
|
## Required Audit Deliverable
|
|
|
|
Write the completed findings to `docs/roadmap/audit.md`. It should contain:
|
|
|
|
1. an executive assessment of current warning quality and risk;
|
|
2. the complete warning-producer inventory;
|
|
3. the warning propagation and surface map;
|
|
4. empirical measurements and bounded representative samples;
|
|
5. findings ranked by operator impact, correctness risk, and implementation
|
|
leverage;
|
|
6. a recommended target taxonomy and presentation model;
|
|
7. compatibility, documentation, ADR, and migration implications;
|
|
8. implementation implications and dependencies sufficient to support a
|
|
separate implementation plan; and
|
|
9. open decisions only where repository evidence cannot support a responsible
|
|
recommendation.
|
|
|
|
Each finding should identify the supporting code paths, tests, documentation,
|
|
and run evidence. Separate observed facts from recommendations and avoid
|
|
changelog or development-history framing.
|
|
|
|
## High-Level Audit Sequence
|
|
|
|
The detailed execution sequence should be written separately if needed. At a
|
|
high level, perform the audit in this order:
|
|
|
|
1. **Static inventory:** enumerate warning producers, reason codes, scopes,
|
|
bounds, and existing tests.
|
|
2. **Propagation audit:** trace promotion, ordering, replay, persistence,
|
|
counting, and presentation across the framework and CLI.
|
|
3. **Empirical analysis:** measure representative D&D runs and inspect bounded
|
|
samples from high-volume warning groups.
|
|
4. **Classification:** apply the rubric, identify duplicate concepts and
|
|
misplaced routine diagnostics, and evaluate public-contract options.
|
|
5. **Synthesis:** rank findings and recommend a decision-complete target for a
|
|
subsequent feature roadmap.
|
|
|
|
Static inventory and propagation may be performed as separate focused agent
|
|
prompts. Empirical analysis should be isolated because it may require operator
|
|
artifacts or opt-in provider execution. Classification and synthesis should
|
|
consume the earlier written evidence rather than rediscover the repository.
|
|
|
|
## Validation Of The Audit
|
|
|
|
Before considering the audit complete, verify that:
|
|
|
|
- every production warning literal or constructor is represented in the
|
|
inventory;
|
|
- every reason code observed in representative `warnings.json` files maps to a
|
|
known producer or is recorded as an unexplained finding;
|
|
- counts agree across the runner result, CLI receipt, stderr summary, and
|
|
published warning collection for each sampled run;
|
|
- retry, rejection, incomplete-validation, cache, checkpoint, concurrency, and
|
|
ordered-step paths are covered;
|
|
- recommended aggregation preserves deterministic ordering and bounded memory;
|
|
- recommendations distinguish warnings from errors, rejections, validation
|
|
summaries, logs, and debug diagnostics;
|
|
- no recommendation hides a condition that changes output completeness or
|
|
correctness;
|
|
- public compatibility and schema-version consequences are explicit; and
|
|
- proposed tests protect meaningful behavior without asserting incidental
|
|
prose or one permanently fixed global warning count.
|
|
|
|
## Completion Criteria
|
|
|
|
The audit is ready to become a feature roadmap when it can explain the current
|
|
high warning count quantitatively, identify the dominant producers and any
|
|
amplification defects, classify every warning family by consequence and
|
|
actionability, and recommend where each class should appear. The findings must
|
|
be specific enough that a later roadmap can define the target contract without
|
|
repeating the discovery work.
|