Skip to content

feat(elision): invariant-bearing truncation markers; bump tok to #82 - #235

Merged
Patel230 merged 3 commits into
mainfrom
feat/invariant-markers
Aug 23, 2026
Merged

feat(elision): invariant-bearing truncation markers; bump tok to #82#235
Patel230 merged 3 commits into
mainfrom
feat/invariant-markers

Conversation

@Patel230

Copy link
Copy Markdown
Contributor

Summary

Phase 1 of the caveman-style compression adoption (approved plan): every tool-output truncation marker now states only verified facts about the elided portion, replacing bare "… (truncated)". Measured agent behavior shows bare-count markers cause 11–97 retrieval-call storms because readers can't tell whether the answer was dropped.

Prerequisite merged: GrayCodeAI/tok#82 (invariants.go — fact computation + sentinel upgrades). This PR bumps the submodule pointer and wires hawk to it.

Changes

  • tok bumpa1d1863f: JSONInvariants / LogInvariants primitives; CompressJSON sentinel record; enriched log markers.
  • internal/engine/elision.go: shared notice builder — JSON arrays get field-level facts (constants, enumerations summing to total, numeric ranges, distinct-count coverage, dense-run upgrades); log-shaped text gets level distribution; prose falls back unchanged.
  • Wiring: truncateToolOutput, spill preview tail, and all 5 cut paths in truncateOutputStructurally.
  • Structural-cutter fix: single-line JSON now splices at the last top-level comma (depth-aware scan) so kept records stay complete and dropped tails parse as whole records. Mid-record cuts still fail closed to the bare marker.
  • Facades: internal/token + internal/engine/token expose the two new primitives.

Testing

New elision suite (6 tests: JSON facts, log distribution, fragment normalization incl. trailing-bracket/comma artifacts, fail-closed fallbacks) + full engine suite green; lint/vet clean.

Bumps the tok submodule to a1d1863f (tok#82: verified-fact elision
summaries) and wires it into every tool-output truncation site.

Hawk's markers previously said only '... (truncated)'. Measured agent
behavior shows bare-count markers cause 11-97 retrieval-call storms,
because the reader cannot tell whether the answer was in the dropped
portion. Every marker now carries facts VERIFIED across the elided
units and nothing else:

- JSON tool output: '{sku-114..159} N records elided: status=shipped
  x46, range id=...' — field constants, enumerations summing to the
  total, numeric ranges, distinct-count coverage, dense-run upgrades.
  Structural cuts now splice at TOP-LEVEL commas (depth-aware scan)
  so kept records stay complete and the dropped tail parses as whole
  records; mid-record raw cuts still fail closed to the bare marker.
- Log-shaped output: level distribution ('N lines elided: info x6').
- Prose/unknown: unchanged bare marker.

Fail-closed preserved throughout: anything unparseable or under the
3-unit threshold truncates exactly as before. New elision.go exposes
the shared notice builder; internal/token facades the two new tok
primitives. Full engine suite green.
The release-parity check resolves each submodule's go.mod version and
requires it to equal the index gitlink. Bumping the gitlink without
updating the module requirement left CI resolving old tok (643b6675),
which lacks JSONInvariants/LogInvariants — breaking module hygiene
builds. Pin the require directive to a1d1863f (#82).
The previous commit carried the submodule working tree at a7c4b99d
(toolschema #83) while pinning the module to a1d1863f (#82) — a parity
mismatch. Pin the gitlink to a1d1863f on this branch; #83's pointer
lands with the stacked wiring PR. Also commit go.work.sum drift from
go work sync.
@Patel230
Patel230 merged commit d5d7c24 into main Aug 23, 2026
26 checks passed
@Patel230
Patel230 deleted the feat/invariant-markers branch August 23, 2026 03:37
Patel230 added a commit that referenced this pull request Aug 23, 2026
Rebase onto post-#235 main; update the tok require directive to the
toolschema merge and align the gitlink, satisfying release parity.
Patel230 added a commit that referenced this pull request Aug 23, 2026
#236)

* feat(tools): opt-in tool-catalog shrink via tok; bump submodule to #83

Wires tok's new toolschema compressor (GrayCodeAI/tok#83) into the
outgoing request path behind HAWK_TOOL_SHRINK=1 (default off, request
bytes unchanged).

At ChatService.BuildOptions the tool list converts to the OpenAI
function-catalog wire shape, shrinks, and converts back. Fail-open
guarantees: any marshal/unmarshal error, tool-count drift, or name
mismatch at any position returns the original list untouched; disabled
or not-smaller catalogs are no-ops. When compression lands, the exact
pre-shrink catalog persists under state/tool-catalog-originals/<sha>.json
keyed by content hash for recovery and diffing, and a one-time info log
reports before/after byte counts.

Facades extended: internal/token aliases tok.ToolShrinkStats and exposes
ShrinkToolCatalog/LintToolCatalog; internal/engine/token re-exports.

Submodule bump includes tok#82 invariants (already wired separately on
feat/invariant-markers; this branch stacks on it for the pointer).

New tests: disabled-by-default no-op, enabled reduction with name/
constraint/required preservation through BuildOptions, and recovery-file
persistence.

* fix(deps): pin tok module to #83 (a7c4b99d) for submodule parity

Rebase onto post-#235 main; update the tok require directive to the
toolschema merge and align the gitlink, satisfying release parity.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant