Commit Diff


commit - 2bc69aedf0c572e1dd76c84c1a3e686d34b33ec9
commit + 90c588541e98eb7d71db2a6fb4f2da7cf15f5143
blob - a992054c8ba290d4dcd1983807e2d7cd318e216c
blob + 293d4950c17fbcc9aa75311535f6428d92327496
--- docs/release-live-checks.md
+++ docs/release-live-checks.md
@@ -72,6 +72,11 @@ isolated Journal, and the delimited syslog slice witho
 environment, or command output. Temporary evidence is removed when the target
 exits.
 
+The Codex Tool check also isolates the Journal created by that invocation and
+requires a committed `responses-continuity` Provider-state envelope for the
+fixed profile and model. It checks only the envelope metadata; the backend's
+opaque encrypted-state bytes are neither assumed nor printed.
+
 The opt-in must run as the ordinary Owner account, never root. Record the date
 and profile identifier in the release transcript; do not record request
 content, raw provider output, the token, or the account id.
blob - 9bdb10dcbfd56e37f14e68124b364e4c34e539a2
blob + 5e8f971090ff39eb92103d3e209588bbbda0a1dd
--- scripts/live-check
+++ scripts/live-check
@@ -428,6 +428,22 @@ one_tool_result()
 	    grep -F -q "\"is_error\":$is_error"
 }
 
+# Prove that a successful Codex Tool Turn committed opaque continuation state
+# without depending on the backend's encrypted-state bytes.  The envelope is
+# fixed by the compatibility profile; its data object deliberately stays
+# opaque to this release check.
+codex_continuity_present()
+{
+	journal=$1
+	marker='"provider_state":"{\"provider\":3,\"profile\":\"chatgpt-codex-2026-07-17\",\"model\":\"gpt-5.5\",\"kind\":\"responses-continuity\",\"data\":'
+
+	[ -f "$journal" ] || return 1
+	grep -F '"t":"msg","role":"assistant"' "$journal" 2>/dev/null |
+	    grep -Fq "$marker" || return 1
+	grep -F '"t":"turn-end"' "$journal" 2>/dev/null |
+	    grep -Fq '"outcome":"ok"'
+}
+
 # Return 0 when absent, 1 when leaked, and 2 when the scan could not run.
 secret_absent()
 {
@@ -577,6 +593,7 @@ credentialed()
 	chmod 0700 "$tmp"
 	artifacts=$tmp/artifacts
 	live_home=$tmp/home
+	journals=$live_home/.fugu/sessions
 	project=$tmp/project
 	mkdir -p "$artifacts" "$live_home" "$project"
 	chmod 0700 "$artifacts" "$live_home" "$project"
@@ -647,6 +664,10 @@ credentialed()
 	if [ "$subscription" -eq 1 ]; then
 		live_workdir=$project
 		printf '%s\n' "LIVE-SUBSCRIPTION-TOOL-$$" >"$project/profile.txt"
+		subscription_before=$tmp/subscription-journals-before
+		subscription_after=$tmp/subscription-journals-after
+		find "$journals" -type f -name '*.ndjson' -print 2>/dev/null |
+		    sort >"$subscription_before"
 		credentialed_run -p \
 		    'Use read exactly once on profile.txt, then reply exactly: live subscription tool ok' \
 		    -o ndjson >"$artifacts/subscription-tool.out" \
@@ -661,6 +682,17 @@ credentialed()
 		grep -Fq "$subscription_marker" \
 		    "$artifacts/subscription-tool.err"
 		ok "subscription startup warns that the profile is experimental" $?
+		if [ "$expect_provider" = codex ]; then
+			find "$journals" -type f -name '*.ndjson' -print \
+			    2>/dev/null | sort >"$subscription_after"
+			subscription_journal=$(comm -13 "$subscription_before" \
+			    "$subscription_after")
+			n=$(printf '%s\n' "$subscription_journal" |
+			    sed '/^$/d' | wc -l)
+			[ "$n" -eq 1 ] &&
+			    codex_continuity_present "$subscription_journal"
+			ok "Codex Tool turn commits its opaque continuity envelope" $?
+		fi
 	fi
 
 	live_workdir=$project
@@ -712,7 +744,6 @@ credentialed()
 	    grep -q "$report_a" "$artifacts/subagent.out" &&
 	    grep -q "$report_b" "$artifacts/subagent.out"
 	ok "both bounded agent reports return successfully" $?
-	journals=$live_home/.fugu/sessions
 	grep -R -q '"name":"agent"' "$journals" 2>/dev/null &&
 	    grep -R -q "$report_a" "$journals" 2>/dev/null &&
 	    grep -R -q "$report_b" "$journals" 2>/dev/null