Commit Graph

1825 Commits

Author SHA1 Message Date
dependabot[bot] 806c0df361 build(deps): bump actions/github-script from 7.1.0 to 9.0.0
Bumps [actions/github-script](https://github.com/actions/github-script) from 7.1.0 to 9.0.0.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/f28e40c7f34bde8b3046d885e986cb6290c5673b...3a2844b7e9c422d3c10d287c895573f7108da1b3)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-09 00:30:42 +00:00
Nicolas Le Cam 8e9aa04cb2 Merge pull request #3258 from breisnerlopez/fix/grep-l-max-len-collision
test(grep): pin -l/-L parity with grep, including numeric patterns
dev-0.49.0-rc.418
2026-09-09 02:06:09 +02:00
Nicolas Le Cam d554bef221 test(grep): cover the numeric pattern that -l silently swallowed
A non-numeric pattern stops at clap's parse error and falls back to raw
grep, so rtk and grep agree byte-for-byte whether or not `-l` is bound to
--max-len: the three existing cases still pass with the bug reintroduced.
Only a numeric pattern reaches the wrong answer -- rtk printed nothing and
exited 1 where grep listed the file.

Drop the clap-level test and the comment sentence with it. Develop's
test_grep_parse_files_with_matches_l already fails under the same mutation,
and -L never had a short binding on --max-len, so src/main.rs is untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 01:53:30 +02:00
Nicolas Le Cam 77ba5c9aca Merge pull request #3278 from rtk-ai/feat/retriever-recall
feat(recall): SQLite recall system
dev-0.49.0-rc.417
2026-09-09 01:34:28 +02:00
Nicolas Le Cam ab09904e10 refactor(recall): drop the unreachable no-hash arm in run_recall
The usage guard returns early when no hash and no --list is given, and
--list returns before this match, so the arm could never run. Removing it
keeps the usage string in one place.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 01:08:31 +02:00
Adrien Eppling ddc2182609 feat(recall): name an over-recalled filter, and clear its counters on gain --reset
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 20:36:57 +02:00
Adrien Eppling 7c10f7791c fix(benchmark): ignore the recall hints when counting find entries
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 16:53:02 +02:00
Adrien Eppling 473edaf247 fix(recall): keep tee mode free of any sqlite artifact
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 16:52:59 +02:00
breisnerlopez 74ec07017f fix(grep): put --max-len before positionals in bench; reuse assert_eq_grep
Address review:
- benchmark.sh: with trailing_var_arg on extra_args, --max-len after the
  positionals was swallowed and forwarded raw to grep (unknown option ->
  bench FAIL). Move it before -rn/pattern so rtk parses it; verified 320KB
  -> 14.8KB (~95%) and that --max-len 40 vs 200 changes output size.
- grep_faithful_format_test: the inline cmp closure duplicated the existing
  assert_eq_grep helper (rtk_grep + grep_plain, same stdout/exit asserts);
  drop it in.
2026-09-08 15:30:49 +02:00
breisnerlopez 5681008ca9 fix(grep): free -l for GNU --files-with-matches instead of --max-len
`-l` was bound to RTK's `--max-len`, colliding with GNU grep where `-l`
means `--files-with-matches`. Running `grep -l <pattern>` made clap read
the pattern as a usize and error (`invalid value '<pattern>' for
'--max-len'`), dropping the command to a raw-grep fallback at 0% savings.

Drop the short binding. `-l`/`-L` now flow to `extra_args`, where the
existing `has_format_flag` already routes them to the grep passthrough
(GNU semantics, minimal output). `--max-len` keeps its long form and its
default of 80; nothing internal used the short.

- src/main.rs: remove `short = 'l'` from `Grep::max_len` + clap-parse
  regression test.
- tests/grep_faithful_format_test.rs: end-to-end test asserting
  `rtk grep -l/-L` is byte-identical to `grep -l/-L`, covering `-l`
  leading and trailing.
- scripts/benchmark.sh: the max-len bench used the old `-l 40` alias ->
  `--max-len 40`.
- docs/usage/FEATURES.md: drop the `-l` short from the grep options table.
2026-09-08 15:30:49 +02:00
Adrien Eppling a882419bac fix(recall): keep legacy tee always semantics, sqlite stays failure driven
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:29 +02:00
Adrien Eppling 2b13d80c37 fix(recall): store the hidden tail when the cap cannot hold the shown prefix
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:28 +02:00
Adrien Eppling feb8aeb644 revert(recall): drop tee_on_success, recovery stays failure and truncation driven
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:27 +02:00
Adrien Eppling 9f37717319 fix(config): single shared legacy-tee mapping for load and config recall
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:26 +02:00
Adrien Eppling dd1c21a473 fix(recall): hidden-lines hint reflects what recall can actually return
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:26 +02:00
Adrien Eppling 8969fa49c5 feat(recall): tee_on_success restores legacy always behavior, accurate migration notices
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:25 +02:00
Adrien Eppling d93fd4fff5 fix(recall): byte-faithful --grep, cached store connection, serialized env tests
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:24 +02:00
Adrien Eppling 7c743443ff fix(recall): read paths never create the database
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:23 +02:00
Adrien Eppling 1dcb7ecd54 fix(recall): evict by recency excluding the just-stored hash
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:22 +02:00
Adrien Eppling 439c25164d fix(recall): adapt upstream ctest/ls/tsc integration after rebase
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:22 +02:00
Adrien Eppling d8a80dfab5 fix(recall): review nits — literal-grep note, dead aws hint branch, doc drift, sorted families
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:21 +02:00
Adrien Eppling 817e230e97 fix(recall): store NULL exit code on truncation paths instead of fake 0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:20 +02:00
Adrien Eppling bdfdeea37a fix(recall): evict by rowid so same-second bursts keep the newest entry
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:20 +02:00
Adrien Eppling c09d63eed8 fix(config): merge legacy tee fields when a retriever section coexists
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:19 +02:00
Adrien Eppling e7447e1f06 fix(recall): honor kill switches in hook-side tee read tracking
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:18 +02:00
Adrien Eppling 6633d66c5f fix(recall): preserve recalled flag when identical output is re-stored
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:18 +02:00
Adrien Eppling bfc630995f fix(recall): canonicalize stats keys across elision, recall and TOML paths
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNqtCagEUryc1fgw62APkm
2026-09-08 14:12:17 +02:00
Adrien Eppling b158152ef7 feat(telemetry): report recall efficiency counters per filter family 2026-09-08 14:12:16 +02:00
Adrien Eppling a53373191d feat(recall): content-addressed recall store with selectable [retriever] mode
sqlite (default) queried by 'rtk recall'; tee (legacy files) and disabled modes retained.
2026-09-08 14:12:15 +02:00
Nicolas Le Cam f7495466ed Merge pull request #2515 from allanbatista/codex/fix-native-test-expression
[codex] fix native test expression passthrough
dev-0.49.0-rc.416
2026-09-08 03:37:13 +02:00
Nicolas Le Cam 80e45683be test(test): cover Commands::Test routing end to end
The unit tests exercise `is_native_test_expression` directly, so inverting or
dropping the branch that calls it left the suite green while `rtk test -d dir`
went back to `sh: 0: Illegal option -d`.

Run the binary instead: native expressions carry the system `test` exit code,
`!` is neither answered backwards nor allowed to swallow a command, argument
boundaries survive, and a command still reaches the test runner.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 03:23:44 +02:00
Nicolas Le Cam 98e66e0540 fix(test): treat ! and ( as native only when what follows is
`!` and `(` are shell syntax as well as `test` syntax, so matching them on
the first token alone captured invocations the shell path ran correctly:
`rtk test ! false` returned 1 instead of 0, and `rtk test ! cargo --version`
stopped running cargo and reported `test: missing argument after '--version'`.

Recurse instead, so `!` and `(` mark a native expression only when what they
apply to is one. Measured against `/usr/bin/test` over 526 generated
expressions: unchanged at 212 mismatches (down from 411 before the fix), with
the shell-command forms back to their previous exit codes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 03:23:44 +02:00
Nicolas Le Cam d701ad9690 Merge pull request #3083 from lntutor/fix/2669-ruff-subcommand-routing
fix(ruff): preserve non-check subcommands
dev-0.49.0-rc.415
2026-09-08 02:54:05 +02:00
Nicolas Le Cam 9512e1ab56 Merge pull request #3268 from iliaal/up/diff-correctness
fix(diff): stop reporting differing files as identical, and align by LCS
2026-09-08 02:47:45 +02:00
Nicolas Le Cam db98a064b1 Merge upstream/develop into up/diff-correctness
#3788 rewrote the piped-stream half of diff_cmd.rs (condense_stdin,
condense_unified_diff_strict) while this branch rewrote the file-versus-file
half (Hunk, compute_diff, the renderers). The two conflicts are positional:
both sides add code at the same offset. Resolved as a union -- develop's
imports plus this branch's, and both blocks kept whole.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 02:21:03 +02:00
Nicolas Le Cam afa9caee64 test(ruff): pin the subcommand list against ruff's CLI
known_ruff_subcommands_do_not_route_through_check iterates RUFF_SUBCOMMANDS,
so dropping an entry from the constant leaves it green. Pin the list literally
so a missing subcommand fails the suite.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 02:20:58 +02:00
Nicolas Le Cam 665b2720cf Merge pull request #560 from rtk-ai/docs/prompt-caching-faq
docs: add prompt caching FAQ (RTK does not break cache)
dev-0.49.0-rc.413
2026-09-08 02:06:54 +02:00
Nicolas Le Cam c81c09775d docs: move the prompt-caching answer into the published guide
The section landed in docs/TROUBLESHOOTING.md, a flat file removed in
a94e9493 when the docs were consolidated. Content there does not reach
the published guide, and the copy reintroduced install guidance that
develop had already pinned to --branch master.

Move the answer into docs/guide/resources/troubleshooting.md and drop the
duplicated Type Kit collision section, which that guide already covers.

The cache write/read breakdown is reported by `rtk cc-economics`, not by
`rtk gain`, so point readers at the command that actually shows it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 01:54:14 +02:00
Nicolas Le Cam faaa446b9f Merge upstream/develop into docs/prompt-caching-faq 2026-09-08 01:54:00 +02:00
Ilia Alshanetsky 501dd01cec fix(diff): name the crossed ~ in the legend, and stop the byte refusal claiming non-membership
`~ N→M` carries both files' numbering, but the legend still called `~` a file1
marker, and gating the note on `diff.added` dropped it from a deletions-plus-
crossing render entirely: two frames on screen, nothing saying so. The legend
now keys on the shapes actually listed. A crossed `~` earns its own clause,
`~ N→M spans both files`, owed whether or not a `+` is present, which also
tells the two `~` shapes apart when one listing carries both and nothing in
the markers does.

The `EditScript` refusal said "only in a.txt: 1 line, only in b.txt: 1 line"
for two 1.1MB minified files differing by one character. Those counts are
pre-pairing, so the two lines would have rendered as a single `~`; "only in"
is a claim about content and it was false in both halves. It now reads "1 line
changed in a.txt, 1 line changed in b.txt", which states what is known without
pairing them.

Tests: the crossed render asserts through `render_diff` rather than
`format_diff_changes`, which is where the legend is composed and why the
inconsistency shipped green. `render_file_diff`'s docstring states that rule
for render-shape assertions so the next one lands at the right level. New
cases cover the legend for a crossing beside deletions, beside insertions, and
beside a plain `~`.
2026-09-07 19:42:37 -04:00
Nicolas Le Cam ab0cf40112 Merge pull request #3788 from kylehgc/claude/upstream-issue-comments-4pky96
fix(diff): region parser for condense_unified_diff — budget-owned hunks, raw fallback
dev-0.49.0-rc.412
2026-09-08 01:22:52 +02:00
Nicolas Le Cam a2d9f01577 Merge pull request #253 from TheGlitching/feat/sqlfluff-lint
feat: add rtk sqlfluff lint with JSON filter (~75% token reduction)
2026-09-08 01:21:20 +02:00
Nicolas Le Cam b0d471eb5b Merge pull request #3343 from rtk-ai/fix/pipe-safe-consummer-and-slim-instructions
feat(rewrite): rewrite in pipe when consummer is safe
dev-0.49.0-rc.410
2026-09-08 00:35:51 +02:00
Nicolas Le Cam ceb1d1758e test(rewrite): cover every shell spelling of an unsafe consumer flag
The consumer-flag cases were a hand-maintained list that grew one literal per
review round, so each new spelling was found by review rather than by a test.

Generate the spellings from SAFE_PIPE_CONSUMERS instead: every unambiguous
long-option prefix getopt_long accepts, each in bare, double-quoted,
single-quoted, backslash-escaped and =value form, and every unsafe short flag
bare, quoted, escaped and bundled. A consumer added to the table later is
covered on arrival.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 00:29:30 +02:00
TheGlitching ebf4cbf539 fix(sqlfluff): always filter, and share one decision between both entry points
sqlfluff exits 1 whenever it finds violations, which is the normal case this
filter exists for. Two changes in the last push read that exit code as failure
and so disabled the filter exactly when it had something to compress:

- `sqlfluff_cmd` used `early_exit_on_failure()`, which dumps the injected JSON
  raw. On a 51-file corpus that is 9.8 KB where plain `sqlfluff lint` is 1.1 KB.
- `lint_cmd` substituted `result.stderr`, which is always empty: sqlfluff writes
  even fatal errors to stdout (verified against 2.3.5 and 4.3.0 - `Error:
  Unknown dialect 'NOPE'` on stdout, stderr empty, exit 2). Every violation was
  discarded in favour of a 25-byte `SQLFluff: failed (exit 1)`.

Both are one bug reached two ways, because both entry points restated the same
routing and format-flag logic and were then edited differently. Extract it into
`sqlfluff_cmd::plan`, which states once how rtk invokes sqlfluff and how it
reads the result back; `lint_cmd` now calls it instead of keeping a copy. The
exit code only disambiguates output the filter could not parse, so a fatal error
reaches the user verbatim while violations are still summarized.

Also in the report:

- Rank the `Violations:` section worst-file-first like every section above it.
  Iterating sqlfluff's emission order and taking the first 50 dropped exactly
  the file the summary ranked first.
- Build only the lines that get printed, instead of every line to keep fifty.
- Omit positions sqlfluff did not report rather than fabricating `:0:0`.
- Keep two path segments when no dbt root matches, so `migrations/orders.sql`
  and `reports/orders.sql` stay distinct in the section meant to be opened.
- Treat a missing `fixes` key as unknown rather than zero. sqlfluff 2.x omits it
  entirely, which silently suppressed the `sqlfluff fix` hint.
- Rename the savings test to the bound it actually asserts.

Tests cover both regressions against real captured output: 4.3.0 for the current
field names and fix data, 2.3.5 for the legacy names and the absent `fixes` key.
2026-09-07 23:46:53 +02:00
kylehgc 27abf4ad7f fix(diff): round 8 -- silent-loss and name-fidelity sweep across git, GNU diff, hg and svn
Review round 7 asked for two things; a producer enumeration and two
adversarial review passes answered for thirty. Every item below has a
real capture in the corpus (81 fixtures now: git 2.47/2.54, diffutils
3.10 and 3.12, Mercurial 7.0, Subversion 1.14, PowerShell) and a test
that fails without the fix.

Silent loss (a file or content line missing while the output looked
complete) -- each now returns `None`, byte-exact raw passthrough:

- GNU sorts its output, so a fact the parser cannot read (`File X is a
  fifo ...`, `Symbolic links ... differ`, a translated `Only in`) can
  come before the first `Only in` / `Binary files` / `Files` line, and
  `-q` streams carry no echo at all. The latch is now `dropped_line` --
  any column-0 line dropped as prose outside a message region -- and is
  judged once after the loop against `gnu_stream`, which GNU's fact arms
  set as well as its echo (hg's echo does not: an `hg log -p --template`
  prologue is prose, not a fact).
- `hg export`'s region stayed open until the first header pair and
  swallowed `Binary file bin.dat has changed` on a binary-first
  changeset. hg's `diff -r` echo (one `-r` from `hg diff`, two from
  `hg export` / `hg log -p`) now closes the region, counts as reaching
  its body, and the line is a binary fact; rule 6 stays live inside an
  hg region. `hg log -p`'s `changeset:` line opens the region like
  `# HG changeset patch` does.
