@@ -110,14 +110,23 @@ def _run(self, *args: str) -> subprocess.CompletedProcess:
110110
111111 def set (self , name : str , value : str ) -> None :
112112 result = self ._run ("credentials" , "set" , name , value )
113- assert result .returncode == 0 , (
114- f"credentials set { name } failed: { result .stderr } "
115- )
113+ if result .returncode != 0 :
114+ # conductor-oss standalone serves secrets from the server process
115+ # env — the store is read-only there, so the write-dependent
116+ # lifecycle steps cannot run (a server-flavor capability, not an
117+ # SDK regression; mirrors the Java/C# ports' assumption-skip).
118+ if "read-only" in result .stderr .lower ():
119+ pytest .skip (
120+ "server secret store is read-only (env-backed) — "
121+ "skipping write-dependent step"
122+ )
123+ raise AssertionError (f"credentials set { name } failed: { result .stderr } " )
116124
117125 def delete (self , name : str ) -> None :
118126 result = self ._run ("credentials" , "delete" , name )
119- # Ignore "not found" errors during cleanup
120- if result .returncode != 0 and "not found" not in result .stderr .lower ():
127+ # Ignore "not found" and "read-only" errors during cleanup — best-effort
128+ stderr = result .stderr .lower ()
129+ if result .returncode != 0 and "not found" not in stderr and "read-only" not in stderr :
121130 raise AssertionError (
122131 f"credentials delete { name } failed: { result .stderr } "
123132 )
@@ -162,9 +171,10 @@ def get_task_by_name(execution_id: str, task_ref_prefix: str) -> list:
162171# reason unrelated to the SDK. Probe the running server once and skip those tests
163172# when unsupported.
164173#
165- # TODO: once agentspan cuts a release that implements runtimeMetadata, bump
166- # AGENTSPAN_VERSION in .github/workflows/agent-e2e.yml — this guard then lets the
167- # credential tests run automatically (no test change needed).
174+ # conductor-oss implements this from 3.32.0-rc.8 onward (see
175+ # .github/workflows/agent-e2e.yml's CONDUCTOR_SERVER_VERSION) — this guard lets the
176+ # credential tests run automatically against any server that has it, no test
177+ # change needed.
168178
169179_RUNTIME_METADATA_SUPPORT = None
170180
@@ -208,6 +218,6 @@ def requires_runtime_metadata():
208218 pytest .skip (
209219 "server does not persist/deliver TaskDef.runtimeMetadata "
210220 "(conductor-oss PR #1255) — worker credential injection requires it. "
211- "TODO: bump AGENTSPAN_VERSION in .github/workflows/agent-e2e.yml once a "
212- "release ships runtimeMetadata support ."
221+ "Needs conductor-oss >= 3.32.0-rc.8 (see CONDUCTOR_SERVER_VERSION in "
222+ ".github/workflows/agent-e2e.yml) ."
213223 )
0 commit comments