You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
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 jsonontests/fixtures/workshop/real-world/overpy-pixelart.ws(195 KB, zero findings), wright 0.2.41:rulesconfigprogram+input_identityfindings[])Of the
rulesblock, 2232 bytes areknownLimitsprose.Separately,
{"op":"lintRules"}on the same input returns 7798 bytes — the same rule metadata and effective configuration, as its own operation.So
lintinlines the entirelintRulesresponse 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
lintcall 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
lintRulesoperation already exists, so the inlined copy is not the only way to obtain this data.The decision
Removing or reducing
rulesin thelintresult is a breaking change towright-result/v1and to thelintagent operation.docs/agent-contract.mdstates the rule forwright-agent/v1: changing a field's meaning requires a new major contract.wright-result/v1has 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.lintkeeps per-rule id and effective severity — enough to interpret a finding — and drops summary, tags, evidence, andknownLimits, whichlintRulesalready serves. Best outcome per byte, and it removes the duplication rather than hiding it. Requires either an approved exception forwright-result/v1and thelintoperation, or a v2 contract.An adjacent question, answerable independently: should
wright-result/v1have a written evolution policy likewright-agent/v1does? Its absence is why option C has no defined path today.Not in question
configin thelintresult. It is small (481 bytes) and it is what makes a finding's severity interpretable.lintRulesitself. Whatever is decided, it stays the authoritative place for full rule metadata.Dependencies / ownership