- `git diff --word-diff` / `--color-words` hunks whose lines are all
  indented carry their `[-x-]{+y+}` markers behind the indent, so the
  hunk was booked as context and the file vanished. A hunk that closes
  with no `-`/`+` line is not a unified-diff shape (whitespace-ignoring
  modes suppress the hunk) -> `None`.
- `git format-patch --submodule=log` puts `Submodule sub a..b:` where a
  file section would go, inside the message region where rule 6 is
  suppressed. The strict `<hex>..<hex>[ (<how>)]:` shape is admitted
  there (`is_submodule_range`); prose never ends a line that way.
- A stream cut off right after `diff --git` / `index` dropped the file
  it named: git never emits a header-only section, so one that closes
  with nothing behind it -> `None` (`FileEntry::from_git`; `flush`
  returns `Option`). git's `index` / `similarity index` lines are
  structural and no longer count as dropped prose.
- A plain `svn diff` names a binary only as `Index: b.dat` + `Cannot
  display: file marked as a binary type.`, both prose before: the
  binary vanished beside its text siblings. `Index: <path>` opens a
  section (rule 3c); the notice is its binary note; an `Index:` section
  that closes empty is `(no content)` (a copy/move target) unless a
  column-0 line was dropped inside it (a localized notice) -> `None`.
