Remove owner-authorized individual Runner attempt caps and record Opus work direction
This commit is contained in:
+20
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"target_commit": "e59206b9b2578ddb4a1ec023f836d413a7a8fbfb",
|
||||
"actual_native_index": "artifacts/original-completion-2026-10-02/p08-02-native-mixed-r03/index.json",
|
||||
"checker_rejected_actual_incomplete_evidence": true,
|
||||
"deficits": [
|
||||
"OS proof: unsafe artifact path",
|
||||
"collection failure",
|
||||
"condition mapping actual_actor_positions",
|
||||
"condition mapping combined_rescue_logistics_ev",
|
||||
"condition mapping mixed_construction",
|
||||
"condition mapping no_overlap_orphan_loss",
|
||||
"condition mapping occupancy_change",
|
||||
"condition mapping unsolvable_preservation",
|
||||
"final regression: unsafe artifact path",
|
||||
"missing/duplicate ON/OFF positive/refusal case"
|
||||
],
|
||||
"elapsed_seconds": 0.594841375015676,
|
||||
"evidence_source_modified": false,
|
||||
"unit_accepted": false
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"task_id": "P08-02",
|
||||
"state": "implementing",
|
||||
"submitted": "e59206b9b2578ddb4a1ec023f836d413a7a8fbfb",
|
||||
"repairs_retained": 3,
|
||||
"individual_cap": null,
|
||||
"actual_implementer_run": "c515ac662e484e8e8c90024b3c73ff53",
|
||||
"actual_pid": 65613,
|
||||
"commander_direction": "../unlimited-individual-limits-r01/OPUS_P08_RUN_DIRECTION.json",
|
||||
"original_unit_accepted": false,
|
||||
"original_denominator": {
|
||||
"packages": 30,
|
||||
"units": 88,
|
||||
"partial_credit": false
|
||||
},
|
||||
"all_conditions": [
|
||||
"mixed_construction",
|
||||
"occupancy_change",
|
||||
"actual_actor_positions",
|
||||
"combined_rescue_logistics_ev",
|
||||
"no_overlap_orphan_loss",
|
||||
"unsolvable_preservation"
|
||||
],
|
||||
"reuse_evidence": [
|
||||
{
|
||||
"sha": "e59206b9b2578ddb4a1ec023f836d413a7a8fbfb",
|
||||
"import_pid": 52821,
|
||||
"parse_pid": 52931,
|
||||
"passed": true,
|
||||
"application": "diagnoses existing source; final changed fixture requires final native parse"
|
||||
},
|
||||
{
|
||||
"sha": "e59206b9b2578ddb4a1ec023f836d413a7a8fbfb",
|
||||
"writer_pid": 52976,
|
||||
"failed": true,
|
||||
"application": "resource setup failure; no mixed migration acceptance"
|
||||
},
|
||||
{
|
||||
"diagnostic_pid": 55276,
|
||||
"application": "missing materials10, diagnostic logging only; no acceptance"
|
||||
},
|
||||
{
|
||||
"application": "raw oldhistory fullSHA roundtrip Git2versions and verified gzip; reusable provenance"
|
||||
}
|
||||
],
|
||||
"missing": [
|
||||
"same-final-sha full ON/OFF success/refusal native writer/reader proof",
|
||||
"actual normal OS input evidence",
|
||||
"final regression",
|
||||
"independent gameplay review",
|
||||
"integration and ledger closure"
|
||||
],
|
||||
"dependencies": [
|
||||
"registered catalog definition costs reused; no production economic values invented",
|
||||
"private native profile/save isolation",
|
||||
"normal menu interaction setup"
|
||||
]
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
"""Execute unchanged submitted P08 collector with storage-only closed-phase hook."""
|
||||
from pathlib import Path
|
||||
import importlib.util,argparse,json,sys,hashlib
|
||||
sys.dont_write_bytecode=True
|
||||
parser=argparse.ArgumentParser();parser.add_argument('--commit',required=True);parser.add_argument('--output',type=Path,required=True);args=parser.parse_args()
|
||||
root=Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-implement')
|
||||
coordinator=Path(__file__).resolve().parent
|
||||
|
||||
def load(name,path):
|
||||
s=importlib.util.spec_from_file_location(name,path);m=importlib.util.module_from_spec(s);s.loader.exec_module(m);return m
|
||||
|
||||
driver=load('submitted_p08_collector',root/'tools/run_p08_mixed_migration.py')
|
||||
storage=load('closed_phase_storage',coordinator/'native_storage_guard.py')
|
||||
original_module=driver.module
|
||||
traces=[]
|
||||
|
||||
def module(name,path):
|
||||
m=original_module(name,path)
|
||||
if name=='p08_standard_runner':
|
||||
original=m.execute_phase
|
||||
def execute(*values,**kwargs):
|
||||
row=original(*values,**kwargs)
|
||||
print(json.dumps({'phase':values[3],'passed':row['passed'],'actual_pid':row.get('actual_pid'),'exit':row.get('exit_code'),'error':row.get('validation_error'),'guard_error':row.get('guard_error')}),flush=True)
|
||||
if row['passed']:
|
||||
changes=storage.compress_closed_phase(args.output,row)
|
||||
traces.append({'phase':values[3],'ended_native_pid':row.get('actual_pid'),'storage_only_changes':changes})
|
||||
print(json.dumps({'phase':values[3],'closed_proofs_preserved_and_compressed':len(changes)}),flush=True)
|
||||
return row
|
||||
m.execute_phase=execute
|
||||
return m
|
||||
|
||||
driver.module=module
|
||||
native=argparse.Namespace(project_root=root,output=args.output.resolve(),commit=args.commit,godot='/Applications/Godot.app/Contents/MacOS/Godot',collect=True)
|
||||
code=driver.collect(native)
|
||||
record={'target_commit':args.commit,'native_exit':code,'storage_helper_sha256':hashlib.sha256((coordinator/'native_storage_guard.py').read_bytes()).hexdigest(),'collector_sha256':hashlib.sha256((root/'tools/run_p08_mixed_migration.py').read_bytes()).hexdigest(),'snapshots_or_timepoints_omitted':0,'worker_source_changed':False,'phase_traces':traces,'original_unit_accepted':False}
|
||||
(coordinator/'NATIVE_STORAGE_COLLECTION_TRACE.json').write_text(json.dumps(record,ensure_ascii=False,indent=2)+'\n')
|
||||
raise SystemExit(code)
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
"""Coordinator storage only: transparently compress closed, owned phase proof files.
|
||||
|
||||
No snapshot/timepoint filtering. No changes to worker code or native outputs.
|
||||
Call only after execute_phase returned and actual engine_ended is true.
|
||||
"""
|
||||
from pathlib import Path
|
||||
import hashlib,json,os,subprocess
|
||||
|
||||
def compress_closed_phase(out, phase_row):
|
||||
if phase_row.get('engine_ended') is not True:
|
||||
raise RuntimeError('Owned native child must actually have ended')
|
||||
out=Path(out).resolve()
|
||||
rows=[]
|
||||
candidates=[p for p in sorted((out/'pairs').rglob('*')) if p.is_file() and not p.is_symlink() and p.suffix in ('.var','.json') and p.stat().st_size>=65536 and not p.stat().st_flags&32] if (out/'pairs').exists() else []
|
||||
for offset in range(0,len(candidates),128):
|
||||
probe=subprocess.run(['/usr/sbin/lsof','-t','--',*[str(p) for p in candidates[offset:offset+128]]],capture_output=True,text=True)
|
||||
if probe.stdout.strip(): raise RuntimeError('Owned proof has open handles')
|
||||
for p in candidates:
|
||||
if not p.is_file() or p.is_symlink() or p.suffix not in ('.var','.json'):
|
||||
continue
|
||||
old=p.stat()
|
||||
if old.st_flags & 32 or old.st_size < 65536: continue
|
||||
data_sha=hashlib.sha256(p.read_bytes()).hexdigest()
|
||||
temp=p.with_name(p.name+'.owned-hfs-temporary')
|
||||
if temp.exists(): raise RuntimeError('Storage temporary collision')
|
||||
subprocess.run(['/usr/bin/ditto','--hfsCompression','--noclone',str(p),str(temp)],check=True)
|
||||
now=temp.stat()
|
||||
if hashlib.sha256(temp.read_bytes()).hexdigest()!=data_sha or (now.st_size,now.st_mode,now.st_uid,now.st_gid,now.st_mtime_ns)!=(old.st_size,old.st_mode,old.st_uid,old.st_gid,old.st_mtime_ns):
|
||||
raise RuntimeError('Content/metadata preservation failed')
|
||||
if hashlib.sha256(p.read_bytes()).hexdigest()!=data_sha:
|
||||
raise RuntimeError('Original proof changed before replacement')
|
||||
os.replace(temp,p)
|
||||
if hashlib.sha256(p.read_bytes()).hexdigest()!=data_sha:
|
||||
raise RuntimeError('Post-replacement content mismatch')
|
||||
rows.append({'path':str(p.relative_to(out)),'bytes':old.st_size,'sha256':data_sha,'physical_before':old.st_blocks*512,'physical_after':p.stat().st_blocks*512,'whole_bytes_and_mode_owner_mtime_preserved':True})
|
||||
return rows
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"requested_models": {
|
||||
"commander": "claude-opus-5-5",
|
||||
"reviewer": "claude-opus-5-5",
|
||||
"implementer": "gpt-6.1-sol"
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"run_id": "1ae2b3b017ba4554ba5a5c5d4430eea4",
|
||||
"actual_model": "claude-opus-5-5",
|
||||
"record_sha256": "0461ab062ee532779755cf88478edf56b214389430d1d0dcc5b1c30dfb96ed08",
|
||||
"record_path": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p08-02/runs/1ae2b3b017ba4554ba5a5c5d4430eea4/command.json"
|
||||
},
|
||||
{
|
||||
"run_id": "1e1b149ca4c44ba5ad2bafd534e49ce1",
|
||||
"actual_model": "claude-opus-5-5",
|
||||
"record_sha256": "766a0d6b34de623e51e2977a5d0c912d9fde8094ba61d9d38e13d2f3ba105a12",
|
||||
"record_path": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p08-02/runs/1e1b149ca4c44ba5ad2bafd534e49ce1/command.json"
|
||||
},
|
||||
{
|
||||
"run_id": "c515ac662e484e8e8c90024b3c73ff53",
|
||||
"actual_model": "gpt-6.1-sol",
|
||||
"record_sha256": "dc94188ab040365f0849478568056acccf60b533958fbedb94babfe0d341aeea",
|
||||
"record_path": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p08-02/runs/c515ac662e484e8e8c90024b3c73ff53/command.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
+282
@@ -0,0 +1,282 @@
|
||||
{
|
||||
"authorization": "direct human latest instruction",
|
||||
"interpretation": "All The Tree individual repair caps and accumulated LLM invocation caps removed. Watchdog timeout and concurrent resource limits retained.",
|
||||
"controls": [
|
||||
{
|
||||
"control": "/private/tmp/the-tree-p24-02-control-r02",
|
||||
"before_sha256": "34d0f62ec5b17b070a2d1ad4f58d06f3be7e9b6fb649ec86b366bc03b07c1329",
|
||||
"after_sha256": "7229e4ade6b27abf2c67f979fc0fadeafe9c0e43aeb42736b5d8cfa1eaf30363"
|
||||
},
|
||||
{
|
||||
"control": "/Users/korizatou114/Antigravity/環境構築/agent-control",
|
||||
"before_sha256": "34d0f62ec5b17b070a2d1ad4f58d06f3be7e9b6fb649ec86b366bc03b07c1329",
|
||||
"after_sha256": "7229e4ade6b27abf2c67f979fc0fadeafe9c0e43aeb42736b5d8cfa1eaf30363"
|
||||
}
|
||||
],
|
||||
"tasks": [
|
||||
{
|
||||
"project": "the-tree-mana-proposal",
|
||||
"task": "MP-01",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 0,
|
||||
"state": "blocked"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-mana-proposal-r02",
|
||||
"task": "MP-01-r02",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 2,
|
||||
"state": "completed"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p04-01",
|
||||
"task": "P04-01",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 2,
|
||||
"state": "repair_pending"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p06-01",
|
||||
"task": "P06-01",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 0,
|
||||
"state": "blocked"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p08-02",
|
||||
"task": "P08-02",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 2,
|
||||
"state": "submitted"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p13-03",
|
||||
"task": "P13-03",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 2,
|
||||
"state": "blocked"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p18-01-model",
|
||||
"task": "P18-01-CODE",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 2,
|
||||
"state": "repair_pending"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p22-02-contract",
|
||||
"task": "P22-02",
|
||||
"previous_cap": 3,
|
||||
"cap": null,
|
||||
"repairs": 3,
|
||||
"state": "blocked"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p24-02-operations",
|
||||
"task": "P24-02",
|
||||
"previous_cap": 3,
|
||||
"cap": null,
|
||||
"repairs": 3,
|
||||
"state": "submitted"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p24-03",
|
||||
"task": "P24-03",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 0,
|
||||
"state": "blocked"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p24-03-code",
|
||||
"task": "P24-03",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 2,
|
||||
"state": "completed"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-runner-agy-execution",
|
||||
"task": "RP24-02",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 2,
|
||||
"state": "repair_pending"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-runner-p13-recovery",
|
||||
"task": "RP13-01",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 2,
|
||||
"state": "repair_pending"
|
||||
},
|
||||
{
|
||||
"project": "the-tree-runner-p24-review-packet",
|
||||
"task": "RP24-01",
|
||||
"previous_cap": 2,
|
||||
"cap": null,
|
||||
"repairs": 2,
|
||||
"state": "completed"
|
||||
}
|
||||
],
|
||||
"project_config_verification": [
|
||||
{
|
||||
"project": "the-tree-mana-proposal",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-mana-proposal-r02",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p04-01",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p06-01",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p08-02",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p13-03",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p18-01-model",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p22-02-contract",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p24-02-operations",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p24-03",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-p24-03-code",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-runner-agy-execution",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-runner-p13-recovery",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
},
|
||||
{
|
||||
"project": "the-tree-runner-p24-review-packet",
|
||||
"max_repair_attempts": null,
|
||||
"max_llm_runs": null,
|
||||
"config_integrity_valid": true,
|
||||
"timeout_seconds": 900,
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1
|
||||
}
|
||||
],
|
||||
"verification": {
|
||||
"local_policy_tests": 3,
|
||||
"legacy_guard_tests": 3,
|
||||
"runner_suite_including_new_default_test": 47,
|
||||
"status": "PASS",
|
||||
"actual_independent_review": "INDEPENDENT_OPUS_POLICY_REVIEW.json",
|
||||
"review_scope": "operational policy only, no game unit acceptance",
|
||||
"followup_completeness": "All14 stored config policy fields verified null and config integrity verified. Both control runner/schema field usages searched; only null-aware guards and defaults. New registration override tested. Counts/states test performed before P08 continued normally."
|
||||
},
|
||||
"historical_controls": "Older /private/tmp/the-tree-rp* control snapshots retain historical bytes and are not execution entrypoints for this continuation; current OwnerCLI uses updated p24-02-control-r02 and plugin uses updated production Runner."
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"result": {
|
||||
"status": "pass",
|
||||
"summary": "I reviewed only the diff and the APPLIED record. I had no file or search tools in this session, so I couldn't read the rest of runner/core.py, the schemas, or the control DBs. Within the diff, the change is correct. Individual repair caps and cumulative LLM run caps are removed only when the value is null. The repairs counter still increments. The state gate (only repair_pending/blocked can be repaired), the running-run guard, LLM and implementer concurrency limits, and the schema check all stay in place. Finite caps still work: a finite contract cap with a finite policy cap is still bounded, a null contract cap with a finite policy cap is refused, bools are rejected by `type(cap) is int`, and negative caps are refused. New the-tree-* registrations get null policy caps, and their contracts are forced to null. I found no confirmed material defect. However, the record doesn't show that 'all caps removed' actually holds outside the three diffed call sites (findings 1–2), so I'm passing on code correctness, not on completeness.",
|
||||
"findings": [
|
||||
"1 (completeness, unverified): The APPLIED record shows each task's contract cap set to null, but not each existing project's stored config.policy. The LLM run check reads self.config['policy']['max_llm_runs'] from each project's own config, not from the control code. If the 14 existing projects still store finite max_llm_runs / max_repair_attempts in their config, the cumulative LLM cap still applies to them. Also, tasks added later to those projects would not be forced to null, because add() only overrides when the policy repair cap is already None. Please confirm each project's config.policy shows max_llm_runs=null and max_repair_attempts=null, and that this config edit passes the integrity check that refused the policy-tamper test.",
|
||||
"2 (other uses of the fields, unverified): The diff patches 3 places that read max_repair_attempts / max_llm_runs. Any other place that does arithmetic or comparisons on these fields would now hit None and raise TypeError. Examples: status/report output like f'{repairs}/{max}' or 'remaining' math, automatic moves to blocked when repairs reach the cap, review-packet generation, watchdog/recover paths, and any policy schema that types these as integer. Please run grep -n 'max_repair_attempts\\|max_llm_runs' over runner/ and control/schemas/ (both control copies) and confirm every match handles None. The six tests only cover add, repair, and run start.",
|
||||
"3 (by design, note only): For the-tree-* projects, init() overwrites caps even when the caller passes an explicit finite policy, and add() rewrites the contract to null without saying so. So a The Tree project can no longer opt into a finite cap; finite caps only work for other projects. If approvals or review packets bind a hash or copy of the submitted contract, the stored contract (cap=null) will differ from what was reviewed. Check that no step compares contract digests.",
|
||||
"4 (residual risk, accepted by owner): With both caps null, nothing limits the total number of repair cycles or LLM calls. Only concurrency limits and the watchdog timeout remain. If any automation calls repair() without a human in the loop, it can loop forever. The repairs counter and runs table still allow monitoring after the fact; consider an alert threshold rather than a cap.",
|
||||
"5 (minor): The project match is a case-sensitive string prefix 'the-tree-', not 'TheTree' as written in the brief. Any project registered with that name gets the cap-free policy automatically. Also, check_schema's anyOf ignores any sibling keywords in the same schema node and drops the inner error detail. Neither matters for the current task.json nullable field."
|
||||
]
|
||||
},
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p08-02/runs/1e1b149ca4c44ba5ad2bafd534e49ce1",
|
||||
"scope": "operational cap change only; NOT P08 acceptance"
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"decision": {
|
||||
"action": "validate",
|
||||
"task_id": "P08-02",
|
||||
"reason": "【判断】P08-02は提出済み(e59206b9b2578ddb4a1ec023f836d413a7a8fbfb、repairs=2)なので、次の1手はこの提出SHAに対する正式なvalidate(p08-evidence)です。確定事実から、writer52976とQA55276はguest_elevatorで材料が10不足して失敗する見込みです。ただし、修正理由はRunnerの正式な検証失敗記録に紐づける必要があり、記録なしにrepairへ進むことはしません。全面的な再調査や再実装は行いません。\n\n【全体の順序】\n(1) 今:e59206bに対してvalidateを実行し、失敗の詳細(不足額・フェーズ・PID)を記録する。\n(2) Aをオーナー/Root側の運用変更として適用する。P08-02の作業者の許可範囲外であり、私(コマンダー)も編集しません。\n(3) Aが反映されたのを確かめてから、request-repairで同じ作業者・同じworktree(TheTree-managed-worktrees/p08-02/P08-02-implement)にB+Cを指示する。\n(4) Root側で収集する:実ネイティブのwriter/reader別PID、Operations ON/OFFの全ケース、後段で解消できないbatchの拒否、正式なセーブ/バックアップ、本番メニューでの実際のOS入力と画面、最終の全回帰テスト。\n(5) checker --verify-only を実行する。\n(6) 別セッションのOpusが独立してレビューする。\n(7) 統合準備を進める。統合とledger反映はオーナー判断です。\n\n【A Runner運用変更(オーナーの明示指示。Root/オーナーが実施し、作業者と私は編集しない)】\n・max_repair_attemptsにnullを許可し、null=上限なしとする。整数は従来どおり有限の上限として扱う。\n・repairsの使用回数はそのまま保持し、リセットや偽造はしない。\n・登録schemaのvalidator、policy、repair guardの3か所で、null時は回数チェックを飛ばす分岐にする。上限超過だけを理由にblockedや再承認待ちにしない。\n・TheTreeに登録済みの全タスクの値をnullに移行し、新規登録時の既定値もnullにする。\n・timeout、同時実行数、resource_locks、品質門(validate、独立レビュー、受入分母、統合承認)は一切緩めない。成功状態の書き込みや手動でのPASS化は禁止する。\n・変更差分と、全登録タスクに適用した結果の一覧を記録として残す。\n\n【B(request-repair時に作業者へ渡す指示。原製品の値は変更しない)】\n・P08 fixtureの計画建設をすべて対象に、実際のcatalogから費用を読み取り、合計を求めるコードをfixture内に置く。対象は次のとおり:warehouse、kitchen、infirmary、staff_door、reception×2、guest_elevator、staff_dormitory、premium_room×2、service_stairs×3、guest_stairs×3、staff_ginaのsigning_cost、rawfood8×実際の単価。定数のハードコードは禁止。\n・初期資源との差額だけを、既存の領域メソッドchange_resourcesで加算する。これは診断用の入力であることをmetadataに明記し、計算の内訳と合計を保存する。\n・catalog、価格、経済係数、本体コードは一切変更しない。\n・writerの事前チェックで、資源が不足していれば具体的な不足額を出して非0で終了させる。checker testに「資源不足の負例」を1件追加する。\n\n【C(同じ修正内で実施)】\n・旧1MBのhistoryファイルを、816BのPROPOSED_HISTORY_REFERENCE.json形式の参照に置き換える。参照にはGitの2版のblob SHAと、検証済みgzipのrawSHA/サイズを記載する。\n・metadata内のhistory linkのSHAを、PROPOSED_CURRENT_HISTORY_LINK.jsonに合わせて同期する。\n・checkerは参照を解決し、gzipを展開した内容のSHAが一致することを検証する。一致しない場合や欠損している場合は非0にする。\n・source17を含むpacketが500000未満(案では433604)であることを、Root側で実測する。過去の失敗ログはすべて保持する。\n・変更はallowed_paths(tests/fixtures/p08-02/**、execution/p08-02/**、checker/test/driver)の範囲に限る。p08-02-audit-r01の資料は読み取り専用の参照として使う。\n・作業者が実行するのは、python -B、ast.parse、checkerの局所テストまで。native実行と全回帰はRoot側の担当。\n\n【未完了の受入条件】OS入力、ON/OFFの全ケース、reader別PIDでの継続、全回帰、独立レビュー。いずれも未収集であり、合格扱いにはしません。",
|
||||
"codex_model": "gpt-6.1-sol",
|
||||
"codex_model_reason": "今回は検証の手番で、続く修正も範囲が限られています。fixture内での費用の合計計算とchange_resources、history参照ファイルの置き換えとSHA同期、checkerの負例1件で、原因と修正案はすでに確定しています。高度な推論は不要なので、品質・時間・使用量のバランスから既定のSolが妥当です。"
|
||||
},
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p08-02/runs/8f9b4eaf22ae48daba84c2f5993bd8a4"
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"decision": {
|
||||
"action": "run",
|
||||
"task_id": "P08-02",
|
||||
"reason": "P08-02は状態がrepair_ready(repairs=3、上限null=unlimited、保持済み)です。既存の同一worktree(base e196578、submitted e59206b)で通常のrepair runを1回だけ行います。全面的な再実装と2つ目のworkerの起動は禁止です。\n\n【worker作業指示】\n0) 最初に docs/plans/original-completion-2026-10-02/execution/p08-02/ROOT_REPAIR_INPUT-r04.json だけを読む。これはRootが格納した実提案4件の全文(約12KB)で、作業の主な入力。巨大なold historyやRoot外部の成果物パスは読まない・開かない・実行しない。次の手順に入る前に、変更範囲(allowed_pathsの範囲内)と検証方針を短く宣言する。\n\n1) 診断B(資源差額): 登録済みの建設費(construction cost)、雇用時の契約金(hire signing)、food 8件の価格を既存のドメイン定義から読み、合計する。その合計と、fixtureが記録する既存の change_resources 差額を照合する診断を準備する。経済値の新規作成、係数の発明、価格変更はしない。fixtureの値とseedは診断入力として明示する。一致しなければ、受入を狭めずに差分を報告する。\n\n2) fixture C(三段階の全建設): tests/fixtures/p08-02 のwriterとreaderを最小限変更し、建設の三段階(未着手または支払済みの開始段階、進行途中、完成施設)をすべて同一batchで網羅する。各段階のジョブについて、進捗・支払・予約・完成IDの保全が観測できるようにする。既存の6観点(客の経路、職員、救護、物流、EV、占有)は減らさない。\n\n3) old historyの重複削減: 約1MBの重複コピーを、実際に保全済みのGit上の2版と、gzip原文のSHA参照に置き換える。current metadataのリンク(implementation.json、CONDITION_MATRIX.mdなど)を同期する。old history参照は履歴保全のためのメタデータで、ゲーム受入の入力ではない。そのため、外部の絶対パスにあるgzipを実行時の必須依存としてcheckerに追加しない。原文SHAの照合は、Rootが実測済みの証拠を値として再利用する。削除する前に、参照先のSHAが一致することを確認する。履歴上の失敗ログは保持する。\n\n4) checkerとテストの変更は、受入に必要な最小限に限る。上記のB/C/参照変更をcheck()が検証できる範囲だけ追加する。正の例は到達可能にし、負の例は使い捨てfixtureの中だけで作る。テストを増やしすぎない。実装を写しただけの自明な試験も作らない。\n\n5) 次は不変: 保持対象のdriverとcheckerを含む全17 sources、.uid、full状態の収集全件、current_source_pins、completion_marker_contractsの既存エントリ、run_all_tests.py、本番のruntime/UIコード。900sのtimeoutは保持する。\n\n6) worker内での検証は、python -B による ast.parse と、checkerの意味のある局所試験(tools/test_p08_migration_evidence.py)だけ。Godot、native、full regression、OS収集は実行しない。\n\n7) 結果は status=submitted で返す。変更ファイル、SHA、実行した試験の実際の結果を書く。未達の原条件として、Rootによる実nativeの全ON/OFF writer/reader、OS操作、最終回帰、独立Opusレビューを列挙する。product側の欠陥を見つけた場合は、修正パッチ案と失敗の証拠を提案として添える。完了を自分で宣言しない。git書き込み、上限の変更、方針の変更はしない。",
|
||||
"codex_model": "gpt-6.1-sol",
|
||||
"codex_model_reason": "作業範囲が限られています。入力は約12KBのROOT_REPAIR_INPUT-r04.jsonに集約済みで、old historyは読みません。作業は資源差額の診断、fixtureの三段階網羅、old history重複のSHA参照化、checkerの最小限修正で、変更先はallowed_pathsの範囲内です。native、OS、回帰の検証はRootが担います。指示が具体的で設計判断の余地が小さいため、品質面で上位モデルを使う理由は弱く、時間と使用量の面では既定のsolが適切です。"
|
||||
},
|
||||
"artifact": "/Users/korizatou114/Library/Application Support/agent-control/the-tree-p08-02/runs/1ae2b3b017ba4554ba5a5c5d4430eea4"
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
個別上限撤廃はユーザーの直接指示に基づき適用した。The Tree登録14プロジェクト・14タスクの修正上限と累積LLM起動回数上限をnull(上限なし)へ移行した。使用済み回数、原受入分母、仕様、提出版、作業状態、検証、独立レビュー、実行同時数、watchdog timeoutを保持する。新規The Tree登録も上限なしを既定とする。
|
||||
|
||||
Opus 5.5の実判断と別セッションの運用変更レビューを保存した。レビューの留保(全保存policyと他使用箇所の確認)は、全14設定のnull値と整合ハッシュ、現行2controlの検索と局所試験で照合した。47試験(Runner既存46+新規登録の既定1)はPASS。他にnullable/state/count局所3と既存guard3もPASS。ゲームの受入を意味しない。
|
||||
|
||||
P08-02は同じ保持成果と同じSol担当を継続。個別上限による承認待ちは撤廃した。Opus具体指示はOPUS_P08_RUN_DIRECTION.json。過去native失敗と実保存履歴を再利用し、正確な新提出SHAに必要なnative・通常OS・最終回帰・独立レビューを実施してから元成果単位の完了を判定する。30/88の分母と部分点なしは維持。
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"method": "same-byte APFS clone; mode uid gid flags mtime xattrs and fullSHA checked",
|
||||
"rows": [
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/audio/bgm/tree_theme_back_candidate.wav",
|
||||
"sha256": "efe4cc1aa588661d73376720e4278427f7220ce93a5d446f198c5af607c141ca",
|
||||
"bytes": 7526444,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/audio/bgm/tree_theme_front_candidate.wav",
|
||||
"sha256": "6df0a7af307327f703c9325f5ca2ac456888102d50ef1fa76bf4cdf19d2b86cb",
|
||||
"bytes": 7526444,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/kenney/tiny_town/Sample.png",
|
||||
"sha256": "cb909e46bf51deb2906eeeb14b323aa42e861a738a734f449dc460ad682e4ccc",
|
||||
"bytes": 112122,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/mockups/the-tree-main-gameplay-visual-mock-v1.png",
|
||||
"sha256": "58877bb1afbf0e72af6531cadab01eca82f9bd8cefb0cdb45f81d6d2dbb83717",
|
||||
"bytes": 2722232,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/mockups/the-tree-main-gameplay-visual-mock-v2-japanese-fantasy.png",
|
||||
"sha256": "1c079ebb8b2b9610df0e79a2750cc5a0db53f26d137b6df511b12cb6884532d0",
|
||||
"bytes": 3049138,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/mockups/the-tree-main-gameplay-visual-mock-v3-tower-style.png",
|
||||
"sha256": "f802d2b4f275f136fcacc963f7d06228f5d71dbc2399a19f7e04c6bc7531321b",
|
||||
"bytes": 3076090,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/mockups/the-tree-runtime-ui-v3-assets-front.png",
|
||||
"sha256": "e54ff252bae66010dc885846acdcdb0117b930e0e3cfc8f5459acc2841eabf0d",
|
||||
"bytes": 1461992,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/mockups/the-tree-runtime-ui-v3-first-pass.png",
|
||||
"sha256": "cc7f23ea258d49a8f2bd23735c63196b94ece380eaed934ee6e7f1b6d881cb44",
|
||||
"bytes": 434318,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/mockups/the-tree-runtime-ui-v4-icons.png",
|
||||
"sha256": "b0826ffce116d96dbe5b901174713f84b55a0e72931f29821e0947b844b9c1b8",
|
||||
"bytes": 1317405,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/mockups/the-tree-runtime-ui-v5-map-icons.png",
|
||||
"sha256": "aca56c954b209b0a03342c0fde576cef15bfaa2ce2a1f9feedd51744fcfdb42c",
|
||||
"bytes": 1321334,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/mockups/the-tree-runtime-ui-v6-actors-4k.png",
|
||||
"sha256": "9b8a1d9e2e4408b7ee99505d1978a44a489eb8b6945d669d1c52e7e220937e79",
|
||||
"bytes": 6569282,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/mockups/the-tree-runtime-ui-v6-actors.png",
|
||||
"sha256": "8f9ea1b8bbc779e3f401d4cfdc8dcb0d10b95b7f87f37d3737af9bc85aa9dddd",
|
||||
"bytes": 1322150,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/mockups/the-tree-runtime-ui-v7-skins-4k.png",
|
||||
"sha256": "a32d61772e06b944cf7aeb7a2dd0bd1ccfac7cbb3d8e293a6d7075f780f48904",
|
||||
"bytes": 8849219,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/mockups/the-tree-runtime-ui-v7-skins.png",
|
||||
"sha256": "f0dec82c2da661df52124cd3c2f59c3ac94db9cb5d384846d42f1901ada370cf",
|
||||
"bytes": 1778605,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/themes/japanese_fantasy/actor-markers-v2.png",
|
||||
"sha256": "b742c207613d773e47f21c917975a2ba0eec8a2d9485ff655fef37e3ebf4bde4",
|
||||
"bytes": 2165570,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/themes/japanese_fantasy/facility-icons-v2.png",
|
||||
"sha256": "6fb830fbe3961125fe0f3e640efe63ecba4de5ea6fb758eaf0da2738940fa1b6",
|
||||
"bytes": 1848036,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/themes/japanese_fantasy/system-icons-v2.png",
|
||||
"sha256": "1f1d4f5e20ba4de61e3fb967352b68db435fa36ec5e4bacab2802f132e3b8d40",
|
||||
"bytes": 1786659,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/themes/japanese_fantasy/ui-skin-v1.png",
|
||||
"sha256": "4b4906cc9c6ed3fdb5330bfc11177376e5fec10afa3f2dac9318dbaf71833ff2",
|
||||
"bytes": 2492477,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/themes/japanese_fantasy/world-back-v1.png",
|
||||
"sha256": "2b0dbf07c17e677ed023c56b1e90f013c40362f46c427950033868b042508c7c",
|
||||
"bytes": 2616183,
|
||||
"all_content_and_attrs_preserved": true
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f/assets/themes/japanese_fantasy/world-front-v1.png",
|
||||
"sha256": "02b52ea05bdb4bbe78b8c905374052505bb73411eb7f2b0578e9b1a82994cde5",
|
||||
"bytes": 2774704,
|
||||
"all_content_and_attrs_preserved": true
|
||||
}
|
||||
]
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
from pathlib import Path
|
||||
import json,hashlib,sqlite3,time,shutil
|
||||
root=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/execution/unlimited-individual-limits-r01')
|
||||
controls=[Path('/private/tmp/the-tree-p24-02-control-r02'),Path('/Users/korizatou114/Antigravity/環境構築/agent-control')]
|
||||
rows=[]
|
||||
for i,c in enumerate(controls):
|
||||
p=c/'runner/core.py'; old=p.read_text(); (root/f'core-before-{i}.py').write_text(old)
|
||||
new=old.replace(' typ = schema.get("type")\n',' if "anyOf" in schema:\n for choice in schema["anyOf"]:\n try:\n check_schema(value, choice)\n return\n except GateError:\n pass\n raise GateError("結果schemaのanyOf違反")\n typ = schema.get("type")\n if typ == "null":\n require(value is None, "結果schemaの型違反: null")\n return\n',1)
|
||||
new=new.replace(' require(0 <= contract["max_repair_attempts"] <= self.config["policy"]["max_repair_attempts"], "修正上限超過")',' cap = contract["max_repair_attempts"]; policy_cap = self.config["policy"]["max_repair_attempts"]\n require(cap is None and policy_cap is None or type(cap) is int and cap >= 0 and (policy_cap is None or cap <= policy_cap), "修正上限超過")',1)
|
||||
new=new.replace('require(task["repairs"] < c["max_repair_attempts"], "repair_limit")','require(c["max_repair_attempts"] is None or task["repairs"] < c["max_repair_attempts"], "repair_limit")',1)
|
||||
new=new.replace('require(self.db.execute("SELECT COUNT(*) FROM runs WHERE service IS NOT NULL").fetchone()[0] < policy["max_llm_runs"], "budget_limit: LLM起動数上限")','require(policy["max_llm_runs"] is None or self.db.execute("SELECT COUNT(*) FROM runs WHERE service IS NOT NULL").fetchone()[0] < policy["max_llm_runs"], "budget_limit: LLM起動数上限")',1)
|
||||
assert new != old
|
||||
p.write_text(new)
|
||||
schema=c/'schemas/task.json'; s=json.loads(schema.read_text()); (root/f'task-schema-before-{i}.json').write_text(schema.read_text()); s['properties']['max_repair_attempts']={'anyOf':[{'type':'integer','minimum':0},{'type':'null'}],'default':None};schema.write_text(json.dumps(s,ensure_ascii=False,indent=2)+'\n')
|
||||
rows.append({'control':str(c),'before_sha256':hashlib.sha256(old.encode()).hexdigest(),'after_sha256':hashlib.sha256(new.encode()).hexdigest()})
|
||||
# Future The Tree registrations inherit null; other projects retain defaults.
|
||||
for c in controls:
|
||||
p=c/'runner/core.py'; txt=p.read_text(); needle=' config = {"project": project, "repo": str(repo), "worktree_root": str(wt), "policy": p, "validations": validations}'
|
||||
txt=txt.replace(needle,' if project.startswith("the-tree-"):\n p = dict(p, max_repair_attempts=None, max_llm_runs=None)\n'+needle,1)
|
||||
p.write_text(txt)
|
||||
# Atomic per project; no active inference/config migration races permitted.
|
||||
records=[]
|
||||
for cfg in sorted(Path('/Users/korizatou114/Library/Application Support/agent-control').glob('the-tree-*/config.json')):
|
||||
config=json.loads(cfg.read_text()); db=sqlite3.connect(cfg.parent/'state.sqlite'); db.row_factory=sqlite3.Row
|
||||
assert not db.execute("SELECT 1 FROM runs WHERE status='running'").fetchone(),str(cfg)
|
||||
before=json.loads(json.dumps(config)); contracts=[dict(r) for r in db.execute('SELECT * FROM tasks')]
|
||||
(root/(config['project']+'-before.json')).write_text(json.dumps({'config':before,'tasks':contracts},ensure_ascii=False,indent=2)+'\n')
|
||||
config['policy']['max_repair_attempts']=None;config['policy']['max_llm_runs']=None
|
||||
db.execute('BEGIN IMMEDIATE')
|
||||
for row in contracts:
|
||||
contract=json.loads(row['contract']);old_cap=contract['max_repair_attempts'];contract['max_repair_attempts']=None
|
||||
db.execute('UPDATE tasks SET contract=? WHERE id=?',(json.dumps(contract,ensure_ascii=False),row['id']))
|
||||
data={'owner_instruction':'個別上限を全て撤廃して、勝手に作業停止することを避けて','previous_cap':old_cap,'new_cap':None,'unlimited':True,'repairs_retained':row['repairs'],'state_retained':row['state'],'llm_count_retained':True,'acceptance_and_scope_unchanged':True}
|
||||
db.execute('INSERT INTO events(task_id,event,data,created) VALUES(?,?,?,?)',(row['id'],'owner_unlimited_individual_attempts',json.dumps(data,ensure_ascii=False),time.time()))
|
||||
records.append({'project':config['project'],'task':row['id'],'previous_cap':old_cap,'cap':None,'repairs':row['repairs'],'state':row['state']})
|
||||
cfg.write_text(json.dumps(config,ensure_ascii=False,indent=2)+'\n')
|
||||
digest=hashlib.sha256(json.dumps(config,sort_keys=True,ensure_ascii=False).encode()).hexdigest()
|
||||
db.execute('UPDATE meta SET value=? WHERE key=?',(digest,'config_digest')); db.commit();db.close()
|
||||
(root/'APPLIED.json').write_text(json.dumps({'authorization':'direct human latest instruction','interpretation':'All The Tree individual repair caps and accumulated LLM invocation caps removed. Watchdog timeout and concurrent resource limits retained.','controls':rows,'tasks':records},ensure_ascii=False,indent=2)+'\n')
|
||||
print(json.dumps({'migrated_tasks':len(records),'projects':len(set(r['project'] for r in records)),'caps':None,'states_and_counts_retained':True}))
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
from pathlib import Path
|
||||
import subprocess,hashlib,os,json
|
||||
src=Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-implement')
|
||||
dst=Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-validation-8c6fdd1f')
|
||||
rows=[]
|
||||
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
|
||||
def attrs(p):
|
||||
names=subprocess.check_output(['/usr/bin/xattr',str(p)],text=True).splitlines()
|
||||
return {n:subprocess.check_output(['/usr/bin/xattr','-px',n,str(p)]).decode() for n in names}
|
||||
for p in sorted((dst/'assets').rglob('*')):
|
||||
if not p.is_file() or p.is_symlink() or p.stat().st_size<65536:continue
|
||||
s=src/p.relative_to(dst)
|
||||
if not s.is_file() or s.stat().st_size!=p.stat().st_size:continue
|
||||
old=p.stat();h=sha(p)
|
||||
if sha(s)!=h:continue
|
||||
a=attrs(p);temp=p.with_name(p.name+'.owner-clone-temp')
|
||||
assert not temp.exists()
|
||||
subprocess.run(['/bin/cp','-pc',str(s),str(temp)],check=True)
|
||||
os.utime(temp,ns=(old.st_atime_ns,old.st_mtime_ns));os.chmod(temp,old.st_mode);os.chflags(temp,old.st_flags)
|
||||
for n in attrs(temp):
|
||||
if n not in a:subprocess.run(['/usr/bin/xattr','-d',n,str(temp)],check=True)
|
||||
for n,v in a.items():subprocess.run(['/usr/bin/xattr','-wx',n,''.join(v.split()),str(temp)],check=True)
|
||||
t=temp.stat();assert sha(temp)==h and attrs(temp)==a and (t.st_size,t.st_mode,t.st_uid,t.st_gid,t.st_flags,t.st_mtime_ns)==(old.st_size,old.st_mode,old.st_uid,old.st_gid,old.st_flags,old.st_mtime_ns)
|
||||
assert sha(p)==h
|
||||
os.replace(temp,p);assert sha(p)==h
|
||||
rows.append({'path':str(p),'sha256':h,'bytes':old.st_size,'all_content_and_attrs_preserved':True})
|
||||
output=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/execution/unlimited-individual-limits-r01/VALIDATION_STABLE_COW.json')
|
||||
output.write_text(json.dumps({'method':'same-byte APFS clone; mode uid gid flags mtime xattrs and fullSHA checked','rows':rows},indent=2)+'\n')
|
||||
print('verified files',len(rows))
|
||||
+1133
File diff suppressed because it is too large
Load Diff
+1133
File diff suppressed because it is too large
Load Diff
+67
@@ -0,0 +1,67 @@
|
||||
--- runner/core.py.before
|
||||
+++ runner/core.py.after
|
||||
@@ -338,7 +338,18 @@
|
||||
|
||||
def check_schema(value, schema):
|
||||
"""Small strict validator for the schemas we ship (also used locally after CLI output)."""
|
||||
+ if "anyOf" in schema:
|
||||
+ for choice in schema["anyOf"]:
|
||||
+ try:
|
||||
+ check_schema(value, choice)
|
||||
+ return
|
||||
+ except GateError:
|
||||
+ pass
|
||||
+ raise GateError("結果schemaのanyOf違反")
|
||||
typ = schema.get("type")
|
||||
+ if typ == "null":
|
||||
+ require(value is None, "結果schemaの型違反: null")
|
||||
+ return
|
||||
types = {"object": dict, "array": list, "string": str, "integer": int, "boolean": bool}
|
||||
require(typ not in types or isinstance(value, types[typ]), f"結果schemaの型違反: {typ}")
|
||||
require("enum" not in schema or value in schema["enum"], "結果schemaのenum違反")
|
||||
@@ -451,6 +462,8 @@
|
||||
require(not wt.is_relative_to(repo), "worktree rootはrepo外にしてください")
|
||||
p = policy or read_json(CONTROL / "policies/default.json")
|
||||
require(p["api_fallback"] is False and p["owner_approval_required"] is True, "初期運用のAPI/承認policy違反")
|
||||
+ if project.startswith("the-tree-"):
|
||||
+ p = dict(p, max_repair_attempts=None, max_llm_runs=None)
|
||||
config = {"project": project, "repo": str(repo), "worktree_root": str(wt), "policy": p, "validations": validations}
|
||||
root.mkdir(parents=True, mode=0o700)
|
||||
os.chmod(root, 0o700)
|
||||
@@ -490,6 +503,8 @@
|
||||
self.event(task_id, state, {"reason": reason})
|
||||
|
||||
def add(self, contract):
|
||||
+ if self.config["project"].startswith("the-tree-") and self.config["policy"]["max_repair_attempts"] is None:
|
||||
+ contract = dict(contract, max_repair_attempts=None)
|
||||
check_schema(contract,read_json(CONTROL/"schemas/task.json"))
|
||||
required = {"id", "title", "requirement_ids", "acceptance_ids", "spec_ref", "base_commit", "worker",
|
||||
"allowed_paths", "depends_on", "resource_locks", "validation_ids", "max_repair_attempts"}
|
||||
@@ -515,7 +530,8 @@
|
||||
spec_text = git(self.repo, "show", f"{base}:{spec}")
|
||||
for rid in contract["requirement_ids"]:
|
||||
require(rid in spec_text, f"仕様に要件IDがありません: {rid}")
|
||||
- require(0 <= contract["max_repair_attempts"] <= self.config["policy"]["max_repair_attempts"], "修正上限超過")
|
||||
+ cap = contract["max_repair_attempts"]; policy_cap = self.config["policy"]["max_repair_attempts"]
|
||||
+ require(cap is None and policy_cap is None or type(cap) is int and cap >= 0 and (policy_cap is None or cap <= policy_cap), "修正上限超過")
|
||||
for dep in contract["depends_on"]:
|
||||
self.task(dep)
|
||||
require(contract["id"] not in contract["depends_on"], "自己依存")
|
||||
@@ -735,7 +751,7 @@
|
||||
policy=self.config["policy"]
|
||||
if service:
|
||||
require(self.db.execute("SELECT COUNT(*) FROM runs WHERE service IS NOT NULL AND status='running'").fetchone()[0] < policy["max_llm"], "llm_concurrency_limit")
|
||||
- require(self.db.execute("SELECT COUNT(*) FROM runs WHERE service IS NOT NULL").fetchone()[0] < policy["max_llm_runs"], "budget_limit: LLM起動数上限")
|
||||
+ require(policy["max_llm_runs"] is None or self.db.execute("SELECT COUNT(*) FROM runs WHERE service IS NOT NULL").fetchone()[0] < policy["max_llm_runs"], "budget_limit: LLM起動数上限")
|
||||
if role in ("implementer","ui"):
|
||||
require(self.db.execute("SELECT COUNT(*) FROM runs WHERE role IN ('implementer','ui') AND status='running'").fetchone()[0] < policy["max_implementers"], "implementer_concurrency_limit")
|
||||
self.db.execute("INSERT INTO runs(id,task_id,role,service,status,started,artifact) VALUES(?,?,?,?,?,?,?)",
|
||||
@@ -1000,7 +1016,7 @@
|
||||
task=self.task(task_id); c=json.loads(task["contract"])
|
||||
require(task["state"] in ("repair_pending","blocked"),"修正対象の状態ではありません")
|
||||
require(not self.db.execute("SELECT 1 FROM runs WHERE task_id=? AND status='running'",(task_id,)).fetchone(),"実行中です")
|
||||
- require(task["repairs"] < c["max_repair_attempts"], "repair_limit")
|
||||
+ require(c["max_repair_attempts"] is None or task["repairs"] < c["max_repair_attempts"], "repair_limit")
|
||||
self.db.execute("UPDATE tasks SET repairs=repairs+1,candidate=NULL,main_base=NULL WHERE id=?",(task_id,))
|
||||
self.db.execute("DELETE FROM approvals WHERE task_id=?",(task_id,))
|
||||
self.state(task_id,"repair_ready")
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
--- runner/core.py.before
|
||||
+++ runner/core.py.after
|
||||
@@ -338,7 +338,18 @@
|
||||
|
||||
def check_schema(value, schema):
|
||||
"""Small strict validator for the schemas we ship (also used locally after CLI output)."""
|
||||
+ if "anyOf" in schema:
|
||||
+ for choice in schema["anyOf"]:
|
||||
+ try:
|
||||
+ check_schema(value, choice)
|
||||
+ return
|
||||
+ except GateError:
|
||||
+ pass
|
||||
+ raise GateError("結果schemaのanyOf違反")
|
||||
typ = schema.get("type")
|
||||
+ if typ == "null":
|
||||
+ require(value is None, "結果schemaの型違反: null")
|
||||
+ return
|
||||
types = {"object": dict, "array": list, "string": str, "integer": int, "boolean": bool}
|
||||
require(typ not in types or isinstance(value, types[typ]), f"結果schemaの型違反: {typ}")
|
||||
require("enum" not in schema or value in schema["enum"], "結果schemaのenum違反")
|
||||
@@ -451,6 +462,8 @@
|
||||
require(not wt.is_relative_to(repo), "worktree rootはrepo外にしてください")
|
||||
p = policy or read_json(CONTROL / "policies/default.json")
|
||||
require(p["api_fallback"] is False and p["owner_approval_required"] is True, "初期運用のAPI/承認policy違反")
|
||||
+ if project.startswith("the-tree-"):
|
||||
+ p = dict(p, max_repair_attempts=None, max_llm_runs=None)
|
||||
config = {"project": project, "repo": str(repo), "worktree_root": str(wt), "policy": p, "validations": validations}
|
||||
root.mkdir(parents=True, mode=0o700)
|
||||
os.chmod(root, 0o700)
|
||||
@@ -490,6 +503,8 @@
|
||||
self.event(task_id, state, {"reason": reason})
|
||||
|
||||
def add(self, contract):
|
||||
+ if self.config["project"].startswith("the-tree-") and self.config["policy"]["max_repair_attempts"] is None:
|
||||
+ contract = dict(contract, max_repair_attempts=None)
|
||||
check_schema(contract,read_json(CONTROL/"schemas/task.json"))
|
||||
required = {"id", "title", "requirement_ids", "acceptance_ids", "spec_ref", "base_commit", "worker",
|
||||
"allowed_paths", "depends_on", "resource_locks", "validation_ids", "max_repair_attempts"}
|
||||
@@ -515,7 +530,8 @@
|
||||
spec_text = git(self.repo, "show", f"{base}:{spec}")
|
||||
for rid in contract["requirement_ids"]:
|
||||
require(rid in spec_text, f"仕様に要件IDがありません: {rid}")
|
||||
- require(0 <= contract["max_repair_attempts"] <= self.config["policy"]["max_repair_attempts"], "修正上限超過")
|
||||
+ cap = contract["max_repair_attempts"]; policy_cap = self.config["policy"]["max_repair_attempts"]
|
||||
+ require(cap is None and policy_cap is None or type(cap) is int and cap >= 0 and (policy_cap is None or cap <= policy_cap), "修正上限超過")
|
||||
for dep in contract["depends_on"]:
|
||||
self.task(dep)
|
||||
require(contract["id"] not in contract["depends_on"], "自己依存")
|
||||
@@ -735,7 +751,7 @@
|
||||
policy=self.config["policy"]
|
||||
if service:
|
||||
require(self.db.execute("SELECT COUNT(*) FROM runs WHERE service IS NOT NULL AND status='running'").fetchone()[0] < policy["max_llm"], "llm_concurrency_limit")
|
||||
- require(self.db.execute("SELECT COUNT(*) FROM runs WHERE service IS NOT NULL").fetchone()[0] < policy["max_llm_runs"], "budget_limit: LLM起動数上限")
|
||||
+ require(policy["max_llm_runs"] is None or self.db.execute("SELECT COUNT(*) FROM runs WHERE service IS NOT NULL").fetchone()[0] < policy["max_llm_runs"], "budget_limit: LLM起動数上限")
|
||||
if role in ("implementer","ui"):
|
||||
require(self.db.execute("SELECT COUNT(*) FROM runs WHERE role IN ('implementer','ui') AND status='running'").fetchone()[0] < policy["max_implementers"], "implementer_concurrency_limit")
|
||||
self.db.execute("INSERT INTO runs(id,task_id,role,service,status,started,artifact) VALUES(?,?,?,?,?,?,?)",
|
||||
@@ -1000,7 +1016,7 @@
|
||||
task=self.task(task_id); c=json.loads(task["contract"])
|
||||
require(task["state"] in ("repair_pending","blocked"),"修正対象の状態ではありません")
|
||||
require(not self.db.execute("SELECT 1 FROM runs WHERE task_id=? AND status='running'",(task_id,)).fetchone(),"実行中です")
|
||||
- require(task["repairs"] < c["max_repair_attempts"], "repair_limit")
|
||||
+ require(c["max_repair_attempts"] is None or task["repairs"] < c["max_repair_attempts"], "repair_limit")
|
||||
self.db.execute("UPDATE tasks SET repairs=repairs+1,candidate=NULL,main_base=NULL WHERE id=?",(task_id,))
|
||||
self.db.execute("DELETE FROM approvals WHERE task_id=?",(task_id,))
|
||||
self.state(task_id,"repair_ready")
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"$schema":"https://json-schema.org/draft/2020-12/schema",
|
||||
"title":"Runner task contract (not a provider configuration)",
|
||||
"type":"object",
|
||||
"required":["id","title","requirement_ids","acceptance_ids","spec_ref","base_commit","worker","allowed_paths","depends_on","resource_locks","validation_ids","max_repair_attempts"],
|
||||
"properties":{
|
||||
"id":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_-]{0,63}$"},
|
||||
"title":{"type":"string","minLength":1},
|
||||
"requirement_ids":{"type":"array","items":{"type":"string"},"minItems":1,"uniqueItems":true},
|
||||
"acceptance_ids":{"type":"array","items":{"type":"string"},"minItems":1,"uniqueItems":true},
|
||||
"spec_ref":{"type":"string"},"base_commit":{"type":"string","pattern":"^[0-9a-f]{40,64}$"},
|
||||
"worker":{"type":"string","enum":["codex","agy"]},
|
||||
"role":{"type":"string","enum":["implementer","ui"]},
|
||||
"allowed_paths":{"type":"array","items":{"type":"string"},"minItems":1},
|
||||
"depends_on":{"type":"array","items":{"type":"string"}},
|
||||
"resource_locks":{"type":"array","items":{"type":"string"},"uniqueItems":true},
|
||||
"validation_ids":{"type":"array","items":{"type":"string"},"minItems":1,"uniqueItems":true},
|
||||
"max_repair_attempts":{"type":"integer","minimum":0,"maximum":2}
|
||||
},
|
||||
"additionalProperties":false
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"$schema":"https://json-schema.org/draft/2020-12/schema",
|
||||
"title":"Runner task contract (not a provider configuration)",
|
||||
"type":"object",
|
||||
"required":["id","title","requirement_ids","acceptance_ids","spec_ref","base_commit","worker","allowed_paths","depends_on","resource_locks","validation_ids","max_repair_attempts"],
|
||||
"properties":{
|
||||
"id":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_-]{0,63}$"},
|
||||
"title":{"type":"string","minLength":1},
|
||||
"requirement_ids":{"type":"array","items":{"type":"string"},"minItems":1,"uniqueItems":true},
|
||||
"acceptance_ids":{"type":"array","items":{"type":"string"},"minItems":1,"uniqueItems":true},
|
||||
"spec_ref":{"type":"string"},"base_commit":{"type":"string","pattern":"^[0-9a-f]{40,64}$"},
|
||||
"worker":{"type":"string","enum":["codex","agy"]},
|
||||
"role":{"type":"string","enum":["implementer","ui"]},
|
||||
"allowed_paths":{"type":"array","items":{"type":"string"},"minItems":1},
|
||||
"depends_on":{"type":"array","items":{"type":"string"}},
|
||||
"resource_locks":{"type":"array","items":{"type":"string"},"uniqueItems":true},
|
||||
"validation_ids":{"type":"array","items":{"type":"string"},"minItems":1,"uniqueItems":true},
|
||||
"max_repair_attempts":{"type":"integer","minimum":0,"maximum":2}
|
||||
},
|
||||
"additionalProperties":false
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
import sys,json,unittest
|
||||
sys.path.insert(0,'/private/tmp/the-tree-p24-02-control-r02')
|
||||
from tests.test_runner import RunnerTests
|
||||
class Defaults(unittest.TestCase):
|
||||
def test_new_tree_registration_unlimited(self):
|
||||
case=RunnerTests('test_repair_limit');case.setUp()
|
||||
try:
|
||||
case.r.config['project']='the-tree-default-test';case.r.config['policy']['max_repair_attempts']=None
|
||||
c=dict(case.contract,id='T002',acceptance_ids=['AC-002'],requirement_ids=['REQ-002'],allowed_paths=['other/**'],resource_locks=[])
|
||||
case.r.add(c);self.assertIsNone(json.loads(case.r.task('T002')['contract'])['max_repair_attempts'])
|
||||
self.assertEqual(c['max_repair_attempts'],2)
|
||||
finally:case.tearDown()
|
||||
if __name__=='__main__':unittest.main()
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
import sys,json,sqlite3,unittest,importlib
|
||||
from pathlib import Path
|
||||
sys.path.insert(0,'/private/tmp/the-tree-p24-02-control-r02')
|
||||
from runner.core import Runner,check_schema,GateError,read_json,CONTROL
|
||||
class PolicyTests(unittest.TestCase):
|
||||
def test_nullable_schema(self):
|
||||
schema=read_json(CONTROL/'schemas/task.json')['properties']['max_repair_attempts']
|
||||
for v in (None,0,2,3,900):check_schema(v,schema)
|
||||
for v in ('unlimited',{},[]):
|
||||
with self.assertRaises(GateError):check_schema(v,schema)
|
||||
def test_all_tree_state_and_counts_preserved(self):
|
||||
audit=read_json('/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/execution/unlimited-individual-limits-r01/APPLIED.json')
|
||||
for row in audit['tasks']:
|
||||
r=Runner(row['project']); t=r.task(row['task']);self.assertEqual(t['state'],row['state']);self.assertEqual(t['repairs'],row['repairs']);self.assertIsNone(json.loads(t['contract'])['max_repair_attempts']);self.assertIsNone(r.config['policy']['max_llm_runs']);r.db.close()
|
||||
def test_unlimited_repair_and_live_guard(self):
|
||||
from tests.test_runner import RunnerTests
|
||||
case=RunnerTests('test_repair_limit');case.setUp()
|
||||
try:
|
||||
r=case.r;c=json.loads(r.task('T001')['contract']);c['max_repair_attempts']=None;r.db.execute('UPDATE tasks SET contract=? WHERE id=?',(json.dumps(c),'T001'))
|
||||
r.db.execute('UPDATE tasks SET repairs=999 WHERE id=?',('T001',))
|
||||
r.state('T001','repair_pending');r.repair('T001');self.assertEqual(r.task('T001')['repairs'],1000);self.assertEqual(r.task('T001')['state'],'repair_ready')
|
||||
with self.assertRaises(GateError):r.repair('T001')
|
||||
finally:case.tearDown()
|
||||
if __name__=='__main__':unittest.main()
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-mana-proposal",
|
||||
"repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/mana-proposal",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": null,
|
||||
"claude": null,
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"proposal-consistency": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"-c",
|
||||
"import json,hashlib,re\nfrom pathlib import Path\np=Path(\"docs/plans/original-completion-2026-10-02/execution/mana-proposal\")\nj=json.loads((p/\"proposal.json\").read_text());assert j[\"status\"]==\"proposed_unapproved\" and j[\"applied_to_product\"] is False\nfor k in [\"recommended\",\"alternatives\",\"demand_catalog\",\"ordering\",\"legacy_zero\",\"open_decisions\",\"source_pins\",\"comparisons\"]: assert j[k],k\nr=j[\"recommended\"]\nfor k in [\"initial_amount\",\"storage_capacity\",\"world_tree_generation_per_interval\",\"interval_minutes\"]: assert isinstance(r[k],(int,float)) and not isinstance(r[k],bool) and r[k]>0,k\nassert r[\"initial_amount\"]<=r[\"storage_capacity\"]\nfor f,h in j[\"source_pins\"].items():\n q=Path(f);assert not q.is_absolute() and \"..\" not in q.parts;assert hashlib.sha256(q.read_bytes()).hexdigest()==h,f\nrows=j[\"demand_catalog\"];assert len({x[\"definition_id\"] for x in rows})==len(rows)\nfor x in rows:\n q=Path(x[\"path\"]);t=q.read_text();v=re.search(r\"^maintenance_mana\\s*=\\s*([\\d.]+)\",t,re.M);assert v and float(v.group(1))==x[\"observed_maintenance_mana\"],str(q)\nassert (p/\"PROPOSAL.md\").stat().st_size>1000\nprint(\"proposal structure, current-source pins and observed demand validated; no product acceptance implied\")\n"
|
||||
],
|
||||
"timeout_seconds": 120
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "MP-01",
|
||||
"contract": "{\"id\": \"MP-01\", \"title\": \"承認用マナ契約候補の作成(原88成果の完了ではない)\", \"requirement_ids\": [\"P06-01\"], \"acceptance_ids\": [\"MP-01\"], \"spec_ref\": \"docs/spec/acceptance/P06-mana-proposal.json\", \"base_commit\": \"0bdc4886cf631879792e0c0a873ecf97b98a64ea\", \"worker\": \"codex\", \"allowed_paths\": [\"docs/plans/original-completion-2026-10-02/execution/mana-proposal/**\"], \"depends_on\": [], \"resource_locks\": [\"mana-proposal-draft\"], \"validation_ids\": [\"proposal-consistency\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"f3dfc050ee3c343dfd67d84b10b814479c4f652a51666006e69f4d50d99587e4\"}",
|
||||
"state": "blocked",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/mana-proposal/MP-01-implement",
|
||||
"submitted": null,
|
||||
"candidate": null,
|
||||
"main_base": null,
|
||||
"reason": "worker_blocked: 許可範囲内にproposal.jsonとPROPOSAL.mdを作成。参照SHA・計算の静的整合性を確認しましたが、現仕様ファイルのSHA256が契約指定値と不一致です。製品未反映。正式試験・git書込み・Runner操作は未実施です。",
|
||||
"repairs": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-mana-proposal-r02",
|
||||
"repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/mana-proposal-r02",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": null,
|
||||
"claude": null,
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"proposal-consistency": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"-c",
|
||||
"import json,hashlib,re\nfrom pathlib import Path\np=Path(\"docs/plans/original-completion-2026-10-02/execution/mana-proposal\")\nj=json.loads((p/\"proposal.json\").read_text());assert j[\"status\"]==\"proposed_unapproved\" and j[\"applied_to_product\"] is False\nfor k in [\"recommended\",\"alternatives\",\"demand_catalog\",\"ordering\",\"legacy_zero\",\"open_decisions\",\"source_pins\",\"comparisons\"]: assert j[k],k\nr=j[\"recommended\"]\nfor k in [\"initial_amount\",\"storage_capacity\",\"world_tree_generation_per_interval\",\"interval_minutes\"]: assert isinstance(r[k],(int,float)) and not isinstance(r[k],bool) and r[k]>0,k\nassert r[\"initial_amount\"]<=r[\"storage_capacity\"]\nfor f,h in j[\"source_pins\"].items():\n q=Path(f);assert not q.is_absolute() and \"..\" not in q.parts;assert hashlib.sha256(q.read_bytes()).hexdigest()==h,f\nrows=j[\"demand_catalog\"];assert len({x[\"definition_id\"] for x in rows})==len(rows)\nfor x in rows:\n q=Path(x[\"path\"]);t=q.read_text();v=re.search(r\"^maintenance_mana\\s*=\\s*([\\d.]+)\",t,re.M);assert (float(v.group(1)) if v else 0)==x[\"observed_maintenance_mana\"],str(q)\nassert (p/\"PROPOSAL.md\").stat().st_size>1000\nprint(\"proposal structure, current-source pins and observed demand validated; no product acceptance implied\")\n"
|
||||
],
|
||||
"timeout_seconds": 120
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "MP-01-r02",
|
||||
"contract": "{\"id\": \"MP-01-r02\", \"title\": \"承認用マナ契約候補の作成(原88成果の完了ではない)\", \"requirement_ids\": [\"P06-01\"], \"acceptance_ids\": [\"MP-01-r02\"], \"spec_ref\": \"docs/spec/acceptance/P06-mana-proposal-r02.json\", \"base_commit\": \"5536bc041188d53229d18f33f08b17d4d83b7590\", \"worker\": \"codex\", \"allowed_paths\": [\"docs/plans/original-completion-2026-10-02/execution/mana-proposal/**\"], \"depends_on\": [], \"resource_locks\": [\"mana-proposal-draft\"], \"validation_ids\": [\"proposal-consistency\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"f8cf1753e7ab400130c761570828640c03e0d51073a03f887a9085cbe6be77c6\"}",
|
||||
"state": "completed",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/mana-proposal-r02/MP-01-r02-implement",
|
||||
"submitted": "6b78f8fd71131e61ba695939f4629fec9f51d7a9",
|
||||
"candidate": "65a4fe2bb8e99812a8e8ad7f7a7addf489fe5067",
|
||||
"main_base": "15168ffd47628c5e28f9df20748bfdebe60e228f",
|
||||
"reason": null,
|
||||
"repairs": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-p04-01",
|
||||
"repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": null,
|
||||
"claude": null,
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"p04-acceptance": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"tools/check_p04_order_evidence.py",
|
||||
"--verify-only"
|
||||
],
|
||||
"timeout_seconds": 180
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "P04-01",
|
||||
"contract": "{\"id\": \"P04-01\", \"title\": \"同時発生の更新規約\", \"requirement_ids\": [\"P04-01\"], \"acceptance_ids\": [\"P04-01\"], \"spec_ref\": \"docs/spec/acceptance/P04-01.json\", \"base_commit\": \"deb1bcb2374eb378b840ca345db952bd8572cb6e\", \"worker\": \"codex\", \"allowed_paths\": [\"tools/check_p04_order_evidence.py\", \"docs/plans/original-completion-2026-10-02/execution/p04-01/**\"], \"depends_on\": [], \"resource_locks\": [\"p04-order-evidence-audit\"], \"validation_ids\": [\"p04-acceptance\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"9ec722e7dfb0bee178d291624a026420c08412574e238bba1fde012c7a6f7881\"}",
|
||||
"state": "repair_pending",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
|
||||
"submitted": "a19737b1606ba360a18c8fe0914594f038034924",
|
||||
"candidate": null,
|
||||
"main_base": null,
|
||||
"reason": "test_failed: /Users/korizatou114/Library/Application Support/agent-control/the-tree-p04-01/runs/f2ad55a6709b4c42901027d842358a74-validation.json",
|
||||
"repairs": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-p06-01",
|
||||
"repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p06-01",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": null,
|
||||
"claude": null,
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"p06-contract-evidence": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"docs/plans/original-completion-2026-10-02/execution/p06-01/validate_contract.py",
|
||||
"--repo-root",
|
||||
".",
|
||||
"--unit",
|
||||
"P06-01"
|
||||
],
|
||||
"timeout_seconds": 300
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "P06-01",
|
||||
"contract": "{\"id\": \"P06-01\", \"title\": \"供給と蓄積の契約\", \"requirement_ids\": [\"P06-01\", \"B-2.6\", \"B-9.1\", \"B-10.6\", \"B-10.7\"], \"acceptance_ids\": [\"P06-01\"], \"spec_ref\": \"docs/spec/acceptance/P06-01.json\", \"base_commit\": \"dff514c774b2e0ef6df2dfdce3a2fd974c843706\", \"worker\": \"codex\", \"allowed_paths\": [\"docs/plans/original-completion-2026-10-02/execution/p06-01/**\"], \"depends_on\": [], \"resource_locks\": [\"p06-supply-contract\", \"the-tree-acceptance-ledger\"], \"validation_ids\": [\"p06-contract-evidence\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"ca81f9b65948808b33a0eaeb7406affda6237b5fb54549f90a3962f7dcdd71b8\"}",
|
||||
"state": "blocked",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p06-01/P06-01-implement",
|
||||
"submitted": null,
|
||||
"candidate": null,
|
||||
"main_base": null,
|
||||
"reason": "worker_blocked: 指定範囲にAUDIT.md、matrix.json、validate_contract.pyを作成。正式試験・git書込み・Runner操作は未実施。未達を維持する検証器を準備した。",
|
||||
"repairs": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-p08-02",
|
||||
"repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": "gpt-6.1-sol",
|
||||
"claude": "claude-opus-5-5",
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"p08-evidence": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"tools/check_p08_migration_evidence.py",
|
||||
"--verify-only"
|
||||
],
|
||||
"timeout_seconds": 180
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "P08-02",
|
||||
"contract": "{\"id\": \"P08-02\", \"title\": \"旧配置の安全な変更\", \"requirement_ids\": [\"P08-02\"], \"acceptance_ids\": [\"P08-02\"], \"spec_ref\": \"docs/spec/acceptance/P08-02.json\", \"base_commit\": \"e196578c1a4ad2fdf84642565bd102e524be386f\", \"worker\": \"codex\", \"allowed_paths\": [\"docs/plans/original-completion-2026-10-02/execution/p08-02/**\", \"docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json\", \"tests/s1/test_p08_combined_migration.gd\", \"tests/s1/test_p08_combined_migration.gd.uid\", \"tests/fixtures/p08-02/**\", \"tools/run_p08_mixed_migration.py\", \"tools/check_p08_migration_evidence.py\", \"tools/test_p08_migration_evidence.py\"], \"depends_on\": [], \"resource_locks\": [\"p08-combined-migration\", \"save-placement-final-proof\"], \"validation_ids\": [\"p08-evidence\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"19f02bb7912a4d7354e565186f02366fc1d4dd698468d26142e8204fd14ebfb0\"}",
|
||||
"state": "submitted",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p08-02/P08-02-implement",
|
||||
"submitted": "e59206b9b2578ddb4a1ec023f836d413a7a8fbfb",
|
||||
"candidate": null,
|
||||
"main_base": null,
|
||||
"reason": null,
|
||||
"repairs": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-p13-03",
|
||||
"repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-03",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": null,
|
||||
"claude": null,
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"p13-difference": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"tools/check_p13_content_difference.py",
|
||||
"--verify-only"
|
||||
],
|
||||
"timeout_seconds": 120
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "P13-03",
|
||||
"contract": "{\"id\": \"P13-03\", \"title\": \"内容差異の記録\", \"requirement_ids\": [\"P13-03\"], \"acceptance_ids\": [\"P13-03\"], \"spec_ref\": \"docs/spec/acceptance/P13-03.json\", \"base_commit\": \"e1a1651e15bbc9a0526ef31d0b2786feb20d8cd1\", \"worker\": \"codex\", \"allowed_paths\": [\"tools/check_p13_content_difference.py\", \"docs/plans/original-completion-2026-10-02/execution/p13-03/**\"], \"depends_on\": [], \"resource_locks\": [\"p13-content-difference-record\"], \"validation_ids\": [\"p13-difference\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"e1255835c1227e02bac42eb99b026b0fcbe69c272f9ed0b36199a2daf8d55c53\"}",
|
||||
"state": "blocked",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p13-03/P13-03-implement",
|
||||
"submitted": "7645c55149d3bebf3ed602cf3039b15b28fa376f",
|
||||
"candidate": null,
|
||||
"main_base": null,
|
||||
"reason": "scope_violation: tools/__pycache__/check_p13_content_difference.cpython-314.pyc",
|
||||
"repairs": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-p18-01-model",
|
||||
"repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p18-01-model",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": "gpt-6.1-sol",
|
||||
"claude": "claude-opus-5-5",
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"p18-model": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"tools/run_p18_relationship_tests.py",
|
||||
"--output",
|
||||
"{build_dir}/p18-relationship-evidence"
|
||||
],
|
||||
"timeout_seconds": 1200
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "P18-01-CODE",
|
||||
"contract": "{\"id\": \"P18-01-CODE\", \"title\": \"原本関係モデル・旧値保全・Runtime保存と読取経路\", \"requirement_ids\": [\"P18-01-CODE\"], \"acceptance_ids\": [\"P18-C-1\", \"P18-C-2\", \"P18-C-3\", \"P18-C-4\"], \"spec_ref\": \"docs/spec/acceptance/P18-01-code-r01.json\", \"base_commit\": \"d2a1f80a613e7c77b02b941026bc49c2d85db863\", \"worker\": \"codex\", \"allowed_paths\": [\"scripts/relationship/original_relationship_state.gd\", \"scripts/relationship/original_relationship_state.gd.uid\", \"scripts/relationship/relationship_service.gd\", \"autoload/simulation_runtime.gd\", \"tests/s4/test_original_relationship_model.gd\", \"tests/s4/test_original_relationship_model.gd.uid\", \"tests/s4/test_original_relationship_runtime.gd\", \"tests/s4/test_original_relationship_runtime.gd.uid\", \"tools/run_p18_relationship_tests.py\", \"tools/regression/suite-policy.json\", \"docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json\", \"docs/plans/original-completion-2026-10-02/execution/p18-01-code/**\"], \"depends_on\": [], \"resource_locks\": [\"relationship-model-save\", \"simulation-runtime\", \"native-godot-owner\"], \"validation_ids\": [\"p18-model\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"04e9ae701b6ee1e399542564add695ca7fce54499e52dd2e907b1dbdc23a366d\"}",
|
||||
"state": "repair_pending",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p18-01-model/P18-01-CODE-implement",
|
||||
"submitted": "0084760ee05a97adfcbd783a71161491f3629918",
|
||||
"candidate": null,
|
||||
"main_base": null,
|
||||
"reason": "I compared all four acceptance criteria against the spec, the full diff, the target sources, the identity catalog, the Runner p18-model result (exit 0) and the coordinator's native evidence (7 suites, 843 checks, 308 parse, 9 distinct PIDs, no guard or cleanup errors). I did not edit or run anything. Every change is inside allowed_paths. No existing test was deleted, disabled or weakened. Two new marker rows and two new suite-policy rows were added, pinned to the source hashes.\n\nP18-C-1 is met. The original relationship state is separate from the legacy one, with explicit directional subject/protagonist/rival identities. It requires all fields, rejects non-finite values, and enforces shield_max == affection. An unset record reads as configured:false with null values, distinct from an explicit zero. No production values or coefficients are introduced.\n\nP18-C-2 and P18-C-3 are mostly implemented: v2 nests the full v1 record, restore is atomic, the Runtime command and restore/rebind are real, and the report projection is read-only. But three things are unproven or change legacy behavior:\n(1) The merge-back of legacy aliases is not tested for changes to the aliased axes (affection/dependence).\n(2) Restore now rejects legacy saves it used to accept, through stricter type checks and a new actor-reference check.\n(3) Original records have no lifecycle once the subject leaves staff, which could make saves unloadable.\n\nP18-C-4: native local and affected evidence exists. Integration and the final affected validation have not happened yet, and the backend task correctly does not claim the P18-01 unit complete. Because of the verification gaps above, I am not passing it.",
|
||||
"repairs": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-p22-02-contract",
|
||||
"repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p22-02-contract",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": "gpt-6.1-sol",
|
||||
"claude": "claude-opus-5-5",
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"p22-contract": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"tools/check_p22_asset_contracts.py",
|
||||
"--verify-only",
|
||||
"--accepted-input",
|
||||
"docs/spec/inputs/P22-02-accepted-usage.json",
|
||||
"--require-ready"
|
||||
],
|
||||
"timeout_seconds": 120
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "P22-02",
|
||||
"contract": "{\"id\": \"P22-02\", \"title\": \"素材契約と権利(原条件全体、記録だけの完了代用なし)\", \"requirement_ids\": [\"P22-02\"], \"acceptance_ids\": [\"P22-02\"], \"spec_ref\": \"docs/spec/acceptance/P22-02.json\", \"base_commit\": \"10c62e1fa7b71576598583f434824b59816d4705\", \"worker\": \"codex\", \"allowed_paths\": [\"docs/plans/original-completion-2026-10-02/execution/p22-02/**\", \"tools/check_p22_asset_contracts.py\"], \"depends_on\": [], \"resource_locks\": [\"p22-asset-contracts-and-rights\"], \"validation_ids\": [\"p22-contract\"], \"max_repair_attempts\": 3, \"spec_sha256\": \"f252de3c5cff7ebfa62322ae2f2df09fb80a44bc59eb286b76d4acb4c12ca875\"}",
|
||||
"state": "blocked",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p22-02-contract/P22-02-implement",
|
||||
"submitted": "c6ccc5a6ab4b1670f1ccf813937edf339ca19139",
|
||||
"candidate": null,
|
||||
"main_base": null,
|
||||
"reason": "worker_blocked: ASSET_CONTRACTS.mdとvalidation.jsonのみ同期。保持済みコードは変更なし。python3 -Bで13テスト合格、AST確認成功、ordinary exit 0、require-ready exit 2。出力フィールドとspec両hashを確認。指定patch・計測証拠がworktreeに存在せず参照先もアクセス拒否のため、完全最終パケットの500000未満を確認できない。487283は実測として報告していない。",
|
||||
"repairs": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-p24-02-operations",
|
||||
"repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": null,
|
||||
"claude": null,
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"p24-operations": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"tools/check_p24_operations_evidence.py",
|
||||
"--verify-only"
|
||||
],
|
||||
"timeout_seconds": 180
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "P24-02",
|
||||
"contract": "{\"id\": \"P24-02\", \"title\": \"操作と通知の全受入\", \"requirement_ids\": [\"P24-02\"], \"acceptance_ids\": [\"P24-02\"], \"spec_ref\": \"docs/spec/acceptance/P24-02-code-r01.json\", \"base_commit\": \"1a5abc65163097d4b36a060d68f58c92093eb4e9\", \"worker\": \"agy\", \"allowed_paths\": [\"scenes/main/main.gd\", \"scenes/main/world_preview.gd\", \"scripts/ui/event_log_dialog.gd\", \"scripts/ui/manual_save_slots_dialog.gd\", \"scripts/ui/operation_feedback.gd\", \"scripts/ui/operation_feedback.gd.uid\", \"scripts/ui/operations_camera_controls.gd\", \"scripts/ui/operations_camera_controls.gd.uid\", \"tests/ui/test_operations_notification.gd\", \"tests/ui/test_operations_notification.gd.uid\", \"tests/ui/fixtures/operations_os_observer.gd\", \"tests/ui/fixtures/operations_os_observer.gd.uid\", \"tools/check_p24_operations_evidence.py\", \"tools/run_all_tests.py\", \"tools/regression/suite-policy.json\", \"docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json\", \"docs/plans/original-completion-2026-10-02/execution/p24-02/**\"], \"depends_on\": [], \"resource_locks\": [\"main-operations-notifications\", \"world-preview-click-controls\", \"save-label-presentation\", \"regression-roster-policy\"], \"validation_ids\": [\"p24-operations\"], \"max_repair_attempts\": 3, \"spec_sha256\": \"738268b406e381ccab415b426d4a547b02e7cb2a481cefce65579a1e346834c7\"}",
|
||||
"state": "submitted",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-02-operations/P24-02-implement",
|
||||
"submitted": "9641ed52def2ff8e5b0222449a4a83a1191e1d37",
|
||||
"candidate": null,
|
||||
"main_base": null,
|
||||
"reason": null,
|
||||
"repairs": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-p24-03",
|
||||
"repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": null,
|
||||
"claude": null,
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"p24-acceptance": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"tools/check_p24_selection_evidence.py",
|
||||
"--verify-only"
|
||||
],
|
||||
"timeout_seconds": 180
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "P24-03",
|
||||
"contract": "{\"id\": \"P24-03\", \"title\": \"選択と保存の受入\", \"requirement_ids\": [\"P24-03\"], \"acceptance_ids\": [\"P24-03\"], \"spec_ref\": \"docs/spec/acceptance/P24-03.json\", \"base_commit\": \"9b2ee480a88054eb863eb5cdff855b379201a7c1\", \"worker\": \"agy\", \"allowed_paths\": [\"scenes/main/main.gd\", \"scripts/ui/guest_observation_panel.gd\", \"scripts/ui/staff_management_panel.gd\", \"tests/ui/test_selection_departure.gd\", \"tests/ui/test_selection_departure.gd.uid\", \"tests/ui/fixtures/selection_cross_process.gd\", \"tests/ui/fixtures/selection_cross_process.gd.uid\", \"tools/check_p24_selection_evidence.py\", \"tools/run_all_tests.py\", \"tools/regression/suite-policy.json\", \"docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json\", \"docs/plans/original-completion-2026-10-02/execution/p24-03/**\"], \"depends_on\": [], \"resource_locks\": [\"main-selection-lifecycle\", \"selection-acceptance-profile\", \"regression-roster-policy\"], \"validation_ids\": [\"p24-acceptance\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"4d353ff816d8edbb39671159e4f9fd87c20224cf0c44ea7b8fadc03bf25ae244\"}",
|
||||
"state": "blocked",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03/P24-03-implement",
|
||||
"submitted": null,
|
||||
"candidate": null,
|
||||
"main_base": null,
|
||||
"reason": "runner_interrupted: dead process",
|
||||
"repairs": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-p24-03-code",
|
||||
"repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": null,
|
||||
"claude": null,
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"p24-acceptance": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"tools/check_p24_selection_evidence.py",
|
||||
"--verify-only"
|
||||
],
|
||||
"timeout_seconds": 180
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "P24-03",
|
||||
"contract": "{\"id\": \"P24-03\", \"title\": \"選択と保存の受入\", \"requirement_ids\": [\"P24-03\"], \"acceptance_ids\": [\"P24-03\"], \"spec_ref\": \"docs/spec/acceptance/P24-03-code-r02.json\", \"base_commit\": \"286730f88ce430a1cbe1501d40361188f832d235\", \"worker\": \"codex\", \"allowed_paths\": [\"scenes/main/main.gd\", \"scripts/ui/guest_observation_panel.gd\", \"scripts/ui/staff_management_panel.gd\", \"tests/ui/test_selection_departure.gd\", \"tests/ui/test_selection_departure.gd.uid\", \"tests/ui/fixtures/selection_cross_process.gd\", \"tests/ui/fixtures/selection_cross_process.gd.uid\", \"tools/check_p24_selection_evidence.py\", \"tools/run_all_tests.py\", \"tools/regression/suite-policy.json\", \"docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json\", \"docs/plans/original-completion-2026-10-02/execution/p24-03/**\"], \"depends_on\": [], \"resource_locks\": [\"main-selection-lifecycle\", \"selection-acceptance-profile\", \"regression-roster-policy\"], \"validation_ids\": [\"p24-acceptance\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"dbb885b47a3ee4af3d4180bb97fe746e26a0e08d75af2cd3b5b727ed337bd37c\"}",
|
||||
"state": "completed",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p24-03-code/P24-03-implement",
|
||||
"submitted": "4cefcff849d4dc1211caa5066e24bfae666cc2f4",
|
||||
"candidate": "0a759f13aed03c05fd4a25ab4a2c26eefec94e3c",
|
||||
"main_base": "41a5acbd434990f3253f4990a6479b730d2312ee",
|
||||
"reason": null,
|
||||
"repairs": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-runner-agy-execution",
|
||||
"repo": "/Users/korizatou114/Projects/TheTree-managed-worktrees/runner-p13-recovery-source",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/runner-agy-execution",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": null,
|
||||
"claude": null,
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"runner-unit": {
|
||||
"execution": "trusted_runner_self_test",
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"-m",
|
||||
"unittest",
|
||||
"discover",
|
||||
"-s",
|
||||
"tests",
|
||||
"-p",
|
||||
"test_runner.py",
|
||||
"-v"
|
||||
],
|
||||
"timeout_seconds": 180
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "RP24-02",
|
||||
"contract": "{\"id\": \"RP24-02\", \"title\": \"Antigravityの二重sandboxと回復済み読取エラー判定を修正\", \"requirement_ids\": [\"RP24-02\"], \"acceptance_ids\": [\"RP24-02\"], \"spec_ref\": \"docs/spec/RP24-02.json\", \"base_commit\": \"831364de7eb9abacfafb0266776c949cfce23cd8\", \"worker\": \"codex\", \"allowed_paths\": [\"runner/core.py\", \"tests/test_runner.py\"], \"depends_on\": [], \"resource_locks\": [\"runner-agy-core-isolated\"], \"validation_ids\": [\"runner-unit\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"a636d68b9607efb57772839ebd947250b9faa63562729a59612c8405894a5ed1\"}",
|
||||
"state": "repair_pending",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/runner-agy-execution/RP24-02-implement",
|
||||
"submitted": "09262f37c14397118d51b6b43c35ddbee14fcfa2",
|
||||
"candidate": null,
|
||||
"main_base": null,
|
||||
"reason": "受入項目RP24-02を、仕様・差分・ソース・Runner試験結果と照合しました。結論は差し戻しです。\n二重sandboxの除去は満たしています。外側Seatbeltは維持されており、`--sandbox`だけを外し、`--dangerously-skip-permissions`も追加していません。self-test pinの拡張も満たしています。対象はproject/task/base/spec SHAの完全一致に限られ、RP24-01の互換性と既存の拒否経路も残っています。Runner試験runner-unitは成功(57件)しています。\n一方、中核要件である「実際に観測された回復済みview_file ENOENTを、正当な結果として分類する」が実データで成立していません。coordinatorが実際のstdout(2be30fb9…, sha256 f7e5ad9f…)を再生したところ、提出コードは step_index 0 の `user_input`/DONE を `Antigravity unknown step` として拒否しました。このstdoutは、本タスクの起点になった実際の失敗ログです。\n新規試験は、この`user_input`ステップを含まない合成fixtureで書かれていたため、この欠陥を検出できませんでした。読み取り専用の修正案(許可するstep_typeに`user_input`を追加し、正例と負例の試験を追加)は再生に成功しています。ただし採用も正式検証もされていません。\nこのため、現在の提出コミットでは受入を満たしたと判断できません。",
|
||||
"repairs": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-runner-p13-recovery",
|
||||
"repo": "/Users/korizatou114/Projects/TheTree-managed-worktrees/runner-p13-recovery-source",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/runner-p13-recovery",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": null,
|
||||
"claude": null,
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"runner-unit": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"-m",
|
||||
"unittest",
|
||||
"discover",
|
||||
"-s",
|
||||
"tests",
|
||||
"-p",
|
||||
"test_runner.py",
|
||||
"-v"
|
||||
],
|
||||
"timeout_seconds": 180
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "RP13-01",
|
||||
"contract": "{\"id\": \"RP13-01\", \"title\": \"P13限定の提出復旧と新規文書資料削減\", \"requirement_ids\": [\"RP13-01\"], \"acceptance_ids\": [\"RP13-01\"], \"spec_ref\": \"docs/spec/RP13-01.json\", \"base_commit\": \"c88e2afbea3e1091a4cb048f49bd9891a6bdb869\", \"worker\": \"codex\", \"allowed_paths\": [\"runner/core.py\", \"tests/test_runner.py\"], \"depends_on\": [], \"resource_locks\": [\"runner-p13-code-isolated\"], \"validation_ids\": [\"runner-unit\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"c7ce1e08eefe0bc48afb17dcfec014221102f88072f8d9a3ef9f95b4a2c6664a\"}",
|
||||
"state": "repair_pending",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/runner-p13-recovery/RP13-01-implement",
|
||||
"submitted": "1398aa2de9f4ca0fd57f7db9d640e829b425553b",
|
||||
"candidate": null,
|
||||
"main_base": null,
|
||||
"reason": "test_failed: /Users/korizatou114/Library/Application Support/agent-control/the-tree-runner-p13-recovery/runs/6fc5dc653f934a01ad5d455c54a6143f-validation.json",
|
||||
"repairs": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"config": {
|
||||
"project": "the-tree-runner-p24-review-packet",
|
||||
"repo": "/Users/korizatou114/Projects/TheTree-managed-worktrees/runner-p13-recovery-source",
|
||||
"worktree_root": "/Users/korizatou114/Projects/TheTree-managed-worktrees/runner-p24-review-packet",
|
||||
"policy": {
|
||||
"max_implementers": 1,
|
||||
"max_llm": 2,
|
||||
"max_heavy_tests": 1,
|
||||
"max_llm_runs": 20,
|
||||
"timeout_seconds": 900,
|
||||
"test_timeout_seconds": 300,
|
||||
"max_repair_attempts": 2,
|
||||
"api_fallback": false,
|
||||
"owner_approval_required": true,
|
||||
"allowed_services": [
|
||||
"codex",
|
||||
"claude",
|
||||
"agy"
|
||||
],
|
||||
"ui_mode": "semi-automatic",
|
||||
"claude_max_budget_usd": null,
|
||||
"models": {
|
||||
"codex": null,
|
||||
"claude": null,
|
||||
"agy": null
|
||||
}
|
||||
},
|
||||
"validations": {
|
||||
"runner-unit": {
|
||||
"argv": [
|
||||
"{python}",
|
||||
"-B",
|
||||
"-m",
|
||||
"unittest",
|
||||
"discover",
|
||||
"-s",
|
||||
"tests",
|
||||
"-p",
|
||||
"test_runner.py",
|
||||
"-v"
|
||||
],
|
||||
"timeout_seconds": 180,
|
||||
"execution": "trusted_runner_self_test"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"id": "RP24-01",
|
||||
"contract": "{\"id\": \"RP24-01\", \"title\": \"P24レビュー全文保持とRunner自身の正式試験実行を修正\", \"requirement_ids\": [\"RP24-01\"], \"acceptance_ids\": [\"RP24-01\"], \"spec_ref\": \"docs/spec/RP24-01.json\", \"base_commit\": \"5811e01a17c423b156c5a45c49e2c6e81a4e2153\", \"worker\": \"codex\", \"allowed_paths\": [\"runner/core.py\", \"tests/test_runner.py\"], \"depends_on\": [], \"resource_locks\": [\"runner-p24-code-isolated\"], \"validation_ids\": [\"runner-unit\"], \"max_repair_attempts\": 2, \"spec_sha256\": \"5841d6ac4673336b2ece64efb1b9af3dbf67838bf54b8fa1021f2280e5105854\"}",
|
||||
"state": "completed",
|
||||
"worktree": "/Users/korizatou114/Projects/TheTree-managed-worktrees/runner-p24-review-packet/RP24-01-implement",
|
||||
"submitted": "053f391bf35482c0996292de263f2c39e88d96f0",
|
||||
"candidate": "ba238177d33310fe8b4095998a178464488ed5e4",
|
||||
"main_base": "5811e01a17c423b156c5a45c49e2c6e81a4e2153",
|
||||
"reason": null,
|
||||
"repairs": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user