merge: reconcile Wave 1.1 with post-PR40 lab

Merge canonical lab 9557b8d5909eb4a885c3bf49e19a65dd904f8c1d exactly once.
Retain invocation journal ownership and lineage, provider terminal ordering,
teacher handoff, framed DONE handling, and canonical authority/Ajax routing.

Combine dynamic dispatch receipts with lab policy forwarding. Adapt native
shell/patch evidence, explicit TUI verifiers, and artifact recovery presentation.
Refresh generated configuration source links and strengthen adapter regressions.

Validation: focused 2118 passed; Wave 1.1 script 2291 passed; broad runtime
5649 passed; full pytest 11581 passed, 53 skipped, 2 xfailed, 6 subtests passed.
Compileall 1689 Python files; syntax 279 JS and 82 MJS files; diff and
conflict-marker checks passed.
This commit is contained in:
Alexandre Teixeira
2026-10-01 09:09:55 +01:00
304 changed files with 41744 additions and 24384 deletions
+14 -2
View File
@@ -200,12 +200,12 @@ _VALIDATION_COMMAND_RE = re.compile(
def command_is_validation(command: str) -> bool:
"""Return whether a shell command provides executable verification evidence."""
value = str(command or "")
return is_validation_command(value)
return is_validation_command(_command_text(value))
def command_is_test(command: str) -> bool:
"""Return whether a shell command executes a recognized test runner."""
return is_test_command(str(command or ""))
return is_test_command(_command_text(str(command or "")))
def _clean_path(value: str) -> str:
@@ -521,6 +521,13 @@ def _explicit_tool_paths(tool: str, command: str) -> list[str]:
path = str(args.get("path") or "").strip() if isinstance(args, dict) else ""
return [path] if path else []
if tool == "apply_patch":
try:
args = json.loads(command or "{}")
except (TypeError, json.JSONDecodeError):
args = None
if isinstance(args, Mapping):
patch = args.get("patch")
command = patch if isinstance(patch, str) else ""
return [
match.group(1).strip()
for match in re.finditer(r"^\*\*\* (?:Add|Update|Delete) File:\s*(.+)$", command or "", re.MULTILINE)
@@ -990,6 +997,11 @@ class EvidenceLedger:
latest_validation_index, latest_validation = matching_validations[-1]
latest_artifact_mutation_index = max(matching_mutation_indices, default=-1)
if latest_validation_index < latest_artifact_mutation_index:
# A pre-edit inspection cannot invalidate executable checks
# that passed against the later mutation. It still cannot
# stand in for current verification when no such check exists.
if latest_verifier_index > latest_artifact_mutation_index:
continue
return CompletionDecision(
CompletionStatus.BLOCKED,
False,