response_format: "concise" drops influence and resolved_by, so the dynamic-influence disclosure is invisible in the cheapest format we ship #139

Closed
opened 2026-09-05 10:07:14 +02:00 by buildagent · 0 comments
Member

Found while building #51's dynamic-influence questions, and pinned in that question's verification field because the question cannot be answered in concise at all.

The gap

concise reference rows omit influence and resolved_by. So the entire #77 provenance disclosure — whether a package's facts influenced a resolution, and which component — is absent from the format an agent is most likely to choose.

That is the wrong way round on two counts:

  1. Concise is the context-minimising format, which is exactly what a careful agent picks, and what #51's corpus tier measures with. The format chosen to save tokens is the one that silently drops the honesty fields.
  2. Absence reads as "no dynamic influence", not as "not reported". A ref resolved through a package bridge looks, in concise, exactly like one the builtin resolver decided alone. That is the absent-reads-as-negative shape this project refuses everywhere else — and #77's own acceptance says "an absent field from an old daemon is 'not reported,' never builtin_only". Here it is not an old daemon; it is the current one, on request.

Measured

find_callers on the XAML→C# bridge edge in the #51 fixture carries, in detailed:

influence.class      = "dynamic_influenced"
influence.component  = "de.h-dv.xaml/xaml"
resolved_by          = "bridge"

In concise, all three are gone, and nothing marks their omission.

Why it is not simply "concise means fewer fields"

Concise legitimately drops descriptive fields — doc, module, qualified name, column positions. influence and resolved_by are not descriptive; they qualify whether the row should be believed and by whose authority. The concise contract is "half the tokens, same answer", and this makes it a different answer.

Note the asymmetry that makes it worse: search_symbols' concise rows keep ref_count, which is a number whose meaning depends on the very provenance concise drops.

Options

  1. Keep influence.class and resolved_by in concise. Two short enum-ish strings per row; the cost is small against what concise already saves, and it is the only option under which a concise reply is not misleading.
  2. Keep them only when non-trivial — i.e. omit builtin_only and emit the other two classes. Cheapest, and consistent with "absent when there is nothing to report" used elsewhere. But it needs the absence to be documented as meaning builtin_only in this format, which is a special case a reader must know.
  3. Refuse concise for rows with dynamic influence, or carry a single block-level marker saying some rows were qualified and detailed is required to see it.

Option 1 is the honest default; option 2 is defensible if the semantics are written into the tool's contract and graded. Option 3 is worse than either.

Whatever is chosen, the budget rule applies: project_overview is at 4293 of 4300 and startup at 16,223 of 16,555, so trim rather than raise if a description grows.

Test

A ref resolved through a bridge, requested in both formats, asserting the two replies do not disagree about provenance. Mutation: drop the field from concise again and the test must go red on a real bridge-resolved row, not a hand-built one.

#77 (which specifies the influence classes and their absent-means-not-reported rule), #51 (found here), #99 and #101 (the same asymmetry between what one surface discloses and its neighbour does not).

Found while building #51's dynamic-influence questions, and pinned in that question's `verification` field because the question cannot be answered in concise at all. ## The gap `concise` reference rows omit **`influence`** and **`resolved_by`**. So the entire #77 provenance disclosure — whether a package's facts influenced a resolution, and which component — is absent from the format an agent is most likely to choose. That is the wrong way round on two counts: 1. **Concise is the context-minimising format**, which is exactly what a careful agent picks, and what #51's corpus tier measures with. The format chosen to save tokens is the one that silently drops the honesty fields. 2. **Absence reads as "no dynamic influence"**, not as "not reported". A ref resolved through a package bridge looks, in concise, exactly like one the builtin resolver decided alone. That is the absent-reads-as-negative shape this project refuses everywhere else — and #77's own acceptance says *"an absent field from an old daemon is 'not reported,' never `builtin_only`"*. Here it is not an old daemon; it is the current one, on request. ## Measured `find_callers` on the XAML→C# bridge edge in the #51 fixture carries, in **detailed**: ``` influence.class = "dynamic_influenced" influence.component = "de.h-dv.xaml/xaml" resolved_by = "bridge" ``` In **concise**, all three are gone, and nothing marks their omission. ## Why it is not simply "concise means fewer fields" Concise legitimately drops *descriptive* fields — doc, module, qualified name, column positions. `influence` and `resolved_by` are not descriptive; they qualify **whether the row should be believed and by whose authority**. The concise contract is "half the tokens, same answer", and this makes it a different answer. Note the asymmetry that makes it worse: `search_symbols`' concise rows keep `ref_count`, which is a number whose *meaning* depends on the very provenance concise drops. ## Options 1. **Keep `influence.class` and `resolved_by` in concise.** Two short enum-ish strings per row; the cost is small against what concise already saves, and it is the only option under which a concise reply is not misleading. 2. **Keep them only when non-trivial** — i.e. omit `builtin_only` and emit the other two classes. Cheapest, and consistent with "absent when there is nothing to report" used elsewhere. But it needs the *absence* to be documented as meaning `builtin_only` in this format, which is a special case a reader must know. 3. **Refuse concise for rows with dynamic influence**, or carry a single block-level marker saying some rows were qualified and detailed is required to see it. Option 1 is the honest default; option 2 is defensible if the semantics are written into the tool's contract and graded. Option 3 is worse than either. Whatever is chosen, the budget rule applies: `project_overview` is at 4293 of 4300 and startup at 16,223 of 16,555, so **trim rather than raise** if a description grows. ## Test A ref resolved through a bridge, requested in both formats, asserting the two replies do not disagree about provenance. Mutation: drop the field from concise again and the test must go red **on a real bridge-resolved row**, not a hand-built one. ## Related #77 (which specifies the influence classes and their absent-means-not-reported rule), #51 (found here), #99 and #101 (the same asymmetry between what one surface discloses and its neighbour does not).
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
h-dv/code-index#139
No description provided.