- A binary section followed by another producer's header pair was
  renamed in place and its `binary` note landed on the next file; a
  pair after a binary section opens its own section.

A crash: the shared-tail scan behind `diff --git X Y` and `Binary files
X and Y` compared bytes, and two different multi-byte characters can
share trailing bytes (`😀`/`🙀`, `é`/`©`): the slice landed mid-character
and the process aborted with no output at all. The scan backs off to a
character boundary on both sides.

Names, byte-equal to the real filename under the producer's own root:

- `dequote` decodes git's C quoting (`"caf\303\251.txt"` -> `café.txt`)
  instead of stripping the wrapper; a name that would split a `[file]`
  line (newline) or is not UTF-8 keeps git's own quoted spelling, with
  the prefix stripped inside the quotes, so `rename to`, `diff --cc` and
  the header pair agree on one spelling and two Latin-1 names stay two.
- `unquote_shell` decodes diffutils >= 3.11's shell quoting on `Only in`
  / `Binary files` names -- `'…'`, `$'…'` and the `"…"` form it picks
  for a name holding a `'`; a quoted directory may itself hold `: `, so
  the `Only in` split follows the quoting (`shell_word_len`). 3.10
  prints those names bare; a bare `Only in` with more than one `: `
  splits at the root the stream already named on its echo, header pairs
  or `Binary files` lines. Both generations are in the corpus.
