Skip to content

Decide the lint envelope's fixed rule-metadata payload #431

Description

@e54-bot

Readiness: needs-decision. This issue records a measurement and three options. It is not ready for implementation: the preferred option changes a shipped contract, which is an owner decision. Do not implement by picking one.

Measurement

wright lint --format json on tests/fixtures/workshop/real-world/overpy-pixelart.ws (195 KB, zero findings), wright 0.2.41:

Result field Bytes Share
rules 7455 78%
config 481 5%
program + input_identity 218 2%
findings 2 ([]) 0%
total 9586

Of the rules block, 2232 bytes are knownLimits prose.

Separately, {"op":"lintRules"} on the same input returns 7798 bytes — the same rule metadata and effective configuration, as its own operation.

So lint inlines the entire lintRules response on every call. The payload is a fixed ~7.5 KB floor of static metadata that is identical across runs and independent of the project, and it dominates the response whenever a project is clean or nearly clean.

Why it matters

For an agent in a fix loop, every lint call re-reads the same 7.5 KB of rule descriptions it has already seen, competing with the source it is editing for context budget. The information it needs — what changed — is the smallest part of the response.

For CI, the same floor is written on every run.

The duplication is the point: a dedicated lintRules operation already exists, so the inlined copy is not the only way to obtain this data.

The decision

Removing or reducing rules in the lint result is a breaking change to wright-result/v1 and to the lint agent operation. docs/agent-contract.md states the rule for wright-agent/v1: changing a field's meaning requires a new major contract. wright-result/v1 has no documented evolution policy at all, which is itself worth settling here.

Options:

A. Leave it. No churn, no risk. The floor stays, and every agent lint call keeps paying it. Cheapest now, and it makes the 1.0 contract harder to change later, since freezing the envelope at 1.0 makes this permanent.

B. Opt-out flag, default unchanged. Additive and non-breaking on both contracts. But defaults are what agents and CI actually use, so the cost stays in place for nearly every caller while the project carries an extra option. Solves the measurement only for callers who already know about the problem.

C. Reduce the default and route the prose to lintRules. lint keeps per-rule id and effective severity — enough to interpret a finding — and drops summary, tags, evidence, and knownLimits, which lintRules already serves. Best outcome per byte, and it removes the duplication rather than hiding it. Requires either an approved exception for wright-result/v1 and the lint operation, or a v2 contract.

An adjacent question, answerable independently: should wright-result/v1 have a written evolution policy like wright-agent/v1 does? Its absence is why option C has no defined path today.

Not in question

  • Keeping config in the lint result. It is small (481 bytes) and it is what makes a finding's severity interpretable.
  • lintRules itself. Whatever is decided, it stays the authoritative place for full rule metadata.
  • The finding-selection work in Filter and group findings in the shared driver layer #430, which is additive and proceeds regardless.

Dependencies / ownership

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions