diff --git a/AINative_OKR_CASAN5/.specify/agentops/alerts.yaml b/AINative_OKR_CASAN5/.specify/agentops/alerts.yaml deleted file mode 120000 index 29570f8..0000000 --- a/AINative_OKR_CASAN5/.specify/agentops/alerts.yaml +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/agentops/alerts.yaml \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/agentops/hallucination-tracking.yaml b/AINative_OKR_CASAN5/.specify/agentops/hallucination-tracking.yaml deleted file mode 120000 index ce38990..0000000 --- a/AINative_OKR_CASAN5/.specify/agentops/hallucination-tracking.yaml +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/agentops/hallucination-tracking.yaml \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/agentops/metrics.yaml b/AINative_OKR_CASAN5/.specify/agentops/metrics.yaml deleted file mode 120000 index 6cbbaee..0000000 --- a/AINative_OKR_CASAN5/.specify/agentops/metrics.yaml +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/agentops/metrics.yaml \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/agentops/rate-limits.yaml b/AINative_OKR_CASAN5/.specify/agentops/rate-limits.yaml deleted file mode 120000 index 2e58f8c..0000000 --- a/AINative_OKR_CASAN5/.specify/agentops/rate-limits.yaml +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/agentops/rate-limits.yaml \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/agentops/tracking.yaml b/AINative_OKR_CASAN5/.specify/agentops/tracking.yaml deleted file mode 120000 index a104615..0000000 --- a/AINative_OKR_CASAN5/.specify/agentops/tracking.yaml +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/agentops/tracking.yaml \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/config b/AINative_OKR_CASAN5/.specify/config deleted file mode 120000 index f35d990..0000000 --- a/AINative_OKR_CASAN5/.specify/config +++ /dev/null @@ -1 +0,0 @@ -../packages/casan-harness/config \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/governance b/AINative_OKR_CASAN5/.specify/governance deleted file mode 120000 index 6c06ea2..0000000 --- a/AINative_OKR_CASAN5/.specify/governance +++ /dev/null @@ -1 +0,0 @@ -../packages/casan-harness/governance \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/init-options.json b/AINative_OKR_CASAN5/.specify/init-options.json deleted file mode 120000 index 10aa740..0000000 --- a/AINative_OKR_CASAN5/.specify/init-options.json +++ /dev/null @@ -1 +0,0 @@ -../packages/casan-harness/init-options.json \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/level5/drift-policy.yaml b/AINative_OKR_CASAN5/.specify/level5/drift-policy.yaml deleted file mode 120000 index ea6df33..0000000 --- a/AINative_OKR_CASAN5/.specify/level5/drift-policy.yaml +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/level5/drift-policy.yaml \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/level5/golden-runs b/AINative_OKR_CASAN5/.specify/level5/golden-runs deleted file mode 120000 index 2ad4673..0000000 --- a/AINative_OKR_CASAN5/.specify/level5/golden-runs +++ /dev/null @@ -1 +0,0 @@ -../../apps/okr/domain/golden-runs \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/level5/harness-package.json b/AINative_OKR_CASAN5/.specify/level5/harness-package.json deleted file mode 120000 index abae93c..0000000 --- a/AINative_OKR_CASAN5/.specify/level5/harness-package.json +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/level5/harness-package.json \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/level5/kpi-schema.yaml b/AINative_OKR_CASAN5/.specify/level5/kpi-schema.yaml deleted file mode 120000 index 235cecc..0000000 --- a/AINative_OKR_CASAN5/.specify/level5/kpi-schema.yaml +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/level5/kpi-schema.yaml \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/level5/model-fallback.yaml b/AINative_OKR_CASAN5/.specify/level5/model-fallback.yaml deleted file mode 120000 index 8099659..0000000 --- a/AINative_OKR_CASAN5/.specify/level5/model-fallback.yaml +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/level5/model-fallback.yaml \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/level5/project-registry.json b/AINative_OKR_CASAN5/.specify/level5/project-registry.json deleted file mode 120000 index 046b280..0000000 --- a/AINative_OKR_CASAN5/.specify/level5/project-registry.json +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/level5/project-registry.json \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/level5/provider-usage-sample.json b/AINative_OKR_CASAN5/.specify/level5/provider-usage-sample.json deleted file mode 120000 index 8d6bf5a..0000000 --- a/AINative_OKR_CASAN5/.specify/level5/provider-usage-sample.json +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/level5/provider-usage-sample.json \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/level5/tool-registry.yaml b/AINative_OKR_CASAN5/.specify/level5/tool-registry.yaml deleted file mode 120000 index fe54e0c..0000000 --- a/AINative_OKR_CASAN5/.specify/level5/tool-registry.yaml +++ /dev/null @@ -1 +0,0 @@ -../../packages/casan-harness/level5/tool-registry.yaml \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/memory b/AINative_OKR_CASAN5/.specify/memory deleted file mode 120000 index ffa11fe..0000000 --- a/AINative_OKR_CASAN5/.specify/memory +++ /dev/null @@ -1 +0,0 @@ -../packages/casan-harness/memory \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/scripts b/AINative_OKR_CASAN5/.specify/scripts deleted file mode 120000 index 18a7c1b..0000000 --- a/AINative_OKR_CASAN5/.specify/scripts +++ /dev/null @@ -1 +0,0 @@ -../packages/casan-harness/scripts \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/security b/AINative_OKR_CASAN5/.specify/security deleted file mode 120000 index 818e266..0000000 --- a/AINative_OKR_CASAN5/.specify/security +++ /dev/null @@ -1 +0,0 @@ -../packages/casan-harness/security \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/templates b/AINative_OKR_CASAN5/.specify/templates deleted file mode 120000 index 11f4224..0000000 --- a/AINative_OKR_CASAN5/.specify/templates +++ /dev/null @@ -1 +0,0 @@ -../packages/casan-harness/templates \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/tests b/AINative_OKR_CASAN5/.specify/tests deleted file mode 120000 index 728a7b7..0000000 --- a/AINative_OKR_CASAN5/.specify/tests +++ /dev/null @@ -1 +0,0 @@ -../packages/casan-harness/tests \ No newline at end of file diff --git a/AINative_OKR_CASAN5/.specify/traceability-map.json b/AINative_OKR_CASAN5/.specify/traceability-map.json deleted file mode 120000 index c2dbfe7..0000000 --- a/AINative_OKR_CASAN5/.specify/traceability-map.json +++ /dev/null @@ -1 +0,0 @@ -../apps/okr/domain/traceability-map.json \ No newline at end of file diff --git a/AINative_OKR_CASAN5/docs/input b/AINative_OKR_CASAN5/docs/input deleted file mode 120000 index 060f330..0000000 --- a/AINative_OKR_CASAN5/docs/input +++ /dev/null @@ -1 +0,0 @@ -../apps/okr/domain/input \ No newline at end of file diff --git a/AINative_OKR_CASAN5/packages/casan-harness/agentops/hallucination-tracking.yaml b/AINative_OKR_CASAN5/packages/casan-harness/agentops/hallucination-tracking.yaml index 684dad9..154cd2c 100644 --- a/AINative_OKR_CASAN5/packages/casan-harness/agentops/hallucination-tracking.yaml +++ b/AINative_OKR_CASAN5/packages/casan-harness/agentops/hallucination-tracking.yaml @@ -10,7 +10,7 @@ tracking: steps_with_tracking: - step: step-1-srs reference_docs: - - docs/input/okr-requirement.md + - apps/okr/domain/input/okr-requirement.md signals: - ungrounded_feature_claim - invented_requirement diff --git a/AINative_OKR_CASAN5/packages/casan-harness/config/loop-policy.schema.json b/AINative_OKR_CASAN5/packages/casan-harness/config/loop-policy.schema.json index 9dcd0f4..a2e5e90 100644 --- a/AINative_OKR_CASAN5/packages/casan-harness/config/loop-policy.schema.json +++ b/AINative_OKR_CASAN5/packages/casan-harness/config/loop-policy.schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://casan.fpt/loop-policy.schema.json", "title": "CASAN Loop Budget Governor policy", - "description": "Schema for .specify/config/loop-policy.yaml (Plan-17 Track 1). Budgets are non-negative numbers; on_exceed is halt|escalate. Absence of a rule means the strictest built-in ceiling applies (deny-by-default).", + "description": "Schema for packages/casan-harness/config/loop-policy.yaml (Plan-17 Track 1). Budgets are non-negative numbers; on_exceed is halt|escalate. Absence of a rule means the strictest built-in ceiling applies (deny-by-default).", "type": "object", "required": ["version", "profiles"], "additionalProperties": false, diff --git a/AINative_OKR_CASAN5/packages/casan-harness/governance/risk-registry.yaml b/AINative_OKR_CASAN5/packages/casan-harness/governance/risk-registry.yaml index 3697314..90831bf 100644 --- a/AINative_OKR_CASAN5/packages/casan-harness/governance/risk-registry.yaml +++ b/AINative_OKR_CASAN5/packages/casan-harness/governance/risk-registry.yaml @@ -83,7 +83,7 @@ reporting: enabled: true frequency: daily - output: ".specify/governance/risk-report.md" + output: "packages/casan-harness/governance/risk-report.md" review: @@ -93,6 +93,6 @@ review: auto_update: enabled: true trigger: new_action_type_detected - script: .specify/scripts/powershell/update-risk-registry.ps1 + script: packages/casan-harness/scripts/powershell/update-risk-registry.ps1 default_risk_for_unknown_action: high note: "Unknown actions default to high-risk (fail-secure). Run update-risk-registry.ps1 to register." \ No newline at end of file diff --git a/AINative_OKR_CASAN5/packages/casan-harness/level5/drift-policy.yaml b/AINative_OKR_CASAN5/packages/casan-harness/level5/drift-policy.yaml index b978f76..9aeb034 100644 --- a/AINative_OKR_CASAN5/packages/casan-harness/level5/drift-policy.yaml +++ b/AINative_OKR_CASAN5/packages/casan-harness/level5/drift-policy.yaml @@ -1,7 +1,7 @@ version: 1.0 description: CASAN Level 5 drift detection policy -golden_dir: .specify/level5/golden-runs +golden_dir: apps/okr/domain/golden-runs evidence_dir: docs/output/casan/level5-evidence thresholds: diff --git a/AINative_OKR_CASAN5/packages/casan-harness/level5/harness-package.json b/AINative_OKR_CASAN5/packages/casan-harness/level5/harness-package.json index 72ef9df..d650062 100644 --- a/AINative_OKR_CASAN5/packages/casan-harness/level5/harness-package.json +++ b/AINative_OKR_CASAN5/packages/casan-harness/level5/harness-package.json @@ -17,8 +17,8 @@ "python": ">=3.9" }, "entrypoints": { - "wrapper": ".specify/scripts/bash/casan-harness.sh", - "test": ".specify/tests/run-casan4-harness-tests.sh", + "wrapper": "packages/casan-harness/scripts/bash/casan-harness.sh", + "test": "packages/casan-harness/tests/run-casan4-harness-tests.sh", "dashboard": "docs/output/casan/agentops-dashboard.html" } } diff --git a/AINative_OKR_CASAN5/packages/casan-harness/level5/tool-registry.yaml b/AINative_OKR_CASAN5/packages/casan-harness/level5/tool-registry.yaml index def84ae..7a9d8de 100644 --- a/AINative_OKR_CASAN5/packages/casan-harness/level5/tool-registry.yaml +++ b/AINative_OKR_CASAN5/packages/casan-harness/level5/tool-registry.yaml @@ -18,7 +18,7 @@ tools: allowed_agents: "boss,implement-agent" rollback: strategy: git_patch_reverse - script: .specify/scripts/bash/rollback-manager.sh + script: packages/casan-harness/scripts/bash/rollback-manager.sh - id: migration owner: database-owner @@ -29,7 +29,7 @@ tools: allowed_agents: "boss,implement-agent" rollback: strategy: migration_down_or_restore - script: .specify/scripts/bash/rollback-manager.sh + script: packages/casan-harness/scripts/bash/rollback-manager.sh - id: deploy owner: release-manager @@ -41,7 +41,7 @@ tools: allowed_agents: "boss,release-manager" rollback: strategy: previous_release - script: .specify/scripts/bash/rollback-manager.sh + script: packages/casan-harness/scripts/bash/rollback-manager.sh - id: external_api owner: platform-team @@ -52,7 +52,7 @@ tools: allowed_agents: "boss,implement-agent" rollback: strategy: compensating_request - script: .specify/scripts/bash/rollback-manager.sh + script: packages/casan-harness/scripts/bash/rollback-manager.sh - id: db_write owner: database-owner @@ -63,7 +63,7 @@ tools: allowed_agents: "boss,implement-agent" rollback: strategy: restore_from_backup - script: .specify/scripts/powershell/rollback-manager.ps1 + script: packages/casan-harness/scripts/powershell/rollback-manager.ps1 - id: write_file owner: engineering @@ -74,7 +74,7 @@ tools: allowed_agents: "boss,implement-agent,design-agent" rollback: strategy: delete_or_restore - script: .specify/scripts/bash/rollback-manager.sh + script: packages/casan-harness/scripts/bash/rollback-manager.sh level5_gate: required_fields: diff --git a/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/evidence-pack-build.py b/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/evidence-pack-build.py index 226bff0..e68c775 100755 --- a/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/evidence-pack-build.py +++ b/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/evidence-pack-build.py @@ -21,6 +21,9 @@ import os import subprocess import sys +# Plan-01: this script lives at /scripts/bash/; the harness root is two levels up. +_HARNESS = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..")) + def read_jsonl(path): rows = [] @@ -73,11 +76,11 @@ def main(): # H3 eval scorecard (best effort — reference known evidence) reports["h3-eval-scorecard.json"] = { "harness": "H3-eval", "run_id": run_id, - "judge_gate_tests": os.path.exists(os.path.join(root, ".specify/tests/phase3-judge-gate-tests.sh")), + "judge_gate_tests": os.path.exists(os.path.join(_HARNESS, "tests/phase3-judge-gate-tests.sh")), "note": "judge-gate fail-before/fix cycle proven by phase3-judge-gate-tests.sh", } traceability_out = os.path.join(pack_dir, "traceability-matrix.json") - traceability_script = os.path.join(root, ".specify/scripts/bash/traceability-matrix.py") + traceability_script = os.path.join(os.path.dirname(os.path.abspath(__file__)), "traceability-matrix.py") traceability_rc = 1 if os.path.isfile(traceability_script): traceability_rc = subprocess.run( diff --git a/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/loop_common.py b/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/loop_common.py index bc16b12..5da9c92 100644 --- a/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/loop_common.py +++ b/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/loop_common.py @@ -136,7 +136,9 @@ def policy_path() -> str: explicit = os.environ.get("CASAN_LOOP_POLICY_FILE") if explicit: return explicit - return os.path.join(project_root(), ".specify/config/loop-policy.yaml") + # Plan-01: loop-policy.yaml is harness config, not app state — resolve it inside the + # package (this file lives at /scripts/bash/), independent of any .specify facade. + return os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "config", "loop-policy.yaml")) def load_policy(): diff --git a/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/pii-mask.py b/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/pii-mask.py index 11dfc73..39e471f 100755 --- a/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/pii-mask.py +++ b/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/pii-mask.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""CASAN H4 PII masker driven by .specify/security/pii-rules.yaml. +"""CASAN H4 PII masker driven by packages/casan-harness/security/pii-rules.yaml. Reads content on stdin, applies every `action: mask` rule from the rules file, and writes the masked content to stdout. Type-specific replacement diff --git a/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/secrets-scan.sh b/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/secrets-scan.sh index 3e428e3..ee1f3d1 100755 --- a/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/secrets-scan.sh +++ b/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/secrets-scan.sh @@ -39,14 +39,15 @@ fi # Exclude known test-fixture files and evidence directories that intentionally # contain the pattern as test data. FIXTURE_EXCLUDES=( - ".specify/tests/" + "packages/casan-harness/tests/" "docs/output/casan/evidence/" - ".specify/security/" - ".specify/scripts/bash/security-check.sh" - ".specify/scripts/bash/verify-audit-chain.sh" - ".specify/scripts/bash/verify-tool-audit.sh" - ".specify/scripts/bash/tool-audit-lib.sh" - ".specify/scripts/bash/governance-check.sh" + "packages/casan-harness/security/" + "apps/okr/domain/corpus/" + "packages/casan-harness/scripts/bash/security-check.sh" + "packages/casan-harness/scripts/bash/verify-audit-chain.sh" + "packages/casan-harness/scripts/bash/verify-tool-audit.sh" + "packages/casan-harness/scripts/bash/tool-audit-lib.sh" + "packages/casan-harness/scripts/bash/governance-check.sh" ) build_exclude_args() { for ex in "${FIXTURE_EXCLUDES[@]}"; do printf -- "--exclude-dir=%s " "$ex"; done diff --git a/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/traceability-matrix.py b/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/traceability-matrix.py index e3d17b6..adfcc77 100755 --- a/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/traceability-matrix.py +++ b/AINative_OKR_CASAN5/packages/casan-harness/scripts/bash/traceability-matrix.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """CASAN Plan-10 traceability matrix generator/gate. -Parses FR-* requirements from docs/input/okr-requirement.md and checks each +Parses FR-* requirements from apps/okr/domain/input/okr-requirement.md and checks each requirement has at least one existing code file and one existing test file. """ import argparse diff --git a/AINative_OKR_CASAN5/packages/casan-harness/tests/phase10-traceability-tests.sh b/AINative_OKR_CASAN5/packages/casan-harness/tests/phase10-traceability-tests.sh index 0f9c393..3ac8136 100755 --- a/AINative_OKR_CASAN5/packages/casan-harness/tests/phase10-traceability-tests.sh +++ b/AINative_OKR_CASAN5/packages/casan-harness/tests/phase10-traceability-tests.sh @@ -17,7 +17,7 @@ PASS=0; FAIL=0 pass() { echo "PASS: $1"; PASS=$((PASS + 1)); } fail() { echo "FAIL: $1"; FAIL=$((FAIL + 1)); } -REQ="$PROJECT_ROOT/docs/input/okr-requirement.md" +REQ="$CASAN_DOMAIN_ROOT/input/okr-requirement.md" MAP="$CASAN_DOMAIN_ROOT/traceability-map.json" OUT="$WORK/traceability-matrix.json" diff --git a/AINative_OKR_CASAN5/scripts/casan-log.mjs b/AINative_OKR_CASAN5/scripts/casan-log.mjs index faee488..6e414ae 100644 --- a/AINative_OKR_CASAN5/scripts/casan-log.mjs +++ b/AINative_OKR_CASAN5/scripts/casan-log.mjs @@ -1,5 +1,5 @@ // CASAN shared log helper (Node side). -// Taxonomy (shared with .specify/scripts/bash/casan-log.sh): +// Taxonomy (shared with packages/casan-harness/scripts/bash/casan-log.sh): // error(0) < warn(1) < info(2) < debug(3) < trace(4), default info. // All lines go to stderr so stdout stays reserved for existing outputs. diff --git a/AINative_OKR_CASAN5/scripts/casan-step.mjs b/AINative_OKR_CASAN5/scripts/casan-step.mjs index 65af4e6..9eadd32 100644 --- a/AINative_OKR_CASAN5/scripts/casan-step.mjs +++ b/AINative_OKR_CASAN5/scripts/casan-step.mjs @@ -252,7 +252,7 @@ switch (step) { extraInstructions: 'Create an SRS with purpose, scope, functional requirements, non-functional requirements, and traceable FR IDs.', }); write(srsPath, generated.content); - report(`docs/output/output_logs/${featureId}/reports/01-srs-report.md`, '# STEP 1: SRS Generation Report', `Generated ${srsPath} from docs/input/okr-requirement.md. source=${generated.source} note=${generated.note}.`, 'APPROVED', [srsPath]); + report(`docs/output/output_logs/${featureId}/reports/01-srs-report.md`, '# STEP 1: SRS Generation Report', `Generated ${srsPath} from apps/okr/domain/input/okr-requirement.md. source=${generated.source} note=${generated.note}.`, 'APPROVED', [srsPath]); break; } case '02-bd': { diff --git a/AINative_OKR_CASAN5/scripts/run-casan-pipeline.mjs b/AINative_OKR_CASAN5/scripts/run-casan-pipeline.mjs index c80bb9d..9fae6ff 100644 --- a/AINative_OKR_CASAN5/scripts/run-casan-pipeline.mjs +++ b/AINative_OKR_CASAN5/scripts/run-casan-pipeline.mjs @@ -10,10 +10,15 @@ const dryRun = process.argv.includes('--dry-run'); const featureId = '001-okr-web-app'; const root = process.cwd(); -// Plan-01: harness relocated to packages/casan-harness/; fall back to the .specify facade. -const HARNESS = existsSync(join(root, 'packages/casan-harness/scripts/bash/casan-harness.sh')) - ? 'packages/casan-harness/scripts/bash/casan-harness.sh' - : '.specify/scripts/bash/casan-harness.sh'; +// Plan-01: harness relocated to packages/casan-harness/, domain to apps/okr/domain/; +// fall back to the pre-move paths so this runner works from either layout. +const HARNESS_BASH = existsSync(join(root, 'packages/casan-harness/scripts/bash')) + ? 'packages/casan-harness/scripts/bash' + : '.specify/scripts/bash'; +const HARNESS = `${HARNESS_BASH}/casan-harness.sh`; +const GOLDEN_PLAN = existsSync(join(root, 'apps/okr/domain/golden-runs/okr-plan.golden.txt')) + ? 'apps/okr/domain/golden-runs/okr-plan.golden.txt' + : '.specify/level5/golden-runs/okr-plan.golden.txt'; const logDir = `docs/output/output_logs/${featureId}`; const casanDir = `${logDir}/casan`; const reportsDir = `${logDir}/reports`; @@ -340,7 +345,7 @@ runHarness({ id: '07-plan-attempt-2', agent: 'speckit.plan', step: '05-plan', at const fallbackOut = `${casanDir}/model-fallback-output.txt`; log('debug', 'boss', `model-fallback invoked (real primary failure) → ${fallbackOut}`); execFileSync( - '.specify/scripts/bash/model-fallback.sh', + `/model-fallback.sh`, [ fallbackOut, // Real primary failure: reading a nonexistent path exits non-zero (not a @@ -361,8 +366,8 @@ appendBoss(`Model fallback invoked; output ${fallbackOut}`); const driftCandidate = `${casanDir}/drift-plan-candidate.txt`; copyFileSync(fallbackOut, driftCandidate); log('debug', 'boss', 'drift-detect: fallback output vs golden baseline'); -execFileSync('.specify/scripts/bash/drift-detect.sh', [ - '.specify/level5/golden-runs/okr-plan.golden.txt', +execFileSync(`/drift-detect.sh`, [ + GOLDEN_PLAN, driftCandidate, '.specify/logs/level5/okr-plan-drift-report.json', ], { cwd: root, stdio: 'inherit' }); @@ -390,7 +395,7 @@ copyFileSync(rollbackTarget, rollbackBackup); writeFileSync(`${rollbackDir}/rollback-before.txt`, readFileSync(rollbackTarget, 'utf8'), 'utf8'); writeFileSync(rollbackTarget, 'changed content that must be undone\n', 'utf8'); writeFileSync(`${rollbackDir}/rollback-changed.txt`, readFileSync(rollbackTarget, 'utf8'), 'utf8'); -const record = execFileSync('.specify/scripts/bash/rollback-manager.sh', [ +const record = execFileSync(`/rollback-manager.sh`, [ 'record', 'restore rollback target evidence file', `cp ${rollbackBackup} ${rollbackTarget}`, @@ -400,7 +405,7 @@ const tx = record.match(/transaction_id=([^\s]+)/)?.[1]; if (!tx) { throw new Error('rollback transaction id not found'); } -const execute = execFileSync('.specify/scripts/bash/rollback-manager.sh', ['execute', tx], { +const execute = execFileSync(`/rollback-manager.sh`, ['execute', tx], { cwd: root, encoding: 'utf8', });