Skip to content

feat(paging): the #294 ruling's suggestions — above_cliff=, next_tier=, at= stamp, and the end-to-end walk arm - #5

Merged
pt-act merged 1 commit into
mainfrom
paging-ruling-adoption
Sep 28, 2026
Merged

pt-act merged 1 commit into
mainfrom
paging-ruling-adoption

Conversation

@usehoplite

@usehoplite usehoplite Bot commented Sep 28, 2026

Copy link
Copy Markdown

What

The maintainer ruling on upstream issue redhat-et#294 (comment) blessed the candidate-page design as-is ("exactly the order this project wants") and offered five optional suggestions. Two we already satisfied; three land here plus the end-to-end arm:

  1. above_cliff=N beside total= — the head-tier candidate count, so an agent decides from page 1 whether the below-cliff remainder is worth fetching (the boundary tier= already uses: cliffRank − 1). Also on the degrade page.
  2. next_tier= beside next= — the tier the continuation page will carry (head/below-cliff), so a consumer skips the below-cliff remainder deliberately rather than by accident.
  3. at= on every page — the same gitstamp::stampAt index stamp the un-paged bundle anchors with; a stale continuation is detectable (compare at= across pages) instead of silently mixing two rankings. Honestly absent on non-git/multi-root.
  4. (G3) the end-to-end walk arm — concatenating every page equals the full ranked candidate list: shown= arithmetic tiles the set, the (file, line, name) triple tiles the named-def rows in rank order, the tier sequence is head* then below-cliff*, and the un-paged bundle's rows are a prefix of the walk.

Already satisfied (recorded in the commit): #4 per-page trim disclosure (arm (H)'s within-page rule-5 sweep) and #3's canonical tie-break (radixSortByScoreDescId — the same (score desc, id asc) key the bundle selects with).

Verification

  • 11/11 gates ALL PASS — truncvocabcheck (H extended with above_cliff=/at= asserts), listingpagingcheck (G2 extended with next_tier=; the new G3 walk: 5 pages on src/, 946 rows tiling 947 candidates, head → below-cliff ×4, bundle prefix), mcpverbscheck, fixedbufsweep, budgetpolicycheck, packtaskcheck, mcpmanifestcheck, selfcheckcheck, forwidencheck, forbudgetmonotoncheck.
  • The page is byte-deterministic across runs and xmllint --noout clean; the MCP twins carry the identical document (above_cliff="39" live on for and explore).
  • Two measurement subtleties the G3 arm documents: pseudo-symbols (e.g. <file-scope>) are counted as served but emit no row, so shown=-sum is the tiling contract; and candidate identity is the (file, line, name) triple — same-name definitions are distinct candidates even in one file (DYNMAP_DEFINE_RANK_32 sits at two lines of dynamic_map.hpp), the packtask.h:1690 lesson learned twice while writing this arm.

Scope notes

…next_tier=, the at= index stamp, and the end-to-end walk arm

