209 lines
13 KiB
Markdown
209 lines
13 KiB
Markdown
# Observe the client boundary before claiming token savings
|
||||
|
|
|
|||
|
|
Continues [#2016](https://github.com/morluto/rea/issues/2016) after the managed
|
|||
|
|
summary [PR #2413](https://github.com/morluto/rea/pull/2413) merged as
|
|||
|
|
`82cfcee19f18b0eeae9a330ba04e0411cdf85225`. That opt-in view has verified smaller
|
|||
|
|
delivery and complete-default migration, while its original real-model cohort
|
|||
|
|
does not establish token savings. This follow-up measures why raw reply bytes
|
|||
|
|
and aggregate model usage cannot be treated as interchangeable observations.
|
|||
|
|
|
|||
|
|
## Concrete diagnostic observation
|
|||
|
|
|
|||
|
|
An individual real Codex CLI 0.161.0 control uses frozen runtime
|
|||
|
|
`ae8051302b5834322fa00cfa31c968ae74ab6ed9`, the unchanged ShareX identity question,
|
|||
|
|
requested `gpt-5.6-terra` high and the same two enabled REA tools. A private
|
|||
|
|
diagnostic copy removes the original runner's explicit `--ephemeral` flag.
|
|||
|
|
Authentication/profile cleanup still runs; only selected tool/usage items are
|
|||
|
|
retained after filtering the owned rollout. Its source rollout SHA-256 is
|
|||
|
|
`d4df41d6187880d177f00b7533d85ad032c9c4ec502a39e7d5a566180e10461b` and the retained
|
|||
|
|
filtered-item SHA-256 is
|
|||
|
|
`0d5b4fb67c5674d1ba14ac32ae37e9a72b0368f4d9f5f9f81eb4d13193cda260`.
|
|||
|
|
The original whole-copy is removed; account metadata, world state, messages and
|
|||
|
|
internal passthrough are not retained in the filtered receipt.
|
|||
|
|
|
|||
|
|
Despite the requested `direct` configuration label, the observed client uses
|
|||
|
|
three JavaScript `exec` calls. First it filters `ALL_TOOLS` with a broad
|
|||
|
|
`/REA|reverse|artifact|managed|assembly|metadata/i` expression and prints matching
|
|||
|
|
metadata. The client reports truncation of a 164,005-token original output.
|
|||
|
|
This is the client's output measurement, not billed input or a complete inventory.
|
|||
|
|
Next it invokes complete managed inspection but selects requested normalized
|
|||
|
|
identity/classification fields before printing. Finally it invokes native-boundary
|
|||
|
|
inspection and prints selected fields. The actual original complete MCP replies
|
|||
|
|
remain available in the separate public-event transcript.
|
|||
|
|
|
|||
|
|
The persisted custom-tool output values are 41,704 / 2,154 / 13,489 UTF-8 bytes.
|
|||
|
|
These are the serialized recorded output **values**, not raw wire bytes or exact
|
|||
|
|
submitted model requests. The trace reports four per-response usage observations:
|
|||
|
|
|
|||
|
|
| Response | Input | Cached input | Output |
|
|||
|
|
| -------- | -----: | -----------: | -----: |
|
|||
|
|
| 1 | 10,400 | 0 | 132 |
|
|||
|
|
| 2 | 19,992 | 9,984 | 456 |
|
|||
|
|
| 3 | 21,242 | 19,200 | 251 |
|
|||
|
|
| 4 | 24,799 | 20,224 | 1,535 |
|
|||
|
|
|
|||
|
|
Their totals match public turn usage: 76,433 input, 49,408 cached, 27,025 uncached
|
|||
|
|
and 2,374 output, with 61.436 seconds observed wall time. Two MCP calls alone do
|
|||
|
|
not describe the client's discovery/execution rounds. This proves the observed
|
|||
|
|
control can project a complete result before printing it; it does not establish
|
|||
|
|
that every earlier control/candidate did the same, or attribute every token
|
|||
|
|
difference to discovery. The earlier `direct` label specifies requested client
|
|||
|
|
configuration, not a verified absence of an executor.
|
|||
|
|
|
|||
|
|
Initial transcript-capture attempts retained empty source lists because the
|
|||
|
|
original runner intentionally passed `--ephemeral`. A first private flag-removal
|
|||
|
|
edit missed its newline and failed; that candidate remains an unsuccessful
|
|||
|
|
capture attempt. The later corrected control is an individual diagnostic,
|
|||
|
|
not a comparable pair with that candidate. Other exploratory aggregates remain
|
|||
|
|
private and are not silently folded into the original four-trial cohort.
|
|||
|
|
|
|||
|
|
## Reproducible optional capture
|
|||
|
|
|
|||
|
|
`agent-trial.py --capture-tool-context` omits `--ephemeral` only for that explicitly
|
|||
|
|
selected temporary trial. Its default is unchanged. The profile still disappears
|
|||
|
|
in `finally`, including when capture fails. The capture reads only its owned
|
|||
|
|
`sessions/*.jsonl` records, rejects symlink sources, and retains:
|
|||
|
|
|
|||
|
|
- Custom/function tool calls and replies, preserving call IDs and exact values.
|
|||
|
|
- Per-response token counts and cumulative counts, with original response IDs.
|
|||
|
|
- Client token-count events, retaining explicit unknown `info: null`.
|
|||
|
|
|
|||
|
|
It excludes session/account metadata, world state, user/developer messages,
|
|||
|
|
encrypted reasoning, internal passthrough and unknown nested usage fields. It
|
|||
|
|
does not copy authentication, configuration or the ambient environment. Receipts
|
|||
|
|
record source/retained digests, event counts, malformed-line failures and missing
|
|||
|
|
rollouts as unavailable. Capture is an observation of persisted client items,
|
|||
|
|
not proof of the exact request accepted by a remote model service.
|
|||
|
|
|
|||
|
|
Run the same frozen runtime, question, tool selection and capture mode on both
|
|||
|
|
sides. Preserve source/settings hashes and separate requested versus observed
|
|||
|
|
behavior. Use the existing resource wrapper with unchanged one CPU, 4 GiB hard
|
|||
|
|
memory, 3 GiB early-stop, no swap and task/host safeguards. Final physical counters
|
|||
|
|
remain unknown when transient cgroups disappear; this instrumentation does not
|
|||
|
|
repair that measurement limitation.
|
|||
|
|
|
|||
|
|
The focused Python tests run through the existing CI `test:python` gate.
|
|||
|
|
They cover account/ambient exclusion while preserving caller data, malformed and
|
|||
|
|
missing records, foreign symlinks, and capture failure without copied-credential
|
|||
|
|
leakage. The cleanup test simulates a CLI and establishes only cleanup semantics;
|
|||
|
|
it is not real-model/provider evidence.
|
|||
|
|
|
|||
|
|
## An explicit discovery-guidance experiment
|
|||
|
|
|
|||
|
|
`--guide-enabled-tools` is another opt-in experiment flag. It requires a nonempty
|
|||
|
|
`--enabled-tools` list and adds the exact corresponding `mcp__rea__...` function
|
|||
|
|
names to the temporary developer instructions, requesting only exact-name
|
|||
|
|
metadata discovery. It preserves the analyst question, operation order, tool
|
|||
|
|
selection and provider inputs. The default instruction is unchanged. Missing or
|
|||
|
|
invalid selected tools fail before creating an output/profile. The test gate
|
|||
|
|
also verifies the new prerequisite without acquiring a profile.
|
|||
|
|
|
|||
|
|
Compare guided and unguided runs on the **same** frozen REA runtime with matching
|
|||
|
|
capture mode and requested facts. A smaller discovery response or additional
|
|||
|
|
hint is not itself a task/token success: grade answers, count all response usage,
|
|||
|
|
preserve failed/truncated runs and repeat both orders before recommending this
|
|||
|
|
guidance. This is a caller-side experiment, not a new REA tool or provider preset.
|
|||
|
|
|
|||
|
|
## First committed capture pair
|
|||
|
|
|
|||
|
|
Checkpoint `9ebdcc458c399b9bdecaaca2ef47422888231181` runs the unchanged question
|
|||
|
|
against frozen control `ae8051302b5834322fa00cfa31c968ae74ab6ed9` and candidate
|
|||
|
|
`8bc1601ca51e417ca472d90ea0367e9418a1a0f2`, both with capture enabled and no tool
|
|||
|
|
guidance. Both captures succeed with 10 retained events, unchanged source bytes,
|
|||
|
|
removed profiles, two successful MCP calls and passing selected factual checks.
|
|||
|
|
Full grader gates remain false because final physical resource counters are
|
|||
|
|
unavailable; factual subsets do not override that limitation.
|
|||
|
|
|
|||
|
|
| Side | Input | Cached | Uncached | Output | Wall seconds |
|
|||
|
|
| ----------------- | -----: | -----: | -------: | -----: | -----------: |
|
|||
|
|
| Complete control | 52,656 | 27,136 | 25,520 | 2,015 | 57.736 |
|
|||
|
|
| Summary candidate | 56,655 | 29,184 | 27,471 | 1,534 | 55.055 |
|
|||
|
|
|
|||
|
|
Both clients make two executor calls and three response-usage observations.
|
|||
|
|
First they print broad discovered metadata, with truncation. Then each executor
|
|||
|
|
sequentially performs both MCP operations, preserving selected-target dependency
|
|||
|
|
order. The control prints a 2,086-byte output value; the candidate prints 22,770
|
|||
|
|
bytes. Their discovery output values are 41,723 and 41,675 bytes. These are
|
|||
|
|
recorded serialized values and remain distinct from raw MCP envelopes, billed
|
|||
|
|
tokens and exact submitted requests. Both requested modes are `direct`; the
|
|||
|
|
actual executor use is separately observed.
|
|||
|
|
|
|||
|
|
The candidate's smaller raw metadata reply does not result in a smaller printed
|
|||
|
|
client value in this pair. Candidate input/uncached tokens remain higher. The
|
|||
|
|
observed projection and round counts are useful constraints for the next
|
|||
|
|
experiment; this one pair does not attribute all usage differences to either
|
|||
|
|
formatting or discovery, or establish a reliable speedup.
|
|||
|
|
|
|||
|
|
## Same-runtime guided discovery, repeated in both orders
|
|||
|
|
|
|||
|
|
Checkpoint `e20bd0e2a905f06bc8c56fe04b0e61f3da88636a` runs four actual Codex trials
|
|||
|
|
in unguided/guided/guided/unguided order. All use the **same** frozen candidate
|
|||
|
|
runtime, artifact, original question, requested model/reasoning, two selected
|
|||
|
|
tools, provider settings and capture mode. Only the explicit discovery-guidance
|
|||
|
|
treatment changes. Every trial selects artifact summary and makes the same two
|
|||
|
|
successful MCP calls in dependency order; source bytes stay unchanged, captures
|
|||
|
|
succeed and profiles are removed.
|
|||
|
|
|
|||
|
|
| Trial | Input | Cached | Uncached | Output | Seconds | Observed responses |
|
|||
|
|
| ---------- | ------: | -----: | -------: | -----: | ------: | -----------------: |
|
|||
|
|
| Unguided 1 | 77,251 | 50,432 | 26,819 | 1,931 | 62.066 | 4 |
|
|||
|
|
| Guided 1 | 39,175 | 23,040 | 16,135 | 1,763 | 55.658 | 3 |
|
|||
|
|
| Guided 2 | 58,336 | 38,144 | 20,192 | 1,626 | 50.685 | 4 |
|
|||
|
|
| Unguided 2 | 103,301 | 72,704 | 30,597 | 1,983 | 60.336 | 5 |
|
|||
|
|
|
|||
|
|
Both guided discovery output values repeat at 12,336 bytes without truncation,
|
|||
|
|
versus 41,709 bytes with truncation on both unguided trials. The recorded
|
|||
|
|
executor/output usage explains observable discovery and round differences; it
|
|||
|
|
does not certify exact remote request contents or attribute every token to the
|
|||
|
|
hint. CPU samples are 6.303–6.554 seconds and peak family memory 684,519,424–
|
|||
|
|
712,028,160 bytes, with no guard abort. Final resource counters remain unknown.
|
|||
|
|
These samples do not establish a memory or CPU improvement.
|
|||
|
|
|
|||
|
|
Unguided 1 omits `classification.container` and fails the selected factual gate;
|
|||
|
|
it is not a fully acceptable comparison answer. Guided 1 and Unguided 2 pass
|
|||
|
|
that gate. Guided 2 initially fails exact coverage-object equality because it
|
|||
|
|
adds `module_ref_count: 0` and `pinvoke_import_count: 0` to the explicitly named
|
|||
|
|
native scope. Both numbers exactly match the producer's returned arrays. The
|
|||
|
|
grader now explicitly verifies only these two known additional counts, including
|
|||
|
|
integer type, while still requiring all original coverage facts. Unknown extra
|
|||
|
|
claims, conflicting aliases, wrong counts, boolean/string counts and omitted
|
|||
|
|
issues continue to fail. Source coverage remains unchanged; returned-row counts
|
|||
|
|
do not establish global absence. Original failure receipts remain preserved;
|
|||
|
|
the regrade separately records its new source hash. Guided 2 then passes selected
|
|||
|
|
facts, but every **full** gate still fails unknown final physical resource checks.
|
|||
|
|
|
|||
|
|
The second comparison has two factually acceptable answers: observed guided input
|
|||
|
|
falls about 43.5%, uncached input about 34.0%, and wall time about 16.0%. The first
|
|||
|
|
comparison has an incomplete unguided answer and is reported without counting it
|
|||
|
|
as equivalent completed work. Two trials per treatment on one question/application
|
|||
|
|
remain a preliminary signal, not a general default recommendation. The hint stays
|
|||
|
|
opt-in; wider questions/domains, count/coverage representation and client round
|
|||
|
|
behavior need further verification before promoting it into general guidance.
|
|||
|
|
|
|||
|
|
## Real Android follow-up: the primary outcomes are mixed
|
|||
|
|
|
|||
|
|
Checkpoint `22834c7d73056e2480b426848f58c31af0c307bc` checks the pinned real
|
|||
|
|
NewPipe 0.29.1 APK using actual configured JADX 0.7.1/Java, the original Android
|
|||
|
|
question and the same frozen candidate runtime. First a fresh SDK workflow
|
|||
|
|
validates three live advertised operations and produces the comparison facts:
|
|||
|
|
package/version identity, every case-sensitive MainActivity match and all
|
|||
|
|
reported onCreate entries, preserving signatures, overload indices and null DEX
|
|||
|
|
descriptors. It takes 26.961 seconds; the owned scope samples 1,234,735,104 bytes.
|
|||
|
|
|
|||
|
|
Both subsequent actual Codex trials use the same three selected tool names,
|
|||
|
|
capture mode, model/reasoning, question and provider settings. Only discovery
|
|||
|
|
guidance changes. Each makes three successful MCP calls and five observed model
|
|||
|
|
responses, passes selected facts against the fresh actual producer, preserves
|
|||
|
|
source bytes and removes its temporary profile. No APK execution is requested.
|
|||
|
|
|
|||
|
|
| Trial | Input | Cached | Uncached | Output | Wall seconds | Sampled peak bytes |
|
|||
|
|
| -------- | -----: | -----: | -------: | -----: | -----------: | -----------------: |
|
|||
|
|
| Unguided | 99,913 | 80,640 | 19,273 | 1,527 | 66.797 | 1,405,829,120 |
|
|||
|
|
| Guided | 89,220 | 62,464 | 26,756 | 2,142 | 76.936 | 1,345,576,960 |
|
|||
|
|
|
|||
|
|
Total input falls about 10.7%, but uncached input increases and wall time is
|
|||
|
|
longer. One pair does not demonstrate improved Android performance or memory.
|
|||
|
|
No guard abort occurs; final counters remain unknown and full resource gates
|
|||
|
|
remain false. This second domain is a concrete counterexample to generalizing
|
|||
|
|
the favorable managed comparison. Keep both flags optional and continue
|
|||
|
|
task-specific experiments before changing installed/default agent guidance.
|