Ruled by sneak's rule for the 1.0 format (#81 (comment)): nothing goes in the 1.0 manifest that 1.0 does not read or write. mfer never writes mimeType (field 301) or ctime (field 303) (#81 (comment)), so both go; sneak confirmed the answer stands (2026-10-19, in chat).
Done when:
mimeType and ctime are removed from mf.proto and from the generated code, with their field numbers listed as reserved there so a later version cannot reuse them by accident;
nothing in the library or the commands reads or prints them (export included);
docs/FORMAT.md no longer describes them, and its test vector is regenerated if it changes;
tests cover a manifest with neither field; make check green; one reviewed PR on next.
This is a format change on a release candidate (v1.0.0-rc2); when it lands with no known bug open, the next release candidate is tagged on next.
Model: opus-5-5
Ruled by sneak's rule for the 1.0 format (https://git.eeqj.de/sneak/mfer/issues/81#issuecomment-127074): nothing goes in the 1.0 manifest that 1.0 does not read or write. mfer never writes `mimeType` (field 301) or `ctime` (field 303) (https://git.eeqj.de/sneak/mfer/issues/81#issuecomment-136431), so both go; sneak confirmed the answer stands (2026-10-19, in chat).
**Done when:**
- `mimeType` and `ctime` are removed from `mf.proto` and from the generated code, with their field numbers listed as reserved there so a later version cannot reuse them by accident;
- nothing in the library or the commands reads or prints them (`export` included);
- `docs/FORMAT.md` no longer describes them, and its test vector is regenerated if it changes;
- tests cover a manifest with neither field; `make check` green; one reviewed PR on `next`.
This is a format change on a release candidate (`v1.0.0-rc2`); when it lands with no known bug open, the next release candidate is tagged on `next`.
Model: opus-5-5
mfer/mf.proto: remove mimeType (301) and ctime (303) from MFFilePath and reserve both numbers and both names there; regenerate with make generate and commit mf.pb.go and mf.proto.sha256.
mfer/constants.go, mfer/deserialize.go: checkDecodedSize stops counting 301 and 303. Loading already drops fields it does not know, so either number in a manifest costs nothing and is dropped. Comments that list "MIME types" lose it.
mfer/scanner.go: remove FileEntry.Ctime, which nothing sets.
internal/cli/export.go: export no longer has a ctime key.
docs/FORMAT.md: drop both rows and the MIME types from the decoded-size sentence; say plainly that mf.proto reserves 301 and 303 and no field uses them, so it does not contradict "no field is reserved or kept for later use". The test vector holds neither field, so its bytes should not change; regenerate it only if they do.
README.md: no line promises ctime in the manifest (the "contain ctime/mtime information" goal and the "zero/omit mtime/ctime" hope).
Tests: TestFileEntryFieldsMatchSpec lists the fields left and checks 301 and 303 are reserved; a manifest whose entries carry 301 and 303 loads with both dropped; export of a manifest prints no ctime; TestDeserializeRefusesEntriesThatDecodeTooLarge reworked for the new counts, with its arithmetic in the comment re-derived.
Model: opus-5-5
Plan, one PR on `next`:
- `mfer/mf.proto`: remove `mimeType` (301) and `ctime` (303) from `MFFilePath` and reserve both numbers and both names there; regenerate with `make generate` and commit `mf.pb.go` and `mf.proto.sha256`.
- `mfer/constants.go`, `mfer/deserialize.go`: `checkDecodedSize` stops counting 301 and 303. Loading already drops fields it does not know, so either number in a manifest costs nothing and is dropped. Comments that list "MIME types" lose it.
- `mfer/scanner.go`: remove `FileEntry.Ctime`, which nothing sets.
- `internal/cli/export.go`: `export` no longer has a `ctime` key.
- `docs/FORMAT.md`: drop both rows and the MIME types from the decoded-size sentence; say plainly that `mf.proto` reserves 301 and 303 and no field uses them, so it does not contradict "no field is reserved or kept for later use". The test vector holds neither field, so its bytes should not change; regenerate it only if they do.
- `README.md`: no line promises `ctime` in the manifest (the "contain ctime/mtime information" goal and the "zero/omit mtime/ctime" hope).
- Tests: `TestFileEntryFieldsMatchSpec` lists the fields left and checks 301 and 303 are reserved; a manifest whose entries carry 301 and 303 loads with both dropped; `export` of a manifest prints no `ctime`; `TestDeserializeRefusesEntriesThatDecodeTooLarge` reworked for the new counts, with its arithmetic in the comment re-derived.
Model: opus-5-5
Built as planned above in #237. One judgement call, stated in the PR: the test of entries that decode too large gives each entry a second, empty hash, since an entry with one hash and a modification time can no longer reach the limit.
Model: opus-5-5
Built as planned above in https://git.eeqj.de/sneak/mfer/pulls/237. One judgement call, stated in the PR: the test of entries that decode too large gives each entry a second, empty hash, since an entry with one hash and a modification time can no longer reach the limit.
Model: opus-5-5
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ruled by sneak's rule for the 1.0 format (#81 (comment)): nothing goes in the 1.0 manifest that 1.0 does not read or write. mfer never writes
mimeType(field 301) orctime(field 303) (#81 (comment)), so both go; sneak confirmed the answer stands (2026-10-19, in chat).Done when:
mimeTypeandctimeare removed frommf.protoand from the generated code, with their field numbers listed as reserved there so a later version cannot reuse them by accident;exportincluded);docs/FORMAT.mdno longer describes them, and its test vector is regenerated if it changes;make checkgreen; one reviewed PR onnext.This is a format change on a release candidate (
v1.0.0-rc2); when it lands with no known bug open, the next release candidate is tagged onnext.Model: opus-5-5
Plan, one PR on
next:mfer/mf.proto: removemimeType(301) andctime(303) fromMFFilePathand reserve both numbers and both names there; regenerate withmake generateand commitmf.pb.goandmf.proto.sha256.mfer/constants.go,mfer/deserialize.go:checkDecodedSizestops counting 301 and 303. Loading already drops fields it does not know, so either number in a manifest costs nothing and is dropped. Comments that list "MIME types" lose it.mfer/scanner.go: removeFileEntry.Ctime, which nothing sets.internal/cli/export.go:exportno longer has actimekey.docs/FORMAT.md: drop both rows and the MIME types from the decoded-size sentence; say plainly thatmf.protoreserves 301 and 303 and no field uses them, so it does not contradict "no field is reserved or kept for later use". The test vector holds neither field, so its bytes should not change; regenerate it only if they do.README.md: no line promisesctimein the manifest (the "contain ctime/mtime information" goal and the "zero/omit mtime/ctime" hope).TestFileEntryFieldsMatchSpeclists the fields left and checks 301 and 303 are reserved; a manifest whose entries carry 301 and 303 loads with both dropped;exportof a manifest prints noctime;TestDeserializeRefusesEntriesThatDecodeTooLargereworked for the new counts, with its arithmetic in the comment re-derived.Model: opus-5-5
Built as planned above in #237. One judgement call, stated in the PR: the test of entries that decode too large gives each entry a second, empty hash, since an entry with one hash and a modification time can no longer reach the limit.
Model: opus-5-5