- `diff --git X Y` is split where the sides share the longest tail at a
  `/` boundary (`shared_tail`); the first path component before the
  tail on each side is that side's prefix (`FileEntry::prefixes`
  replaces `prefixed`): `a/`/`b/`, `i/`/`w/` under
  `diff.mnemonicPrefix`, `--src-prefix`/`--dst-prefix`, none under
  `--no-prefix`. The header pair strips exactly those, so `* Unmerged
  path b/inb.txt` folds into its `i/b/inb.txt w/b/inb.txt` section, a
  binary under a directory named `x b/` keeps its path, and `git diff
  --no-index d1/f d2/f` names `d2/f`. `diff --cc <path>` is kept whole;
  `--no-index --no-prefix x.bin y.bin` names `y.bin`.
- GNU diff names files under the roots it was given, never prefixes:
  header pairs after a GNU echo and the standalone `Binary files` /
  `Files` arms keep them (`diff -ru a b` -> `b/c.txt`, `diff -ru .
  ../new` -> `../new/x`), splitting `X and Y` by the same shared tail.
- Timestamps are stripped from `---`/`+++` lines only, at the LAST tab
  and only when shaped like one of the real producers' (GNU ISO date,
  hg `Mon Sep 07 …`, svn `(revision 1)`, git's bare tab), so a name
  containing a tab survives even under `hg diff --nodates`.
