From f5e3119b109a6c2aeac02a2532a4fb82e1db1867 Mon Sep 17 00:00:00 2001 From: pewdiepie-archdaemon Date: Sat, 19 Sep 2026 02:25:27 +0000 Subject: [PATCH] bind directory completion to output descendants --- HARNESS_VERSION | 2 +- src/clean_agent_preview.py | 27 +++++++++++++++--------- tests/test_clean_agent_preview.py | 35 ++++++++++++++++++++++++------- tests/test_harness_version.py | 2 +- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/HARNESS_VERSION b/HARNESS_VERSION index e1695f5d3..c7f4ab0cf 100644 --- a/HARNESS_VERSION +++ b/HARNESS_VERSION @@ -1 +1 @@ -0.20.14 +0.20.15 diff --git a/src/clean_agent_preview.py b/src/clean_agent_preview.py index 925718d1c..9e370b691 100644 --- a/src/clean_agent_preview.py +++ b/src/clean_agent_preview.py @@ -1549,17 +1549,24 @@ def artifact_completion_tool_schemas(offered_schemas, required_artifacts): bound = copy.deepcopy(offered_schemas) for schema in bound: function = schema.get('function') or {} - if canonical(function.get('name')) != 'write_file': - continue properties = (function.get('parameters') or {}).get('properties') or {} - path_schema = properties.get('path') - if not isinstance(path_schema, dict): - continue - path_schema['pattern'] = '^' + re.escape(target + '/') + '.+' - path_schema['description'] = ( - f'Write a new file inside the required directory {target}; ' - 'do not use the directory path itself.' - ) + if canonical(function.get('name')) == 'write_file': + path_schema = properties.get('path') + if isinstance(path_schema, dict): + path_schema['pattern'] = '^' + re.escape(target + '/') + '.+' + path_schema['description'] = ( + f'Write a new file inside the required directory {target}; ' + 'do not use the directory path itself.' + ) + elif canonical(function.get('name')) == 'python': + code_schema = properties.get('code') + if isinstance(code_schema, dict): + code_schema['pattern'] = re.escape(target + '/') + code_schema['description'] = ( + 'Python code that creates one or more non-empty files inside ' + f'the required directory {target}. The code must reference a ' + 'descendant path; do not only inspect or delete source files.' + ) return bound if Path(target).suffix.lower() in _NON_TEXT_ARTIFACT_SUFFIXES: # ``write_file`` deliberately accepts UTF-8 text only. Keeping it in diff --git a/tests/test_clean_agent_preview.py b/tests/test_clean_agent_preview.py index 7d1cccf1b..d44b95da4 100644 --- a/tests/test_clean_agent_preview.py +++ b/tests/test_clean_agent_preview.py @@ -625,16 +625,28 @@ def test_artifact_completion_schema_binds_single_required_file_without_mutating_ def test_artifact_completion_schema_binds_directory_descendant_but_not_multiple_outputs(): - source = [{ - 'type': 'function', - 'function': { - 'name': 'write_file', - 'parameters': { - 'type': 'object', - 'properties': {'path': {'type': 'string'}}, + source = [ + { + 'type': 'function', + 'function': { + 'name': 'write_file', + 'parameters': { + 'type': 'object', + 'properties': {'path': {'type': 'string'}}, + }, }, }, - }] + { + 'type': 'function', + 'function': { + 'name': 'python', + 'parameters': { + 'type': 'object', + 'properties': {'code': {'type': 'string'}}, + }, + }, + }, + ] directory_bound = artifact_completion_tool_schemas( source, ('/workspace/results/',), @@ -644,6 +656,13 @@ def test_artifact_completion_schema_binds_directory_descendant_but_not_multiple_ assert not re.search(directory_path['pattern'], '/workspace/results') assert 'inside the required directory' in directory_path['description'] assert 'pattern' not in source[0]['function']['parameters']['properties']['path'] + directory_code = directory_bound[1]['function']['parameters']['properties']['code'] + assert re.search( + directory_code['pattern'], + "Path('/workspace/results/1.tex').write_text('table')", + ) + assert not re.search(directory_code['pattern'], "Path('/workspace/source.tar').unlink()") + assert 'non-empty files inside' in directory_code['description'] assert artifact_completion_tool_schemas( source, ('/workspace/a.txt', '/workspace/b.txt'), ) == source diff --git a/tests/test_harness_version.py b/tests/test_harness_version.py index 85a6e8a03..09479f1dc 100644 --- a/tests/test_harness_version.py +++ b/tests/test_harness_version.py @@ -8,7 +8,7 @@ ROOT = Path(__file__).resolve().parents[1] def test_original_harness_version_is_canonical_semver() -> None: version = (ROOT / "HARNESS_VERSION").read_text(encoding="utf-8").strip() - assert version == "0.20.14" + assert version == "0.20.15" assert re.fullmatch(r"\d+\.\d+\.\d+", version)