From 03fbfb76e1c5af63d7bb06c9cf864a88a387b5e7 Mon Sep 17 00:00:00 2001 From: GenericJam Date: Fri, 11 Sep 2026 16:45:39 -0600 Subject: [PATCH] =?UTF-8?q?Bump=20to=200.7.1=20=E2=80=94=20MobDev.Differen?= =?UTF-8?q?tial=20emits=20divergences=20to=20the=20defect=20bus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ships MOB-159 phase 2 (PR #75) to Hex. MobDev.Differential.run/3 now emits a Mob.Defect.Capsule (kind: :divergence, owner: :mob) via Mob.Defect.emit_divergence/2 when the comparator returns a divergence result. New :fixture option threads a caller-supplied identifier into the fingerprint key. - Dep spec widened from `~> 0.7.25 or ~> 0.8` to `~> 0.7.25 or ~> 0.8.1` — the 0.8.0 point release predated Mob.Defect.emit_divergence/2 and would raise on the emit path. - Emit is guarded by Code.ensure_loaded?(Mob.Defect) + function_exported?(...) so a resolver picking a 0.7.x mob (still allowed) silently no-ops instead of crashing. Callers who require the emit pin `mob >= 0.8.1`. - mix.lock resolves to mob 0.8.2 (shipped earlier today), so a fresh install of mob_dev 0.7.1 gets the full emit path against the matching post-mortem substrate. Release-review gate before publish: RELEASE OK WITH FIXES — CHANGELOG was missing an entry for 0.7.1 entirely (opened directly with [0.7.0]). Added the section describing both the emit wiring and the dep-spec change, then bumped. mix mob.security_scan clean (0 findings across 57 hex deps + 4 bundled OTP tarballs). Known: 8 local tests in Mix.Tasks.Mob.EnableTest and Mix.Tasks.Mob.Adopt.BridgeTest fail from a git worktree under .claude/worktrees/ due to an Igniter test_project cwd artifact — CI and a fresh master clone pass. Not caused by this diff; documented in memory/project_mob_dev_worktree_igniter.md. Co-Authored-By: Claude Opus 4.7 --- CHANGELOG.md | 31 +++++++++++++++++++++++++++++++ mix.exs | 2 +- mix.lock | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0de578a..ee8a709 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,34 @@ +## [0.7.1] - 2026-09-11 + +### Added +- **`MobDev.Differential.run/3` emits divergences onto `Mob.Defect.Bus`** + (MOB-159 phase 2). A `{:divergence, ...}` result now emits a + `Mob.Defect.Capsule` (kind: `:divergence`, owner: `:mob`) via + `Mob.Defect.emit_divergence/2`. New `:fixture` option threads a + caller-supplied identifier into the capsule's fingerprint key so + the same divergence in the same fixture groups across runs. + + `:ok` and every documented `{:error, _}` shape (`:not_ready`, + `:differential_unavailable`, `:tree_error`, `:comparator_error`) do + not emit — nothing to report on a clean run, and a harness gap is + not a framework defect. A novel result shape logs at `:error` via + `Logger` and does not emit, so adding a new taxonomy member is an + explicit decision to compare or skip rather than silent absorption. + + The emit path is guarded by `Code.ensure_loaded?(Mob.Defect) and + function_exported?(Mob.Defect, :emit_divergence, 2)`, so a resolver + picking a `mob 0.7.x` (still allowed by the widened dep spec below) + silently no-ops instead of crashing with `UndefinedFunctionError`. + Callers who require the emit should pin `mob >= 0.8.1` themselves. + +### Changed +- **`{:mob, ...}` dep spec widened to `~> 0.7.25 or ~> 0.8.1`.** Blocks + 0.8.0 (which predates `Mob.Defect.emit_divergence/2`) while still + admitting the 0.7.x line for consumers who have not moved to the 0.8 + series yet. + +--- + ## [0.7.0] - 2026-09-11 ### Added diff --git a/mix.exs b/mix.exs index a964863..5d534ad 100644 --- a/mix.exs +++ b/mix.exs @@ -4,7 +4,7 @@ defmodule MobDev.MixProject do def project do [ app: :mob_dev, - version: "0.7.0", + version: "0.7.1", elixir: "~> 1.19", description: "Development tooling for the Mob mobile framework", source_url: "https://github.com/genericjam/mob_dev", diff --git a/mix.lock b/mix.lock index 43a3c35..6cf8fba 100644 --- a/mix.lock +++ b/mix.lock @@ -28,7 +28,7 @@ "mint": {:hex, :mint, "1.10.0", "85af3353bfc504f5bdfe494bd92b8490f87a306dc659ee1ad0af435107e898dc", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "8b16fb72aaa7531d206a1f05e4cc85509ba531ccec7a17a22736c9c95cbb24d1"}, "mix_audit": {:hex, :mix_audit, "2.1.5", "c0f77cee6b4ef9d97e37772359a187a166c7a1e0e08b50edf5bf6959dfe5a016", [:make, :mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:yaml_elixir, "~> 2.11", [hex: :yaml_elixir, repo: "hexpm", optional: false]}], "hexpm", "87f9298e21da32f697af535475860dc1d3617a010e0b418d2ec6142bc8b42d69"}, "mix_unused": {:hex, :mix_unused, "0.4.1", "9f8d759a300a79d2077d6baf617f3a5af6935d50b0f113c09295b265afc3e411", [:mix], [{:libgraph, ">= 0.0.0", [hex: :libgraph, repo: "hexpm", optional: false]}], "hexpm", "fa21f688a88e0710e3d96ac1c8e5a6181aea8a75c8a4214f0edcfeb069b831a3"}, - "mob": {:hex, :mob, "0.8.1", "d5e5ec455012c3efb9535387df394c676f2e1bdf08bc6f4f2a45e1f71dea7763", [:mix], [{:nimble_parsec, "~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "a229649aaa955e92f0f25374d8559abe0df2e81de7887a038861cecf66938038"}, + "mob": {:hex, :mob, "0.8.2", "55d6feda5b705f59898107414000c96e3a7024d83b2d37158639dc9a4d5f855e", [:mix], [{:nimble_parsec, "~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "822c4ca023f40947e7f669ef11a5669adc9c2ccdf1d13375d2c50d8eb1d4f072"}, "mox": {:hex, :mox, "1.2.0", "a2cd96b4b80a3883e3100a221e8adc1b98e4c3a332a8fc434c39526babafd5b3", [:mix], [{:nimble_ownership, "~> 1.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}], "hexpm", "c7b92b3cc69ee24a7eeeaf944cd7be22013c52fcb580c1f33f50845ec821089a"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_ownership": {:hex, :nimble_ownership, "1.0.2", "fa8a6f2d8c592ad4d79b2ca617473c6aefd5869abfa02563a77682038bf916cf", [:mix], [], "hexpm", "098af64e1f6f8609c6672127cfe9e9590a5d3fcdd82bc17a377b8692fd81a879"},