host/observer: tag the live prop-recovery row with the real wire value

Verification-round follow-up to 1b01847. The phase-3r live row proves
carrier 1 survives the bind, which is the property F1 destroyed — but
it tagged its fixture sink with `peerspeak.owned=true`, not the `1`
the contract pins and peerspeak actually emits. It would have passed
even if the real literal did not.

Adds PEERSPEAK_OWNED_VALUE so the fixture can name the producer's
value, and asserts it against the shared contract file alongside the
other two literals. The sink's name still deliberately avoids the
`peerspeak_owned_` prefix, so carrier 2 cannot stand in for carrier 1
in that row.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-25 20:06:06 -04:00
co-authored by Claude Opus 5
parent 1b01847c66
commit 8b41f64e12
3 changed files with 22 additions and 4 deletions
+9
View File
@@ -136,6 +136,15 @@ pub const ECHO_CANCEL_GROUP_PREFIX: &str = "echo-cancel-";
/// change that invalidates the phase 5 matrix.
pub const PEERSPEAK_OWNED_PROP: &str = "peerspeak.owned";
/// The value peerspeak emits for [`PEERSPEAK_OWNED_PROP`].
///
/// The consumer deliberately accepts **any** truthy value, not just this one
/// (see the observer's `truthy`) — treating an unexpected value as "owned" is
/// the fail-closed direction. This constant exists so live tests can tag a
/// node with exactly what the producer sends, rather than something merely
/// truthy that would pass even if the real literal did not.
pub const PEERSPEAK_OWNED_VALUE: &str = "1";
/// Ownership carrier 2: a `node.name` prefix (v3.5 §5.1, round 8).
///
/// Matched as a **union** with [`PEERSPEAK_OWNED_PROP`] — either one makes a