The maintainer ruling (redhat-et issue redhat-et#294, comment 5868657455) blessed the
design as-is and offered five optional suggestions. Two we already satisfied
(#4 per-page trim disclosure — truncvocabcheck arm (H)'s within-page <bodies>
rule-5 sweep; #3's canonical tie-break — radixSortByScoreDescId is the same
(score desc, id asc) key the bundle selects with). Three land here:

- above_cliff= (suggestion 1): the head-tier candidate count next to total=,
  so an agent decides from page 1 whether the below-cliff remainder is worth
  fetching. cliffRank is 1-based, so above_cliff = cliffRank-1 — the same
  boundary tier= uses, one definition. Also on the degrade page.
- next_tier= (suggestion 2): the tier the CONTINUATION page will carry, beside
  next= — a consumer skips the below-cliff remainder deliberately, not by
  accident. Fixed literals; always present.
- at= (suggestion 3): the git index stamp on every page (the same
  gitstamp::stampAt the un-paged bundle anchors with), so a stale continuation
  is detectable — the consumer compares at= across pages instead of silently
  mixing two rankings. Empty (non-git / multi-root) => honestly absent.
- (G3) the end-to-end walk (suggestion 5): concatenating every page equals the
  full ranked candidate list — the pages' own shown= arithmetic tiles the
  candidate set (pseudo-symbols like <file-scope> are served but emit no row,
  so named rows <= shown), the (file, line, name) TRIPLE tiles the named-def
  rows in rank order (same-name definitions are distinct candidates even in
  one file — the packtask.h:1690 lesson, learned twice this arm), the tier
  sequence is head* then below-cliff* (one boundary, unmoved mid-walk), and the
  un-paged bundle's served rows are a PREFIX of the walk. Walked on src/:
  5 pages, 946 rows tiling 947 candidates, head -> below-cliff x4.

Arms extended in the same commits as the behavior: (H) asserts above_cliff=
(< total) and at= on every paged root; (G2) asserts next_tier= is one of the
two values and present beside next=. Verified: 11/11 gates ALL PASS
(truncvocabcheck+H, listingpagingcheck+G2+G3, mcpverbscheck, fixedbufsweep,
budgetpolicycheck, packtaskcheck, mcpmanifestcheck, selfcheckcheck,
forwidencheck, forbudgetmonotoncheck); the page is byte-deterministic and
xmllint-clean; the MCP twins carry the same document (above_cliff= live).
@pt-act
pt-act merged commit eaa7a39 into main Sep 28, 2026
37 checks passed
@usehoplite
usehoplite Bot deleted the paging-ruling-adoption branch September 28, 2026 17:22
usehoplite Bot added a commit that referenced this pull request Oct 3, 2026
…next_tier=, the at= index stamp, and the end-to-end walk arm (#5)

The maintainer ruling (redhat-et issue redhat-et#294, comment 5868657455) blessed the
design as-is and offered five optional suggestions. Two we already satisfied
(#4 per-page trim disclosure — truncvocabcheck arm (H)'s within-page <bodies>
rule-5 sweep; #3's canonical tie-break — radixSortByScoreDescId is the same
(score desc, id asc) key the bundle selects with). Three land here:

- above_cliff= (suggestion 1): the head-tier candidate count next to total=,
  so an agent decides from page 1 whether the below-cliff remainder is worth
  fetching. cliffRank is 1-based, so above_cliff = cliffRank-1 — the same
  boundary tier= uses, one definition. Also on the degrade page.
- next_tier= (suggestion 2): the tier the CONTINUATION page will carry, beside
  next= — a consumer skips the below-cliff remainder deliberately, not by
  accident. Fixed literals; always present.
- at= (suggestion 3): the git index stamp on every page (the same
  gitstamp::stampAt the un-paged bundle anchors with), so a stale continuation
  is detectable — the consumer compares at= across pages instead of silently
  mixing two rankings. Empty (non-git / multi-root) => honestly absent.
- (G3) the end-to-end walk (suggestion 5): concatenating every page equals the
  full ranked candidate list — the pages' own shown= arithmetic tiles the
  candidate set (pseudo-symbols like <file-scope> are served but emit no row,
  so named rows <= shown), the (file, line, name) TRIPLE tiles the named-def
  rows in rank order (same-name definitions are distinct candidates even in
  one file — the packtask.h:1690 lesson, learned twice this arm), the tier
  sequence is head* then below-cliff* (one boundary, unmoved mid-walk), and the
  un-paged bundle's served rows are a PREFIX of the walk. Walked on src/:
  5 pages, 946 rows tiling 947 candidates, head -> below-cliff x4.

Arms extended in the same commits as the behavior: (H) asserts above_cliff=
(< total) and at= on every paged root; (G2) asserts next_tier= is one of the
two values and present beside next=. Verified: 11/11 gates ALL PASS
(truncvocabcheck+H, listingpagingcheck+G2+G3, mcpverbscheck, fixedbufsweep,
budgetpolicycheck, packtaskcheck, mcpmanifestcheck, selfcheckcheck,
forwidencheck, forbudgetmonotoncheck); the page is byte-deterministic and
xmllint-clean; the MCP twins carry the same document (above_cliff= live).

Co-authored-by: usehoplite[bot] <288093033+usehoplite[bot]@users.noreply.github.com>
usehoplite Bot pushed a commit that referenced this pull request Oct 7, 2026
#4 --grep code+string, #5 cross_kind=, #6 C body-less enum specifier span,
redhat-et#7 run_first=. CHANGELOG: union at the [Unreleased] anchor. kParserVer/mirror
kept at main's 132 for now (lane 130; the train fixup renumbers to 133 above
every lane value). dictv (COMMANDS.md, showcase capture), help_all pin and
test/qschemetrip.hash left at main's value as placeholders, re-derived once
from the merged binary in the train fixup. qschemetripcheck RE-PIN LOG keeps
both entries.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
usehoplite Bot added a commit that referenced this pull request Oct 7, 2026
…next_tier=, the at= index stamp, and the end-to-end walk arm (#5)

The maintainer ruling (redhat-et issue redhat-et#294, comment 5868657455) blessed the
design as-is and offered five optional suggestions. Two we already satisfied
(#4 per-page trim disclosure — truncvocabcheck arm (H)'s within-page <bodies>
rule-5 sweep; #3's canonical tie-break — radixSortByScoreDescId is the same
(score desc, id asc) key the bundle selects with). Three land here:

- above_cliff= (suggestion 1): the head-tier candidate count next to total=,
  so an agent decides from page 1 whether the below-cliff remainder is worth
  fetching. cliffRank is 1-based, so above_cliff = cliffRank-1 — the same
  boundary tier= uses, one definition. Also on the degrade page.
- next_tier= (suggestion 2): the tier the CONTINUATION page will carry, beside
  next= — a consumer skips the below-cliff remainder deliberately, not by
  accident. Fixed literals; always present.
- at= (suggestion 3): the git index stamp on every page (the same
  gitstamp::stampAt the un-paged bundle anchors with), so a stale continuation
  is detectable — the consumer compares at= across pages instead of silently
  mixing two rankings. Empty (non-git / multi-root) => honestly absent.
- (G3) the end-to-end walk (suggestion 5): concatenating every page equals the
  full ranked candidate list — the pages' own shown= arithmetic tiles the
  candidate set (pseudo-symbols like <file-scope> are served but emit no row,
  so named rows <= shown), the (file, line, name) TRIPLE tiles the named-def
  rows in rank order (same-name definitions are distinct candidates even in
  one file — the packtask.h:1690 lesson, learned twice this arm), the tier
  sequence is head* then below-cliff* (one boundary, unmoved mid-walk), and the
  un-paged bundle's served rows are a PREFIX of the walk. Walked on src/:
  5 pages, 946 rows tiling 947 candidates, head -> below-cliff x4.

Arms extended in the same commits as the behavior: (H) asserts above_cliff=
(< total) and at= on every paged root; (G2) asserts next_tier= is one of the
two values and present beside next=. Verified: 11/11 gates ALL PASS
(truncvocabcheck+H, listingpagingcheck+G2+G3, mcpverbscheck, fixedbufsweep,
budgetpolicycheck, packtaskcheck, mcpmanifestcheck, selfcheckcheck,
forwidencheck, forbudgetmonotoncheck); the page is byte-deterministic and
xmllint-clean; the MCP twins carry the same document (above_cliff= live).

Co-authored-by: usehoplite[bot] <288093033+usehoplite[bot]@users.noreply.github.com>
joyful-ii-V-I pushed a commit that referenced this pull request Oct 21, 2026
…rget; rule-4 gate twins

- kForRunawayGuardBytes = 30,000 B by the frozen rule: max(4 x 7,500,
  2 x the largest complete default payload on the round-2 --for argv
  (12,519 B)); zero hits on the round-4 and capsweep argv (max 13,005 B).
- The default answer narrows <lego>/<compose> to the rows at its target
  cut (sigsRowsAtTarget), so the rows kept past the target do not turn a
  served lego section into a stub (the section invariant).
- An exhausted soft target's hops marker clears the hop-only readings
  (via=, owner qword), so the owner plan adds nothing there (ownerhopcheck B2).
- MCP from_trace names its budget_tokens on the root and reads it as a soft
  target, like the CLI twin; the compact from-trace reading says "soft".
- Rule-4 replacements (no gate erosion; each replaced arm green on head
  and red on base where it asserts the new behaviour, twins green on both):
  estchargecheck, ceilingverdictcheck (FORGE kept), formaxtokenscheck (E),
  w3fixbudgetcheck, forsigspancheck (T), tracecheck (T3),
  mcpforparitycheck (5), fordisclosurecheck, bundleidcheck,
  droppedpositivecheck #6, jsonparitycheck R1, forrootlegendcheck arm2,
  forbudgetmonotoncheck #1/#5, legendcoveragecheck (E), ownerhopcheck (R).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
joyful-ii-V-I pushed a commit that referenced this pull request Oct 21, 2026
… forbodyslotcheck, forrankordercheck (rule 4)

- forbudgetmonotoncheck #5: the frozen-share sig comparison reads the fold-off twin of the default (the soft
  target carries no fold, so no C3 pair).
- forbodyslotcheck: every slot arm reads the fold-off answer; new (FX): with the fold on, the slot's <bodies>
  is the fold-off answer's byte for byte and the owner is never repeated in the fold.
- forrankordercheck (3): the 4% growth band reads the answer before its fold additions (the element, its
  clause, the hop-calls next= clause, the C3 pair) — the FOLD C precedent; (9) reads the signatures-only
  re-call off the fold-off twin; new (9f): the fold answer carries the same call as sigs_next=.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
joyful-ii-V-I pushed a commit that referenced this pull request Oct 21, 2026
M1 (review rv-hrr, CI run on 051101f):
(a) serialize.h headRoundRobinOrder: read mayOpen(0) once above the loop; the
    ENSURES no longer calls a functor (contracts have no side effects).
(b) forbudgetmonotoncheck #1/#5: rule-4 twins under RIPWIRE_NO_HEAD_RR=1, plus
    #1h/#5h: with the reorder on, the explicit ceiling serves exactly the
    default's rows as a set (softbudget.py set_prefix).
(c) receiverevidencecheck hopnotproven: the hop-candidate r= premise reads the
    RIPWIRE_NO_HEAD_RR=1 twin (hops walk score order), stated under rule 4.
(d) mcpverbscheck: accept <sigs[ >] (the tag may carry files_first=).
(e) fixedbufsweep: nb row 7 -> 8 and pin 363/248/248 -> 364/249/249 for the
    files_first= site (35 B worst case, one size_t).
(f) one isDocRow lambda per dialect feeds both the head round-robin's mayOpen
    and reorderDocsAfterCode: the 2 new Lang::Markdown compares are gone
    (langidentitycheck 348 -> 346, ceiling unchanged).
(g) enumtablecheck stale kDocTierTags: a filter.h comment "types/*.d.ts"
    opened a block comment for the scanner and hid the exempted table;
    reworded, the exemption matches again.

M2: filter.h declarationTwinFileMultipliers counts a file as implementation
evidence only when its path tier is 1.0, its basename is not a row manifest,
and it is not a declaration-test suffix (.test-d.ts etc., TS row data).
forheadrrcheck H6t/H6p/H6q red on 051101f, green here.

CHANGELOG: S1-S3 wording and final numbers (19 gained, 3.96 -> 8.00).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pt-act pushed a commit that referenced this pull request Oct 27, 2026
…der, honest (18)

Review findings addressed (changes-max, rev-496ad92798c0, all 8):
- editcheck.h (#2, correctness): the tower reached --edit-check's group
  model — lowestNode was filled from members.front(), which no longer
  arrives id-ascending. Traced every consumer (editpreview, mcpverbs,
  verbs_quality — all want THE FOCUS, verbs_quality binds it as `focus`),
  so the field becomes focusNode and editCheckRoundTripSpelling compares
  CONTAINMENT, not first elements: order-independent by construction.
  Proved with a mixed-kind two-contract red-control: pre-fix binary
  degrades the refusal to @file:LINE seeds, post-fix offers canonical ids
  that all paste back accepted;
- model.h (#6): three enumerator-keyed static_asserts pin ordinal AND
  weight of Method/Section/FuncType together — a reordered SymKind
  without the matching table permutation is now a build error (house
  pattern, cf. serialize.h's Unknown==12);
- lspcheck arm (18) (redhat-et#8): the def-front clause grepped '"line":9' inside
  a 260-byte window that a regressed Var-first order also satisfied —
  replaced by file-anchored offset comparison like its ws/symbol sibling.
  Red-control on the base binary's real regressed bytes: old clause
  PASS (the flaw), new clause FAIL;
- graph.h (#3): the local under the rewritten contract is `towerFront`,
  not `lowest`;
- .ripwire_quality_acks (#1): runLsp complexity/verbosity rows now name
  the actual growth (the answer-struct destructure + notice branch), the
  concat-shape argument stays only where it belongs;
- graphlegend.h, lsp.h comment split, verbs_report.h (#4/#5/redhat-et#7): the
  remaining distant voices of the tower — the CLI --owners twin now
  matches its MCP sibling.

Gates: 18/18 targeted file-sweep ALL PASS in the leap-build container
(lspcheck editcheck family x5 decltodef incl. compile-driver compact/
legend budget x2 docanchor owners mcp x3 connect affected attribmultidef);
determinism x2; map byte-IDENTICAL vs the b59b082 base binary; xmllint
clean; editpreviewcheck green on the parallel host sweep.

Co-Authored-By: Claude <noreply@anthropic.com>

Authored by @mpapis with AI assistance (DeepSeek V4.1 Flash / Qwen 3.8 Flash) under his supervision.
pt-act pushed a commit that referenced this pull request Oct 27, 2026
…ched to its guards

Review findings addressed (changes-max, rev-aae42d3f5c3f, all 6):
- graph.h (#2): the --connect tie-break prose still asserted "candidates
  ascend by id" after C2 — corrected to what the scan does: a strictly
  better join wins, ties keep the FIRST candidate met, and the arrival
  order is the tower front for the name/file tier (id-ascending only on
  the canonical-id/Scope::name tiers);
- model.h (#3): the table comment over-claimed — three keyed asserts
  anchor Method/Section/FuncType ordinals+weights, but a swap of two
  UNANCHORED enumerators (Var/Interface) would trip none; the claim now
  says exactly that, guards unchanged;
- lspcheck arm (18) (#5): the hover-front clause was an unanchored
  membership grep over the whole hover — it now asserts the method block
  offset EQUALS the first def-block offset. Red-control on the base
  binary's real Var-first bytes: OLD clause PASS (the flaw), NEW FAIL
  (method=235 vs first=74); green on the current build (74=74);
- lspcheck arm (18b) (#6): both 340-byte windows replaced by first-row
  containment (needle offset >= first row start and < second row start).
  Honest qualifier recorded: base CANNOT regress this clause (created_at's
  two defs tie on kind, so id order == tower order there) — the control
  is base's real Location rows transposed byte-for-byte: OLD window PASS,
  NEW first-row FAIL;
- decltodefcheck (#4): framing paragraph "lowest-id projection" ->
  "tower-front projection", lockstep with graphlegend.h;
- .ripwire_quality_acks (#1): the runLsp complexity/verbosity rows now
  name their own growth (the defs>1 branch), the concat-shape argument
  stays on the duplication rows it belongs to.

Deliberately NOT fixed this round (parked for the next review to judge):
test/mcphandlecheck.sh prose still says "lowest-id pick" on fetch_body's
name path — a gate outside this branch's touched set.

Gates: one container build (BUILD_EXIT=0); BOTH the fixer's and the
loop-owner's independent sweeps agree — lspcheck, decltodefcheck (incl.
the compile-driver arm), compactlegendcheck, connectcheck, connectcorecheck
(with its ASan/UBSan arm), editcheckcheck: ALL PASS; determinism x2;
map byte-IDENTICAL vs the b59b082 base snapshot; xmllint clean.

Co-Authored-By: Claude <noreply@anthropic.com>

Authored by @mpapis with AI assistance (DeepSeek V4.1 Flash / Qwen 3.8 Flash) under his supervision.
pt-act pushed a commit that referenced this pull request Oct 27, 2026
…premise-pinned arms

Review findings addressed (changes-max, rev-bedff612f3c0, all 7):
- verbs_report.h (#2, warning): the EMITTED --owners legend still taught
  "the FIRST of them (lowest node id)" while both sibling copies of the
  sentence had been fixed around it — now the tower front (kind, leading
  language, lowest id), ownerscheck's pinned needles re-pinned lockstep;
- graph.h (#1): declToDefFollowThrough's comment claimed its ascending
  sort is a caller contract — applyNameTower re-orders the tier two
  lines later at the only call site; the comment now says what is true:
  the sort makes the widening's own output deterministic BEFORE the
  tower orders the tier (the sort itself untouched);
- decltodefcheck (#4): E3 framing + echoed E3d title moved to the
  tower-front language, finishing the file's stale-pick-rule walk;
- lspcheck arms (#5, #6): the (19) single-def control now pins its own
  premise (the hovered answer must exist before asserting the sentence's
  absence — it PASSed on an absent answer before); the (20) parity arm
  states the kLspHoverUseCap=8 premise against the capped hover tier.
  Red-controls: OLD (19) control PASSes the base binary's null-answer
  bytes, NEW FAILs them; #6's grown-copy hover is named by premise, not
  misdiagnosed as parity failure;
- mcphandlecheck (redhat-et#7): wording-only per loop-owner decision (the
  campaign's C3 scope names the MCP descriptions lane) — comments and
  arm-title strings, zero assertion changes;
- compactlegendcheck (#3): the safe-delete row's measured 828 -> 830
  attributed to e5d39f7's +2 B clause (9 B -> 11 B tower-front match),
  pin 840 unchanged — the table's own re-pin-in-the-commit-that-adds-
  bytes rule.

Gates: one container build (BUILD_EXIT=0); owner sweep — lspcheck,
ownerscheck, decltodefcheck, compactlegendcheck (rc=0, ALL PASS on the
stable file), mcphandlecheck, mcpverbscheck, mcpmanifestcheck ALL PASS;
determinism x2; map byte-IDENTICAL vs the b59b082 base snapshot;
xmllint clean. One earlier compactlegendcheck FAIL was proven transient:
a released continuation edited the script mid-run (bash reads scripts
incrementally) — reproduced rc=0 in-container afterwards.

Co-Authored-By: Claude <noreply@anthropic.com>

Authored by @mpapis with AI assistance (DeepSeek V4.1 Flash / Qwen 3.8 Flash) under his supervision.
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