- An `* Unmerged path` fact git printed unquoted and cut at a newline
  folds into its quoted section instead of a phantom entry.

Spurious raw fallbacks on well-formed streams, now condensed: `git log
--stat -p` / `git show --stat -p` (bare `---` followed by a diffstat
line is the separator -- which also drops the old ` name | 3` bound),
`git log --numstat -p` (`-<TAB>-<TAB>` binary rows), `hg log -p` with
and without `--template`, an hg binary-only changeset whose message has
a marked non-prose line, `--format=%B` prose starting with `diff ` (the
GNU echo arm keys on `diff -`), `diff -u` on directories (`Common
subdirectories:` dropped), an svn copy/move target.

Also: GNU `-s` / `-q` facts are entries; a PowerShell-written stream's
UTF-8 BOM is stripped; a submodule both dirty and moved is one entry;
the budget replay in property (a) asserts under-consumption; the docs
list rule 1b and every bound is executable in `documented_bounds_hold`.
2026-09-07 15:56:00 -04:00
Adrien Eppling 280d0918b5 Merge origin/develop into fix/pipe-safe-consummer-and-slim-instructions
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UAVhpAvWDmsEWuLehm9RAo
2026-09-07 18:29:15 +02:00
Adrien Eppling 148e0d443e fix(rewrite): PipelineSafety enum, quote-aware consumer args, fd-dup redirects, stage rewrite consolidation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UAVhpAvWDmsEWuLehm9RAo
2026-09-07 14:44:15 +02:00
Nicolas Le Cam d9a6dba6fc Merge pull request #3372 from rtk-ai/clean/awareness-file
fix(awareness): slim awareness text
dev-0.49.0-rc.409
2026-09-07 12:39:34 +02:00
Adrien Eppling 9bc4323916 Merge origin/develop into clean/awareness-file
Resolved: awareness constants vs Pi/OMP rework, InitContext destructures,
bun/deno CLI additions, write_if_changed split.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DVD4ZD5wiSjSsNpKCK6h7q
2026-09-07 11:06:29 +02:00