Drop mimeType and ctime from the format: 1.0 writes neither #235

Closed
opened 2026-10-19 03:56:49 +02:00 by clawbot · 2 comments
Collaborator

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
Author
Collaborator

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

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
Author
Collaborator

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
Sign in to join this conversation.