From 6917e5d39fe4797422ffacab9eb000ce744b28fd Mon Sep 17 00:00:00 2001 From: ahcrm-core Date: Sun, 20 Sep 2026 17:57:19 -0500 Subject: [PATCH 1/5] docs: record non-recursive artifact diagnostic --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0785b006b..e0391dd9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ breaking changes may land in a minor release. ## [Unreleased] +### Fixed + +- Explain that unpinned result-artifact scans search only the configured artifact + directories themselves, so a nested story spec no longer produces an opaque + `no-artifact` breadcrumb (#780). + ## [0.12.0] — 2026-09-20 ### Added From 27df5977b7430d02bafc5c024b9119f11c2bd1bd Mon Sep 17 00:00:00 2001 From: ahcrm-core Date: Sun, 20 Sep 2026 17:58:22 -0500 Subject: [PATCH 2/5] fix(adapter): explain non-recursive artifact scan --- src/bmad_loop/adapters/generic.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bmad_loop/adapters/generic.py b/src/bmad_loop/adapters/generic.py index 0f7fcb5e0..d64f10cff 100644 --- a/src/bmad_loop/adapters/generic.py +++ b/src/bmad_loop/adapters/generic.py @@ -1850,7 +1850,9 @@ def _frontmatter_fallback( self._note_resultless_stop( task_id, "no-artifact", - "no result artifact newer than session launch under: " + where, + "no result artifact newer than session launch directly under: " + + where + + " (subdirectories are not searched)", ) return None if len(candidates) > 1: From b267a85d31f89c89b46c1e6cbc4551e80cafb919 Mon Sep 17 00:00:00 2001 From: ahcrm-core Date: Sun, 20 Sep 2026 17:59:00 -0500 Subject: [PATCH 3/5] test(adapter): cover nested artifact breadcrumb --- tests/test_generic_tmux.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/test_generic_tmux.py b/tests/test_generic_tmux.py index 5f62ab5ad..590173705 100644 --- a/tests/test_generic_tmux.py +++ b/tests/test_generic_tmux.py @@ -1047,6 +1047,25 @@ def test_resultless_stop_breadcrumb_scan_no_artifact(tmp_path, monkeypatch): assert str(impl) in crumb["detail"] # names the searched dirs +def test_resultless_stop_breadcrumb_explains_non_recursive_artifact_scan(tmp_path, monkeypatch): + """A nested result is outside the legacy scan, so the breadcrumb must say so.""" + adapter, impl = make_dev_adapter(tmp_path) + monkeypatch.setattr(generic, "RESULT_GRACE_S", 0.0) + nested = impl / "stories" + nested.mkdir() + (nested / "spec-3-1-foo.md").write_text( + "---\nstatus: done\n---\n\n## Auto Run Result\n\nStatus: done\n", + encoding="utf-8", + ) + + assert adapter._result_json(_dev_handle(), _dev_spec(tmp_path), wait=True) is None + + (crumb,) = _breadcrumbs(adapter) + assert crumb["verdict"] == "no-artifact" + assert str(impl) in crumb["detail"] + assert "subdirectories are not searched" in crumb["detail"] + + def test_resultless_stop_breadcrumb_stories_pending(tmp_path, monkeypatch): adapter, _ = make_dev_adapter(tmp_path) monkeypatch.setattr(generic, "RESULT_GRACE_S", 0.0) From 8da21e2c16225dc3fb140f099b168f01be4f2593 Mon Sep 17 00:00:00 2001 From: ahcrm-core Date: Sun, 20 Sep 2026 18:14:56 -0500 Subject: [PATCH 4/5] fix(adapter): distinguish pinned path breadcrumb --- src/bmad_loop/adapters/generic.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/bmad_loop/adapters/generic.py b/src/bmad_loop/adapters/generic.py index d64f10cff..0a8f7c338 100644 --- a/src/bmad_loop/adapters/generic.py +++ b/src/bmad_loop/adapters/generic.py @@ -1850,9 +1850,13 @@ def _frontmatter_fallback( self._note_resultless_stop( task_id, "no-artifact", - "no result artifact newer than session launch directly under: " - + where - + " (subdirectories are not searched)", + ( + f"no result artifact newer than session launch at: {where}" + if only is not None + else "no result artifact newer than session launch directly under: " + + where + + " (subdirectories are not searched)" + ), ) return None if len(candidates) > 1: From be0b75c2d1de3a7e007347e67b54bddc5e0a5e70 Mon Sep 17 00:00:00 2001 From: ahcrm-core Date: Sun, 20 Sep 2026 18:15:05 -0500 Subject: [PATCH 5/5] test(adapter): preserve pinned breadcrumb wording --- tests/test_generic_tmux.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_generic_tmux.py b/tests/test_generic_tmux.py index 590173705..5a31f6717 100644 --- a/tests/test_generic_tmux.py +++ b/tests/test_generic_tmux.py @@ -5904,6 +5904,9 @@ def test_expected_spec_breadcrumb_names_the_pinned_path(tmp_path, monkeypatch): (crumb,) = _breadcrumbs(adapter) assert crumb["verdict"] == "no-artifact" assert str(ours) in crumb["detail"] + assert "at:" in crumb["detail"] + assert "directly under" not in crumb["detail"] + assert "subdirectories are not searched" not in crumb["detail"] assert "someone-elses" not in crumb["detail"]