0.1.0 release prep: 1.16 floor, four contract-bug fixes, hex.pm docs reconciliation#3
Merged
Merged
Conversation
Release prep for the first Hex publish: - elixir floor ~> 1.18 -> ~> 1.16; CI gains a real 1.16.3 / OTP 26.2 floor lane - drop the 1.17-only cli/0 callback (inert on the 1.16 floor) - remove dead application/0 (Logger is never used; telemetry auto-starts as a dep) - consolidate_protocols/0 now honors VFS_CONSOLIDATE_PROTOCOLS — the CI consolidate lane was a silent no-op before - drop always-on elixirc_options warnings_as_errors: redundant with the check alias and could break a consumer's build on a future-Elixir warning - move maintainer mix tasks (vfs.audit, vfs.mutate) from lib/ to dev/ so they compile in dev/test but never ship into consumers' projects - stamp CHANGELOG 0.1.0 - gitignore .env (local secrets) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
skip_files still pointed at lib/mix/tasks/; moving the maintainer tasks to dev/ left them counted against the 100% coverage gate, failing coveralls on every lane. Point skip_files at dev/ and add dev/ to formatter inputs. Verified locally: coveralls 100.0%, consolidate lane green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…docs reconciliation
Code (each property-tested RED→GREEN in contracts_test.exs first):
- dedupe synthetic mountpoint children so mount-table readdir never
lists duplicate names (mounts at /a/b + /a/c made readdir("/") return
["a", "a"])
- VFS.Memory mkdir: :eexist for implicit dirs and root; parents: true is
an idempotent success no-op over existing directories (mkdir -p);
reference model updated to match
- new VFS.Error.put_path/2 regenerates the default message when the
dispatcher rewrites :path into the user's namespace (messages no
longer name mount-stripped backend-internal paths)
- VFS.Memory.new/1 rejects non-binary seed keys/values at construction
with a clear ArgumentError instead of crashing at first read
- VFS.readdir/2 spec widened to Enumerable.t(String.t()) to match the
protocol; VFS moduledoc no longer overclaims telemetry coverage
Docs/packaging for hex.pm:
- README: hex install snippet + 1.16 floor, absolute GitHub links
- SPEC.md: amended to the shipped surface (10-callback protocol,
%VFS.Error{} returns, real capability set, grep/glob/cp/mv cut)
- CLAUDE.md: 1.16 floor, 10 callbacks, :mkdir capability, real CI
matrix, corrected Skeleton/read_file guidance
- CHANGELOG: 0.1.0 entry restructured (single Added section), today's
fixes documented
- mix.exs: filter_modules keeps dev-only Mix tasks out of hexdocs;
Error/StreamOptions grouped; preferred_envs makes bare `mix check`
work; `mix setup` installs the promised pre-commit hook
Gates: mix check green (100.0% coverage), 340 tests + integration green,
mix docs warning-free, mix vfs.audit 0/0/0, mix hex.build clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Prep for the first Hex release (
vfs0.1.0). The name is confirmed available on hex.pm. Two parts: the floor/config tightening (first three commits), and the must-fix list from a multi-agent release-readiness audit (final commit) — four real contract bugs plus a sweep of every public-facing doc that would have shipped stale to hex.pm.Lower the Elixir floor to 1.16
elixir: "~> 1.18"→"~> 1.16". The library code uses no 1.17/1.18-only features (no built-inJSON,Duration,Date.shift, etc.).Tighten mix config
application/0— itsextra_applications: [:logger]was dead config; Logger is never used andtelemetryauto-starts as a dependency.consolidate_protocolsnow readsVFS_CONSOLIDATE_PROTOCOLS— CI set that env var butmix.exsignored it, so the "consolidate=true" lane tested nothing.elixirc_options: [warnings_as_errors: true]— redundant with thecheckalias and risky for consumers. CI still enforces zero-warnings viamix check.mix vfs.audit/mix vfs.mutateout of the package (lib/mix/tasks/→dev/, compiled in dev/test only).def clire-added forpreferred_envs: [check: :test]so a baremix checkworks outsideMIX_ENV=test(an earlier commit dropped it as "1.17+ only" —Mix.Project.cli/0is 1.15+, so it's floor-safe; the 1.16 CI lane proves it).mix setupnow also installs the pre-commit hook CLAUDE.md promises.Contract bugs (each locked in by a property in
contracts_test.exs, written RED first)readdirlisted duplicate names — sibling mounts under a shared synthetic parent (/a/b+/a/c) each contributed"a"toreaddir("/"). Synthetic children now dedupe at the source.VFS.Memorymkdirviolated the:eexistcontract for implicit directories and root, andparents: trueerrored on the second call. Any existing directory is now:eexist;parents: trueis an idempotent success no-op (mkdir -psemantics). The stateful-property reference model encoded the old semantics and was corrected with it.:pathwas rewritten into the user's namespace but the default:messagestill named the mount-stripped path. NewVFS.Error.put_path/2regenerates the default message on rewrite; custom backend messages are preserved.VFS.Memory.new/1accepted non-binary seed keys/values, deferring the crash to first read. Both now raise a clearArgumentErrorat construction, with adversarial input properties.Also:
VFS.readdir/2's@specnarrowed the protocol'sEnumerable.t(String.t())to a list (the dispatcher's own unbounded branch returns a Stream); theVFSmoduledoc claimed telemetry wrapped every public op when four lookups aren't instrumented. Both now match reality.Public docs / packaging for hex.pm
{:vfs, "~> 0.1.0"}), stated 1.16 floor, relative links replaced with absolute GitHub URLs (they 404 on hexdocs).%VFS.Error{}returns, real capability set, Skeleton/mount-table sketches matching shipped code,grep/glob/cp/mvreframed as consumer-side. Rationale and decision table untouched.:mkdircapability documented, fictionalSkeleton read_file/2override corrected, real four-leg CI matrix described.### Addedmerged, autolink warnings fixed, the new fixes documented.filter_moduleskeeps maintainer-only Mix tasks out of hexdocs;VFS.Error/VFS.StreamOptionsadded to docs groups.Verification
mix check: green from a bare prompt — format, compile -W, credo 0 issues, dialyzer 0 errors, 100.0% line coverage on every filemix test --include integration: 38 doctests, 52 properties, 340 tests, 0 failuresmix docs: zero warnings (was 5+)mix vfs.audit: 0 high / 0 medium / 0 lowmix hex.build: clean; tarball metadata shows onlytelemetry ~> 1.3,~> 1.16Release note
After merge, publishing is:
git tag v0.1.0 && git push --tags && mix hex.publish— the tag must exist forsource_refand the CHANGELOG compare links to resolve.🤖 Generated with Claude Code