Skip to content

Rewrite the README as a front page - #15

Merged
ferris007 merged 2 commits into
mainfrom
readme-polish
Aug 24, 2026
Merged

ferris007 merged 2 commits into
mainfrom
readme-polish

Conversation

@ferris007

@ferris007 ferris007 commented Aug 24, 2026 •

Copy link
Copy Markdown
Owner

The old README had grown by accretion — each phase appended its news to the top, so a first-time reader met the project through whatever had most recently been built rather than through what it is.

This is the usual shape for a repository people evaluate in thirty seconds: badges, a demo above the fold, a feature table, install and usage, architecture, then the deeper material.

Nothing was softened to fit it

The scope note is still the second thing on the page:

Scope. rsh runs real command lines and is pleasant to use, but it is not a drop-in shell. It has no &&, ||, ;, globbing, command substitution, or multi-line input.

And "Not implemented" is now a table rather than a buried sentence — which makes the gaps easier to read, not easier to miss.

Every claim checked against the binary

Not against memory:

  • key bindings against the editor's match arms
  • builtins against the lookup table
  • environment variables and file names against the constants
  • cd ~, cd -, globbing pass-through, refused syntax, and the no-prompt path all run
  • the demo transcript through a pseudoterminal

Also verified: all 7 markdown tables have consistent columns, and every relative link resolves.

One inconsistency it surfaced

The --benchmark figures were measured on a debug build but sat under an install section that says --release, where they are about twice as fast — 0.48 ms of startup rather than 0.82.

Both the README and docs/performance.md now report release numbers and say which build they came from.

The old one had grown by accretion: each phase appended its news to the top,
so a first-time reader met the project through whatever had most recently been
built rather than through what it is.

This is the usual shape for a repository people are meant to evaluate in thirty
seconds — badges, a demo above the fold, a feature table, install and usage,
architecture, then the deeper material. Nothing was softened to fit it. The
scope note is still the second thing on the page, and "Not implemented" is now
a table rather than a sentence, which makes the gaps easier to read rather than
easier to miss.

Every claim in it was checked against the binary rather than against memory:
the key bindings against the editor's match arms, the builtins against the
lookup table, the environment variables and file names against the constants,
and the demo transcript through a pseudoterminal.

One inconsistency surfaced while doing that. The `--benchmark` figures were
measured on a debug build but appear under an install section that says
`--release`, where they are about twice as fast. Both the README and
docs/performance.md now report the release numbers and say which build they
came from.
@coderabbitai

coderabbitai Bot commented Aug 24, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: aa6982f6-cc7d-47fb-97cd-3c14927300f1


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

The budget test failed on CI's macOS runner: parsing `ls` measured 17
allocations against a ceiling of 14, while measuring 8 locally. Not a
parser regression — harness noise.

The counter is a global in the process, so it counts every allocation
made anywhere while it runs, including ones on another thread. libtest
runs each test on its own thread and formats results on the main one,
and that formatting allocates. Beside one other test, `ls` measures
anywhere from 15 to 62.

The file already knew this and tried to fix it by collapsing every
assertion into a single test, but that leaves the harness's own threads
running. Filtering by thread is the obvious next move and the wrong one:
asking which thread you are on means touching thread-local storage from
inside the global allocator, and on some platforms the first such touch
allocates, straight back into the allocator that asked.

So the target sets `harness = false` and is a plain `main`. One thread,
nothing else in the process, and 224 runs — 96 of them concurrent under
load — produce byte-identical output. The ceilings are unchanged, since
the measurements were never over them.

Two things fall out. `report_measured_counts` is gone: the table now
prints on every run, pass or fail, which is all that test did. And a
breach reports every case that is over rather than stopping at the first.
@ferris007
ferris007 merged commit dcd82a2 into main Aug 24, 2026
5 checks passed
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