The seed harvest broke three contracts main relies on: _run(cli, cmd)
returned a dict (main's test asserts a plain string) and _SlashWorker.run
returned a (output, seed) tuple (main's fakes return a bare string, so
slash.exec hit 5030 / the mirror busy-warning path never fired / the
concurrent-spawn fake 403'd). Keep both string APIs and carry the seed
separately: _run parks it on cli._harvested_seed, the worker process
replies it on the existing 'seed' field, and _SlashWorker.run stores it
for a pop_seed() the gateway calls after run().
Two tests asserted the live /prompt viewer this PR intentionally removes
(compose-only /prompt); updated minimally: the r7 read-command case drops
its 'prompt' entry and the mutating-mirror test drops its /prompt row.