Repository navigation
Read log v7: read Glob/Grep patterns as the glob engines do, and deny every removed file - #534
Conversation
Q6 round 10 left two tooling items for a follow-up:
- L1: the segment cutter split bracket classes at commas and braces, so
stem[.,]md, stem[!,]md and stem[{.]md passed. Probing ripgrep 15.2.0,
Node 26 (fs.globSync) and Bun 1.3 on invented files found more forms
every engine-reading misses under v6: comma-less brace groups
(deep_{denied}.md), commas in classes inside groups, backslash escapes,
extglobs, POSIX classes, ^ negation, one-character classes and case
variants of literal paths. pattern_kind now reads each pattern the way
any of those engines might (brace_expansions(glob=True),
extglob_expansions, glob_tokens) and keeps the v6 reading and round
10's smallest fix, so v7 flags whatever v6 flagged.
- Observation: the CLI passed only denied_paths. denied_from_record adds
the root record's removed files (the codebook files among them) and
removed code-map tables; read_log compares paths without case and
records n_denied.
Rounds 5-10's read logs regenerated as v7 from their transcripts and root
records (the v6 tool reproduces the committed v6 logs byte for byte):
round 5 stays void on the same pattern, rounds 6-10 count, and only the
schema and n_denied change. Codex logs of rounds 2-4 are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
- Read-log bullets: one sentence on the v7 rule; the rule as it stands is v7; rounds 5-10's logs regenerated. - Round 10's record: its log was made as v6 and regenerated as v7. - Round 10's dispositions: L1 is fixed by PR #534. The observation row now separates the two cases as round 10's review stated them (#505's merge-gate review): the six codebook files were checked only through the codebook directory, the four code-map tables not at all. #534 fixes both. - One sentence after the closing paragraph: after #505's merge, #534 changed only this section's read-log text and round 10's tooling rows. Section 16 is untouched; the protocol-hash test passes. The record test pins the new wording and drops the stale lines. Tier counts by collection: unit 6,629 -> 6,680 (40 review-root tests, 11 record pins), total 12,766. A smallest-fix differential gains an explicit example that only the fnmatch slash-segment test catches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A Grep filter docs/sub[!x]deep_denied.md voids the review: ripgrep lets a negated class stand for a slash (probed on invented files). - test_v7_voids_whatever_v6_voided pins [,deep_denied.md]: only v6's cut inside the class flags it, so a mutant that narrows v6's cut to slashes now fails. - pattern_kind's docstring states both readings as the code runs them, round 10's smallest fix included, and why case is folded: the root's file system ignores case, and Node's fs glob sets nocase on macOS (read from Node 26's internal createMatcher). - Tier counts by collection: unit 6,681, total 12,767. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Sol review of #534 found five patterns that hold the whole stem, resolve to an invented denied file in an engine, and that v7 classed inside_root: - extglob repetition: deep_denied+([.m])d and *([.m]) (Node); - brace sequences: deep_denied[.,]{m..m}d (Node); - an escaped ] inside a class: deep_denied[.\]]md (Bun); - POSIX [:ascii:] (Node); - backslashes as separators: docs\sub\deep_denied.md (Node). All five reproduce here, and so does d+(e)p_denied.md (Node), a stem spelled by repetition. The fix: - glob_tokens now keeps an extglob as one group token. - A Thompson automaton (_automaton) reads segments exactly, repetition included. glob_match replaces the DP. - New pins_stem: a segment names a denied file when it matches the name and reads no other character at any stem position, case aside. This replaces "the stem appears literally" as the semantic test; the literal tests stay. - New readings: Node's sequences (brace_expansions(sequences=True)), Bun's class escapes (class_end(escapes=True)) in the brace scan and the tokens, and Node's backslash separators. POSIX ascii is added; an unknown POSIX class reads as any printable character. - A pattern nested too deep to read is unclassified, which closes the review's low RecursionError finding. - !(...) still reads as *, so an exclusion filter naming a denied name voids the review. The addendum discloses this. Tests: - transcript cases for every finding; - unit checks for sequences, class escapes, group tokens and POSIX; - differentials: the automaton against Python regular expressions, and pins_stem against a brute-force rule; - the engine corpus gains repetition, sequences, escaped-bracket and ascii classes, and backslash paths. At 1,000 draws it has rg 194, Node 255 and Bun 122 hits, with none missed. Rounds 5-10's read logs and rounds 2-4's codex logs regenerate byte-identical. Section 15's read-log sentence is restated, and section 16 is untouched. Tier counts: unit 6,695, total 12,781. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each pattern is resolved to the invented denied file by one engine only
(probed: ripgrep for deep_{denied[.\]m,zz]}{d}, Bun for
deep_d{enied[.\],]md}). Dropping that engine's brace reading leaves the
pattern inside_root, so the two mutants that survived the last run now
fail.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…to the read-log branch Tier counts by collection on the merged tree: unit 6,834 (#505's 6,766 plus this PR's 68), artifact 3,929, integration_psid 1,346, reproduction_legacy 520, oracle_policyengine 307; total 12,936. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The round-2 Sol review asked for changes: one medium finding and three low. - Medium: in Bun's reading a backslash inside a class escapes the next character, but _class_token still added a backslash member, so [\d]eep_denied.md read as two characters and passed. Bun resolves it to the denied file; the reviewer found 80 such misses. _class_token now takes escapes and drops the backslash in that reading (the reviewer's patch). - A file name holds no /, so a class's / is not another character at a stem position. [d/]eep_denied.md pins the stem as ripgrep reads it; these were four further ripgrep misses in the reviewer's 520 candidates. - Low: a sequence number too long for int() now raises OverflowError and is unclassified, where it used to crash. - Low: the automaton has a closure budget (CLOSURE_LIMIT, 100,000 entries). +()*900 is unclassified in milliseconds, not 5.6 s and 283 MB. - Low: sequences pad exactly, as bash and Node do. The addendum now says "!(...) reads as *", not that every exclusion names the name. The record test pins the new wording and the old wording's absence. All 184 of the reviewer's round-2 candidates that an engine resolves to the denied file while pinning the stem are now flagged, and so are round 1's 38. Rounds 5-10's logs regenerate byte-identical. Tier counts: unit 6,841, total 12,943. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mutant that makes pins_stem compare case survived one run of the 46-mutant check: only the brute-force Hypothesis differential can see it (the folded reading masks it in pattern_kind), and that run drew no two-case class. An explicit example ([aA]b against ab) now kills it on every run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The round-3 review stopped early, but its notes measured slow cases. At
800 characters, unmatched openers ({@([ repeated) took 3.4 s of CPU and
grew cubically: an unclosed [ made class_end rescan to the end every
time it was met. Many classes that may stand for / grow the segment set
quadratically.
- class_end and _extglob_group are memoized (the cached group returns a
tuple), so those scans are quadratic at worst: 0.16 s at the cap.
- PATTERN_LIMIT: a pattern over 1,024 characters is unclassified.
- WORK_LIMIT: readings whose squared lengths sum past 2**24 are
unclassified.
- glob_segments raises OverflowError past BRACE_LIMIT segments, so
[a/]*256 is unclassified at once, not after 3.4 s.
Each limit gives unclassified, which voids the review. Tests cover each
limit, and a pattern at the cap with unbalanced openers is still read
whole. Logs and both review rounds' candidates are unchanged. Unit
tier is 6,844, total 12,946.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PATTERN_LIMIT caught every earlier test pattern for the other limits, so the mutants that drop the closure budget, the work budget, the RecursionError catch and the OverflowError for a long sequence number survived. New test: one pattern under 1,024 characters per limit. Two of them need tightened interpreter limits: a lower recursion limit, and 640 int digits. All 49 mutants are now killed. Unit tier is 6,845, total 12,947. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The round-3 Sol review asked for changes: one medium finding and four
low.
- Medium: a class holding a NUL ([d\0]eep_denied.md) matches the file
in Node and Bun, but the NUL counted as another character at that
stem position. No file name holds a NUL, so pins_stem now ignores
members in NOT_IN_NAMES ("/" and NUL).
- Low: one work budget, charged as the work is done. WORK_LIMIT is now
2**22 scan steps (characters scanned, alternatives built, automaton
states read). pattern_kind sets it for its call and clears the memo
tables after, and the automaton cache keeps 512 entries. The
reviewer's brace products behind 100 unmatched openers are now
unclassified within 0.3 s CPU; they used to run past 8 s.
- Low: CLASS_LIMIT stops a class wider than 1,024 characters before it
is built ([ -\U0010ffff] was 680 MB).
- Low: the segment guard counts only the (k+1)(k+2)/2 valid segments,
so [a/]*64 (2,145 segments) is read, not refused.
- Low: section 15's round-8 bullet now discloses the new refusal limits,
and round 9's schema row is in the past tense. The closing sentence
names the rows this PR touched.
All 1,150 of the round-3 candidates that an engine resolves to the
denied file while pinning the stem are flagged, and so are the seven
NUL cases. Rounds 1 and 2's candidates are still flagged, and rounds
5-10's logs regenerate byte-identical. Unit tier is 6,854, total
12,956.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The work budget also stops a huge class, and a refused pattern voids the review just as a denied one does. So two mutants survived the 53-mutant run: one that drops CLASS_LIMIT, and one that counts invalid segment pairs. New test, at each boundary: a class of CLASS_LIMIT characters is read and one more is not; 64 slash-capable classes before an ordinary name are inside_root (and denied before a denied name), while 90 are unclassified. All 53 mutants are now killed. Unit tier is 6,855, total 12,957. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The round-4 Sol review asked for changes: one medium finding and two low. - Medium: a negative extglob can spell a letter by excluding everything else. Node resolves **/!(|[!d]|??*)eep_denied.md to deep_denied.md, and the automaton read !(...) as *. pattern_kind now classes a pattern that holds !(...) at any depth (_negates) as unclassified, unless some reading already names a denied path or leaves the root. The addendum's sentence and the docstring say so. - Low: CLASS_LIMIT counts every range and member of one class; it used to count each range alone. _class_token and _letters charge their unions to the work budget. - Low: the boundary test the round-4 summary relied on is in this history (306c247), and now also checks a two-range class at the limit. Tests: the two negation forms as transcript cases; a test that stem!(.md) is denied and any other negation unclassified; and negations that spell a letter in the engine corpus. Round 4's 120 engine hits all void the review, except the two controls (**/* and [dx]eep), which do not fix the stem. Rounds 1-3's candidates and rounds 5-10's logs are unchanged. Unit tier is 6,859, total 12,961. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 56-mutant run left alive the mutant that skips CLASS_LIMIT's check on members a class adds after its ranges. New assertions in test_limits_refuse_only_past_their_bounds: a range plus [:ascii:] totalling 1,024 members is read (denied), and 1,025 is unclassified. All 56 mutants are now killed. No test is added, so the tier counts are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The round-5 Sol review asked for changes: two medium findings and one low. - Medium: _extglob_group nested on every (, but Node's minimatch nests only on an extglob opener. So @([d]|(x)eep_denied.md and !(|[!d]|??*|(x)eep_denied.md were never read as groups. A plain ( is now literal. pattern_kind also finds !( in any reading's text (_negation_text), so a negation that does not parse still makes an otherwise unflagged pattern unclassified. - Medium: ripgrep reads the chained range [d-d-d] as d, while Node and Bun read d or -. A chained range is now unclassified, and the addendum's round-8 bullet says so. - Low: each range is bounded on its own and the class is counted after the union, so overlapping ranges of 1,024 distinct members are read. - The review asked for direct budget assertions. A new test checks that a range, a POSIX class and _letters each spend from the work budget. The engine corpus gains plain-paren groups and chained ranges. All 163 of round 5's pinned engine hits void the review, and rounds 1-4's candidates and rounds 5-10's logs are unchanged. Unit tier is 6,864, total 12,966. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The per-range bound changes no classification, since the union check would refuse the class afterwards; it only saves the allocation. A tracemalloc test asserts that refusing [ -\U0010ffff] allocates under 1 MiB, so dropping the bound fails a test. Unit tier is 6,865, total 12,967. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GPT-6.1 Sol round 6 approved 9eb8882 and noted one low item. The code refuses !( outside a class or escape whether or not the group closes, but the addendum and docstring spoke only of !(...). Both now say so, and name the literal spelling ![(]. The negation test now also checks _negation_text directly: !( in a class or after a backslash is no negation, and notes![(]draft.md is read. The review had noted that coverage gap. No code changes and no test is added; the tier counts are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tier counts by collection on the merged tree: unit 9,796 (master's 9,697 plus this PR's 99), artifact 4,240, integration_psid 1,423, reproduction_legacy 520, oracle_policyengine 308; total 16,287. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Merge audit for #534 (read log v7). Reviews. All rounds ran on GPT-6.1 Sol through Subfleet (
Round 7 confirmed the round-6 wording fix; that commit changes no code. Two review attempts never reached a verdict:
Both were re-run on Sol with neutral wording. Merged head. Tier counts by collection on the merged tree: unit 9,796 (master's 9,697 plus this PR's 99), artifact 4,240, integration_psid 1,423, reproduction_legacy 520, oracle_policyengine 308. Total 16,287, matching full collection. Gates.
Evidence of record.
🤖 Generated with Claude Code |
…iers Master gained #525, #534, #538, #543, #544-era changes and #545 since this branch's base (9af5392). Conflicts were the two tier files only; tests/track_u2/test_u2_loader.py, changed on both sides, merged cleanly: the merged file is master's plus exactly this branch's one added test, and this branch's plus exactly master's changes. Every other file equals its one changing side. Tier files rewritten from `pytest --collect-only -q -m <tier>` on the merged tree: unit 9,902, artifact 4,244, integration_psid 1,423, reproduction_legacy 520, oracle_policyengine 308 (16,397), which is master's counts plus this branch's +1 unit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iers Master gained #525, #528, #534, #535, #538, #539, #541, #543, #545, since this branch's base (9af5392). Conflicts were the two tier files only; tests/track_u2/test_u2_loader.py, changed on both sides, merged cleanly: the merged file is master's plus exactly this branch's one added test, and this branch's plus exactly master's changes. Every other file equals its one changing side. Tier files rewritten from `pytest --collect-only -q -m <tier>` on the merged tree: unit 9,902, artifact 4,244, integration_psid 1,423, reproduction_legacy 520, oracle_policyengine 308 (16,397), which is master's counts plus this branch's +1 unit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iers Master gained #525, #528, #534, #535, #538, #539, #541, #543 and #545 since this branch's base (9af5392). Conflicts were the two tier files only; tests/track_u2/test_u2_loader.py, changed on both sides, merged cleanly: the merged file is master's plus exactly this branch's one added test, and this branch's plus exactly master's changes. Every other file equals its one changing side. Tier files rewritten from `pytest --collect-only -q -m <tier>` on the merged tree: unit 9,902, artifact 4,244, integration_psid 1,423, reproduction_legacy 520, oracle_policyengine 308 (16,397), which is master's counts plus this branch's +1 unit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Status: ready for review. Head
b3151f4cis3e07974dwithmaster(ed542625) merged in.9eb88820, served bygpt-6.1-sol. Its one low finding (say that an unclosed!(is refused too) is fixed in3e07974d, with wording and assertions only.20261015-234404-readlog-v7-534-r7.Follow-up to Q6 round 10's two tooling items on the B0.1 review read log (
scripts/track_b_b0_1_review_root.py). It also makes the section 15 wording fix that #505's merge-gate review asked for.What changes
pattern_kind, read-log schematrack_b_b0_1_review_read_log.v7.v6 cut every pattern at
/, braces and commas, even inside[...], and read the pieces with Python'sfnmatchcase. Round 10 showed thatstem[.,]md,stem[!,]mdandstem[{.]mdslipped through.Probing three engines on invented files, and then the Sol review of this PR, found many more forms that they resolve to the file:
fs.globSync, which builds aMinimatchwithnocaseon macOS andwindowsPathsNoEscape, read from Node'sinternal/fs/glob;Bun.Glob.v7 reads a pattern every way these engines might:
Brace readings.
{m..m})./, as Node reads them.Extglobs. Each is read once by the one-occurrence text expansion, and exactly by the automaton below.
Two readings of each text.
fnmatchcasecut, plus round 10's smallest fix (the whole-stem test on/-segments).asciiincluded; an unknown name stands for any printable character),!/^negation, one-character classes and extglob groups are read as the engines read them. In Bun's reading,[\d]isdalone. Segments are cut only outside classes, and a class that may stand for/both cuts and does not. This reader runs with and without class escapes, and again with case folded.The test. A segment names a denied file if:
pins_stem: on an exact Thompson automaton of the segment, it matches the name and reads no other character at any position of the stem, case aside. A class's/is not another character, since a file name holds none. This catches stems spelled by syntax, such as[d]eep,d+(e)p,deep_den{i..i}ed,[\d]eep(Bun) and[d/]eep(ripgrep).Unclassified. These patterns are
unclassified, which voids the review:PATTERN_LIMIT);2**24(WORK_LIMIT);CLOSURE_LIMIT);int().class_endand_extglob_groupare memoized. The worst case at the length limit is about 0.16 s of CPU.Disclosed limits.
!(...)reads as*, so an exclusion filter naming a denied name voids the review. This is conservative (round 1's low L1).?ates.yaml,[gx]ates.yaml,*name_part*.g{a,x}tes.yaml,g*(a|x)tes.yaml), as since round 8.Engine evidence (1 means the engine found
docs/sub/deep_denied.md; v6 classed all of theseinside_root):**/deep_denied[.,]md,[!,],[{.],[^,]**/deep_{denied[.,]md,x},{denied},{.},{{i}}**/deep_denied\.md**/deep_@(denied).md,+(denied),[[:punct:]]**/deep_denied[/.]md;docs/sub[!x]deep_denied.md**/[d]eep_denied.mddocs/sub/DEEP_DENIED.MD;**/Deep_Denied.m?(Node)**/deep_denied+([.m])d,*([.m])d**/deep_denied[.,]{m..m}d**/deep_denied[.\]]md**/deep_denied[[:ascii:]]mddocs\sub\deep_denied.md**/d+(e)p_denied.md**/deep_{denied[.\]m,zz]}{d}**/deep_d{enied[.\],]md}**/[\d]eep_denied.md**/[d/]eep_denied.md**/*,**/*deep*,?ates.yaml,[gx]ates.yamlRound 1's 50 candidates were all rerun, and the 38 that an engine resolves to the denied file are now
denied. Round 2's 520 were rerun too, and all 184 that an engine resolves to the denied file with the stem pinned are nowdenied.Changes after round 3 (rounds 4-6)
!(outside a class or escape that names no denied path isunclassified, whether or not the group closes.!(|[!d]|??*)spellsdin Node. A literal!(is written![(].(inside an extglob is literal, as minimatch reads it; only an extglob opener nests.CLASS_LIMIT(1,024) bounds each range, and then the class after the union, so overlapping ranges are counted once.[a-c-e], which ripgrep reads unlike Node and Bun) isunclassified./or NUL is no other character at a stem position, since no file name holds either.WORK_LIMIT,2**22steps) is charged during expansion, tokenizing and the automaton, and class unions are charged too. The memo tables are cleared after each call.Denied set.
denied_from_recordreturnsdenied_paths ∪ removed ∪ removed_codebook_tables. The CLI uses it for both formats.read_logcompares paths case-folded and recordsn_denied: 31 for rounds 5-10, being 27 removed files and 4 code-map tables.Read logs. Rounds 5-10 were regenerated from the review transcripts and the review roots' records, which are byte-identical to the committed ones.
schemaand addsn_denied.Addendum section 15. Section 16 is untouched, and the protocol-hash test passes.
review_r10.mdlines 28-31 do (Track B B0.1 addendum: freeze B2's record after the d693-d1342 rulings #505's merge-gate ask).test_track_b_b0_1_addendum_record.pypins all of this.Invariants (stated and executed)
pins_stemis the brute-force rule. It agrees with "matches, and no one-position stem change other than case matches" over an alphabet plus a sentinel.fnmatchcaseon shared syntax.,{}, or with negated classes of those: the pattern is stilldenied.denied, oroutside_rootwhere Node reads a leading backslash as/.denied.Mutation check: 60 mutants, all killed
Each mutant is a single edit to the script, run in a scratch copy against
tests/test_track_b_b0_1_review_root.py. All 60 are killed at9eb88820. The runner and results are in the review folder:mutants_runner7.pyandmutants-r7.json.test_read_log_v7_cases[Glob-**/deep_denied[[:punct:]]md-False]test_read_log_v7_cases[Glob-**/deep_d{enied[.\\],]md}-False]test_read_log_v7_cases[Glob-**/deep_{denied}.md-False]test_read_log_v7_cases[Glob-**/deep_denied\\.md-False]test_glob_readings_follow_the_enginestest_read_log_v7_cases[Glob-docs/sub/DEEP_DENIED.MD-False]test_read_log_v7_cases[Read-GATES.YAML-False]test_read_log_v7_cases[Glob-**/deep_denied[[:punct:]]md-False]test_read_log_v7_cases[Glob-**/deep_denied[^,]md-False]test_glob_readings_follow_the_enginestest_read_log_v7_cases[Glob-**/deep_denied[[:punct:]]md-False]test_read_log_v7_cases[Glob-**/deep_denied[[:punct:]]md-False]test_readlog_cli_denies_every_file_the_root_record_removedtest_read_log_v7_cases[Glob-[a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/]deep_denied.md-False]test_read_log_v7_cases[Glob-**/deep_denied[[:punct:]]md-False]test_read_log_v7_cases[Grep-docs/sub[!x]deep_denied.md-False]test_v7_catches_what_round_10_s_smallest_fix_wouldtest_v7_voids_whatever_v6_voidedtest_v7_voids_whatever_v6_voidedtest_read_log_v7_cases[Glob-**/deep_{denied[.\\]m,zz]}{d}-False]test_read_log_v7_cases[Glob-**/deep_denied[[:punct:]]md-False]test_glob_readings_follow_the_enginestest_read_log_v7_cases[Glob-**/deep_denied[[:punct:]]md-False]test_class_unions_are_charged_to_the_work_budgettest_read_log_v7_cases[Glob-**/deep_denied[.,]{m..m}d-False]test_read_log_v7_cases[Glob-**/deep_denied[.,]{m..m}d-False]test_read_log_v7_cases[Glob-**/deep_denied[.\\]]md-False]test_read_log_v7_cases[Glob-**/deep_d{enied[.\\],]md}-False]test_read_log_v7_cases[Glob-**/deep_denied[.\\]]md-False]test_read_log_v7_cases[Glob-docs\\sub\\deep_denied.md-False]test_class_unions_are_charged_to_the_work_budgettest_glob_readings_follow_the_enginestest_read_log_v7_cases[Glob-**/deep_denied+([.m])d-False]test_the_automaton_matches_as_a_regular_expressiontest_read_log_v7_cases[Glob-**/deep_denied+([.m])d-False]test_a_negation_is_unclassified_unless_it_names_a_denied_pathtest_read_log_v7_cases[Glob-**/d+(e)p_denied.md-False]test_pins_stem_is_the_brute_force_ruletest_each_work_limit_holds_below_the_length_limittest_pins_stem_is_the_brute_force_ruletest_glob_readings_follow_the_enginestest_each_work_limit_holds_below_the_length_limittest_each_work_limit_holds_below_the_length_limittest_glob_readings_follow_the_enginestest_read_log_v7_cases[Glob-**/[d/]eep_denied.md-False]test_patterns_too_large_to_read_are_unclassified[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]test_patterns_too_large_to_read_are_unclassified[[a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/][a/]deep_denied.md]test_patterns_too_large_to_read_are_unclassified[{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{a,b}{a,b}{a,b}{a,b}{a,b}{a,b}{a,b}{a,b}{a,b}{a,b}{a,b}{a,b}deep_denied.md]test_read_log_v7_cases[Glob-**/[d\x00]eep_denied.md-False]test_a_wide_range_is_refused_before_it_is_builttest_each_work_limit_holds_below_the_length_limittest_limits_refuse_only_past_their_boundstest_ranges_are_bounded_one_by_one_and_counted_after_the_uniontest_ranges_are_bounded_one_by_one_and_counted_after_the_uniontest_limits_refuse_only_past_their_boundstest_a_negation_is_unclassified_unless_it_names_a_denied_pathtest_read_log_v7_cases[Glob-**/[d-d-d]eep_denied.md-False]Tier counts (by collection, merged tree)
Unit is 9,796: master's 9,697 at
ed542625plus this PR's 99, which are 82 review-root tests and 17 record pins. The other tiers are unchanged, and the total is 16,287. I will recount againstmasterwhen the slot comes.Not determined here
axiom: n/a: review tooling and its record only (no policy encoding)
🤖 Generated with Claude Code