Skip to content

Commit cfc511d

Browse files
Tighten omp version gate to exact verified versions; treat a lone omp block as a spec candidate
Review findings: the major-only comparison admitted unverified 18.x minors against OMP-R05's per-minor admission contract, so admission is now an exact verified-version list like the opencode gate; and looks_like_spec now counts an omp driver block as an agent-shaped signal, matching every other provider. agent-identity: unknown agent-persona: generalist agent-supervisor: unavailable agent-tool: OMP agent-tool-version: 18.0.3 agent-runtime: OMP 18.0.3 tooling-profile: dotfiles@929dc21
1 parent 776797b commit cfc511d

3 files changed

Lines changed: 44 additions & 16 deletions

File tree

crates/agent-spec/src/spec.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,7 @@ impl RawSpec {
956956
// still be a candidate, whichever provider the block names.
957957
|| self.driver.pi.is_some()
958958
|| self.driver.opencode.is_some()
959+
|| self.driver.omp.is_some()
959960
|| !self.resource.0.is_empty()
960961
|| !self.pty.is_empty()
961962
|| !self.exec.is_empty()
@@ -1337,7 +1338,7 @@ mod tests {
13371338
/// or path-derived discovery silently skips the seat.
13381339
#[test]
13391340
fn a_lone_driver_block_of_any_provider_is_a_spec_candidate() {
1340-
for provider in ["claude", "codex", "pi", "opencode"] {
1341+
for provider in ["claude", "codex", "pi", "opencode", "omp"] {
13411342
let block = format!("[{provider}]\nprompt = \"Start the assigned work.\"");
13421343
let raw: super::RawSpec = toml::from_str(&block).unwrap();
13431344
assert!(raw.looks_like_spec(), "[{provider}] must look like a spec");

docs/vrs/06-omp-driver/.experiments/2026-08-25-omp-harness-integration.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,25 @@ presence record read `available`; the harness-state record seeded `idle` under
9292
`st2-session-start` restored-context block; observed state cycled active → idle
9393
(transitions 3→5) around the delivery. The model's reply itself failed with a provider-side
9494
429 weekly usage limit — outside st2's surface.
95+
96+
## Fleet e2e run (dotfiles integration)
97+
98+
The dotfiles side activated the driver on dev3 through the standing
99+
`dev3.omp-scratch` seat (launched by the production supervisor via
100+
`st2 driver omp-session`, st2 repinned to this branch). Verified live: the
101+
seat materialized into the catalog, reached presence `available`, published
102+
the harness-state record (`harness: "omp"`, seeded idle, fenced by the
103+
wrapper's session token), and a `st2 message send` from `dev3.cos` landed in
104+
its live TUI through the channel with observed state cycling active → idle
105+
(transitions around the delivery). The model's reply was blocked by a
106+
provider-side 429 weekly usage limit on the opencode-go workspace - the same
107+
external quota exhaustion visible across the fleet that day; the
108+
model-acts-on-delivery step is covered by the manual runs above.
109+
110+
Integration findings recorded on the way: Nix standing seats launch through
111+
the `axe agent launch` carrier, which spawns the raw harness binary - so a
112+
driver-backed seat that wants the wrapper's machinery must declare the
113+
`st2 driver <h>-session` argv directly rather than ride the axe carrier; and
114+
axe's managed path requires a profile account binding plus a fixed-account
115+
credential availability probe, which omp satisfies with its install-identity
116+
file since its native OAuth exposes no projectable credential.

src/omp_session.rs

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ pub const CHANNEL_SEQ: &str = "ST2_OMP_CHANNEL_SEQ";
4343
/// harmless either way.
4444
const OFFLINE_DEFAULTS: [(&str, &str); 2] = [("PI_OFFLINE", "1"), ("PI_SKIP_VERSION_CHECK", "1")];
4545

46-
/// The verified range at introduction (2026-08-25, omp v18.0.3): major 18. A later minor stays
47-
/// rejected until the admission checks in `docs/vrs/06-omp-driver/spec.md` are repeated against
48-
/// it.
49-
const SUPPORTED_MAJOR: u32 = 18;
46+
/// The versions verified against the admission checks in
47+
/// `docs/vrs/06-omp-driver/spec.md` (2026-08-25). omp releases near-daily and its
48+
/// delivery-critical surface is versioned behavior, so admission is per exact version: a later
49+
/// minor OR patch stays rejected until the checks are repeated against it.
50+
const SUPPORTED_OMP_VERSIONS: [&str; 1] = ["18.0.3"];
5051

5152
/// What the wrapper hands the provider process: the channel environment plus the launch argv with
5253
/// the channel extension spliced in.
@@ -167,18 +168,11 @@ fn verify_supported_version(binary: &str) -> Result<()> {
167168
token.split('.').all(|part| !part.is_empty() && part.chars().all(|c| c.is_ascii_digit()))
168169
});
169170
let version = version.with_context(|| format!("{{binary}} --version printed no version: '{printed}'"))?;
170-
let digits: Vec<&str> = version.split('.').collect();
171171
anyhow::ensure!(
172-
digits.len() >= 2,
173-
"omp version '{version}' is not <major>.<minor>[.<patch>]"
174-
);
175-
let major: u32 = digits[0]
176-
.parse()
177-
.with_context(|| format!("parsing omp major version from '{version}'"))?;
178-
anyhow::ensure!(
179-
major == SUPPORTED_MAJOR,
180-
"omp {version} is unverified (admitted majors: {SUPPORTED_MAJOR}); repeat the \
181-
docs/vrs/06-omp-driver admission checks before extending the gate"
172+
SUPPORTED_OMP_VERSIONS.contains(&version),
173+
"omp {version} is unverified (admitted: {}); repeat the docs/vrs/06-omp-driver \
174+
admission checks before extending the gate",
175+
SUPPORTED_OMP_VERSIONS.join(", ")
182176
);
183177
Ok(())
184178
}
@@ -279,6 +273,17 @@ mod tests {
279273
assert!(verify_supported_version(fake.to_str().unwrap()).is_ok());
280274
}
281275

276+
#[test]
277+
fn version_gate_refuses_an_unverified_minor() {
278+
let dir = tempfile::tempdir().unwrap();
279+
let fake = dir.path().join("omp");
280+
std::fs::write(&fake, "#!/bin/sh\nprintf '18.1.0\\n'\n").unwrap();
281+
use std::os::unix::fs::PermissionsExt as _;
282+
std::fs::set_permissions(&fake, std::fs::Permissions::from_mode(0o755)).unwrap();
283+
let error = verify_supported_version(fake.to_str().unwrap()).unwrap_err();
284+
assert!(error.to_string().contains("unverified"), "{error}");
285+
}
286+
282287
#[test]
283288
fn version_gate_refuses_an_unverified_major() {
284289
let dir = tempfile::tempdir().unwrap();

0 commit comments

Comments
 (0)