- rc 2 for input that cannot be graded: a root that is missing or is not a
directory, an unreadable or corrupt manifest (bad JSON, no entries list, a
malformed entry, an unknown type), and a manifest that cannot be written.
rc 1 is reserved for a graded fault, rc 0 for a clean check.
- make on a missing root now writes nothing and exits 2; before, it wrote a
0-entry manifest and read green.
- _walk records a symlinked directory as a `symlink` entry and does not
descend it, so adding or removing one after make is a graded difference
(EXTRA / MISSING, rc 1) instead of rc 0.
- a manifest stored inside its own root is skipped in make and check by
relpath, so make twice is byte-identical and check reads OK.
- a root it cannot read (OSError from os.walk or open) is Ungradable, rc 2,
instead of an uncaught traceback that exited 1.
CHECK: python3 wizard-work/beam/manifest.py make /root/troupe-standup/wizard-work/beam /tmp/q79-manifest.json && python3 wizard-work/beam/manifest.py check /root/troupe-standup/wizard-work/beam /tmp/q79-manifest.json