jfl 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +30 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/ide.d.ts +2 -1
- package/dist/commands/ide.d.ts.map +1 -1
- package/dist/commands/ide.js +60 -1
- package/dist/commands/ide.js.map +1 -1
- package/dist/commands/init-from-service.d.ts +15 -0
- package/dist/commands/init-from-service.d.ts.map +1 -0
- package/dist/commands/init-from-service.js +541 -0
- package/dist/commands/init-from-service.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +32 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/kanban.d.ts.map +1 -1
- package/dist/commands/kanban.js +13 -4
- package/dist/commands/kanban.js.map +1 -1
- package/dist/commands/linear.d.ts +41 -0
- package/dist/commands/linear.d.ts.map +1 -0
- package/dist/commands/linear.js +715 -0
- package/dist/commands/linear.js.map +1 -0
- package/dist/commands/peter.d.ts.map +1 -1
- package/dist/commands/peter.js +232 -25
- package/dist/commands/peter.js.map +1 -1
- package/dist/commands/services.d.ts.map +1 -1
- package/dist/commands/services.js +146 -0
- package/dist/commands/services.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +173 -13
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/telemetry-monitor.d.ts +11 -0
- package/dist/commands/telemetry-monitor.d.ts.map +1 -0
- package/dist/commands/telemetry-monitor.js +224 -0
- package/dist/commands/telemetry-monitor.js.map +1 -0
- package/dist/commands/telemetry-test.d.ts +11 -0
- package/dist/commands/telemetry-test.d.ts.map +1 -0
- package/dist/commands/telemetry-test.js +67 -0
- package/dist/commands/telemetry-test.js.map +1 -0
- package/dist/commands/tenet-agents.d.ts +13 -0
- package/dist/commands/tenet-agents.d.ts.map +1 -0
- package/dist/commands/tenet-agents.js +191 -0
- package/dist/commands/tenet-agents.js.map +1 -0
- package/dist/commands/tenet-setup.d.ts +19 -0
- package/dist/commands/tenet-setup.d.ts.map +1 -0
- package/dist/commands/tenet-setup.js +131 -0
- package/dist/commands/tenet-setup.js.map +1 -0
- package/dist/commands/train.d.ts +18 -0
- package/dist/commands/train.d.ts.map +1 -1
- package/dist/commands/train.js +182 -0
- package/dist/commands/train.js.map +1 -1
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +24 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.js +159 -10
- package/dist/index.js.map +1 -1
- package/dist/lib/advanced-setup.d.ts +78 -0
- package/dist/lib/advanced-setup.d.ts.map +1 -0
- package/dist/lib/advanced-setup.js +433 -0
- package/dist/lib/advanced-setup.js.map +1 -0
- package/dist/lib/agent-config.d.ts +33 -0
- package/dist/lib/agent-config.d.ts.map +1 -1
- package/dist/lib/agent-config.js +26 -0
- package/dist/lib/agent-config.js.map +1 -1
- package/dist/lib/counterfactual-training-bridge.d.ts +114 -0
- package/dist/lib/counterfactual-training-bridge.d.ts.map +1 -0
- package/dist/lib/counterfactual-training-bridge.js +322 -0
- package/dist/lib/counterfactual-training-bridge.js.map +1 -0
- package/dist/lib/discovery-agent.d.ts +48 -0
- package/dist/lib/discovery-agent.d.ts.map +1 -0
- package/dist/lib/discovery-agent.js +111 -0
- package/dist/lib/discovery-agent.js.map +1 -0
- package/dist/lib/flow-engine.d.ts.map +1 -1
- package/dist/lib/flow-engine.js +46 -8
- package/dist/lib/flow-engine.js.map +1 -1
- package/dist/lib/gtm-generator.d.ts +29 -0
- package/dist/lib/gtm-generator.d.ts.map +1 -0
- package/dist/lib/gtm-generator.js +252 -0
- package/dist/lib/gtm-generator.js.map +1 -0
- package/dist/lib/hub-health.d.ts +40 -0
- package/dist/lib/hub-health.d.ts.map +1 -0
- package/dist/lib/hub-health.js +89 -0
- package/dist/lib/hub-health.js.map +1 -0
- package/dist/lib/invariant-monitor.d.ts +6 -2
- package/dist/lib/invariant-monitor.d.ts.map +1 -1
- package/dist/lib/invariant-monitor.js +89 -2
- package/dist/lib/invariant-monitor.js.map +1 -1
- package/dist/lib/journal-analyzer.d.ts +71 -0
- package/dist/lib/journal-analyzer.d.ts.map +1 -0
- package/dist/lib/journal-analyzer.js +306 -0
- package/dist/lib/journal-analyzer.js.map +1 -0
- package/dist/lib/linear-client.d.ts +73 -0
- package/dist/lib/linear-client.d.ts.map +1 -0
- package/dist/lib/linear-client.js +112 -0
- package/dist/lib/linear-client.js.map +1 -0
- package/dist/lib/linear-id-map.d.ts +20 -0
- package/dist/lib/linear-id-map.d.ts.map +1 -0
- package/dist/lib/linear-id-map.js +57 -0
- package/dist/lib/linear-id-map.js.map +1 -0
- package/dist/lib/linear-kanban.d.ts +66 -0
- package/dist/lib/linear-kanban.d.ts.map +1 -0
- package/dist/lib/linear-kanban.js +175 -0
- package/dist/lib/linear-kanban.js.map +1 -0
- package/dist/lib/onboarding.d.ts +40 -0
- package/dist/lib/onboarding.d.ts.map +1 -0
- package/dist/lib/onboarding.js +213 -0
- package/dist/lib/onboarding.js.map +1 -0
- package/dist/lib/physical-world-model.d.ts +50 -0
- package/dist/lib/physical-world-model.d.ts.map +1 -0
- package/dist/lib/physical-world-model.js +251 -0
- package/dist/lib/physical-world-model.js.map +1 -0
- package/dist/lib/planning-loop.d.ts +157 -0
- package/dist/lib/planning-loop.d.ts.map +1 -0
- package/dist/lib/planning-loop.js +537 -0
- package/dist/lib/planning-loop.js.map +1 -0
- package/dist/lib/policy-head.d.ts +13 -0
- package/dist/lib/policy-head.d.ts.map +1 -1
- package/dist/lib/policy-head.js +168 -2
- package/dist/lib/policy-head.js.map +1 -1
- package/dist/lib/resource-optimizer-middleware.d.ts +39 -0
- package/dist/lib/resource-optimizer-middleware.d.ts.map +1 -0
- package/dist/lib/resource-optimizer-middleware.js +222 -0
- package/dist/lib/resource-optimizer-middleware.js.map +1 -0
- package/dist/lib/resource-optimizer.d.ts +71 -0
- package/dist/lib/resource-optimizer.d.ts.map +1 -0
- package/dist/lib/resource-optimizer.js +228 -0
- package/dist/lib/resource-optimizer.js.map +1 -0
- package/dist/lib/rl-manager.d.ts +74 -0
- package/dist/lib/rl-manager.d.ts.map +1 -0
- package/dist/lib/rl-manager.js +244 -0
- package/dist/lib/rl-manager.js.map +1 -0
- package/dist/lib/service-analyzer.d.ts +76 -0
- package/dist/lib/service-analyzer.d.ts.map +1 -0
- package/dist/lib/service-analyzer.js +704 -0
- package/dist/lib/service-analyzer.js.map +1 -0
- package/dist/lib/service-gtm.js +2 -2
- package/dist/lib/service-gtm.js.map +1 -1
- package/dist/lib/service-questionnaire.d.ts +11 -0
- package/dist/lib/service-questionnaire.d.ts.map +1 -0
- package/dist/lib/service-questionnaire.js +89 -0
- package/dist/lib/service-questionnaire.js.map +1 -0
- package/dist/lib/setup/agent-generator.d.ts +2 -0
- package/dist/lib/setup/agent-generator.d.ts.map +1 -1
- package/dist/lib/setup/agent-generator.js +128 -4
- package/dist/lib/setup/agent-generator.js.map +1 -1
- package/dist/lib/setup/flow-generator.d.ts +10 -0
- package/dist/lib/setup/flow-generator.d.ts.map +1 -0
- package/dist/lib/setup/flow-generator.js +113 -0
- package/dist/lib/setup/flow-generator.js.map +1 -0
- package/dist/lib/setup/invariant-bridge.d.ts +91 -0
- package/dist/lib/setup/invariant-bridge.d.ts.map +1 -0
- package/dist/lib/setup/invariant-bridge.js +384 -0
- package/dist/lib/setup/invariant-bridge.js.map +1 -0
- package/dist/lib/setup/spec-generator.d.ts +41 -5
- package/dist/lib/setup/spec-generator.d.ts.map +1 -1
- package/dist/lib/setup/spec-generator.js +503 -29
- package/dist/lib/setup/spec-generator.js.map +1 -1
- package/dist/lib/stratus-client.js +1 -1
- package/dist/lib/stratus-client.js.map +1 -1
- package/dist/lib/surface-agent.d.ts +78 -0
- package/dist/lib/surface-agent.d.ts.map +1 -0
- package/dist/lib/surface-agent.js +105 -0
- package/dist/lib/surface-agent.js.map +1 -0
- package/dist/lib/surface-coordination-example.d.ts +30 -0
- package/dist/lib/surface-coordination-example.d.ts.map +1 -0
- package/dist/lib/surface-coordination-example.js +164 -0
- package/dist/lib/surface-coordination-example.js.map +1 -0
- package/dist/lib/telemetry/physical-world-collector.d.ts +15 -0
- package/dist/lib/telemetry/physical-world-collector.d.ts.map +1 -0
- package/dist/lib/telemetry/physical-world-collector.js +177 -0
- package/dist/lib/telemetry/physical-world-collector.js.map +1 -0
- package/dist/lib/telemetry/training-bridge.d.ts +51 -0
- package/dist/lib/telemetry/training-bridge.d.ts.map +1 -0
- package/dist/lib/telemetry/training-bridge.js +185 -0
- package/dist/lib/telemetry/training-bridge.js.map +1 -0
- package/dist/lib/telemetry.d.ts +2 -1
- package/dist/lib/telemetry.d.ts.map +1 -1
- package/dist/lib/telemetry.js +23 -2
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/tenet-board-agent.d.ts +52 -0
- package/dist/lib/tenet-board-agent.d.ts.map +1 -0
- package/dist/lib/tenet-board-agent.js +226 -0
- package/dist/lib/tenet-board-agent.js.map +1 -0
- package/dist/lib/tenet-ide-agent.d.ts +40 -0
- package/dist/lib/tenet-ide-agent.d.ts.map +1 -0
- package/dist/lib/tenet-ide-agent.js +199 -0
- package/dist/lib/tenet-ide-agent.js.map +1 -0
- package/dist/lib/workspace/data-pipeline.d.ts.map +1 -1
- package/dist/lib/workspace/data-pipeline.js +27 -5
- package/dist/lib/workspace/data-pipeline.js.map +1 -1
- package/dist/lib/workspace/sidebar-runner.d.ts +13 -0
- package/dist/lib/workspace/sidebar-runner.d.ts.map +1 -0
- package/dist/lib/workspace/sidebar-runner.js +419 -0
- package/dist/lib/workspace/sidebar-runner.js.map +1 -0
- package/dist/lib/workspace/surface-registry.d.ts.map +1 -1
- package/dist/lib/workspace/surface-registry.js +4 -1
- package/dist/lib/workspace/surface-registry.js.map +1 -1
- package/dist/lib/workspace/surfaces/agent-overview.d.ts +3 -3
- package/dist/lib/workspace/surfaces/agent-overview.d.ts.map +1 -1
- package/dist/lib/workspace/surfaces/agent-overview.js +3 -3
- package/dist/lib/workspace/surfaces/agent-overview.js.map +1 -1
- package/dist/lib/workspace/surfaces/index.d.ts +3 -0
- package/dist/lib/workspace/surfaces/index.d.ts.map +1 -1
- package/dist/lib/workspace/surfaces/index.js +3 -0
- package/dist/lib/workspace/surfaces/index.js.map +1 -1
- package/dist/lib/workspace/surfaces/kanban.d.ts +15 -0
- package/dist/lib/workspace/surfaces/kanban.d.ts.map +1 -0
- package/dist/lib/workspace/surfaces/kanban.js +43 -0
- package/dist/lib/workspace/surfaces/kanban.js.map +1 -0
- package/dist/lib/workspace/surfaces/physical-world.d.ts +15 -0
- package/dist/lib/workspace/surfaces/physical-world.d.ts.map +1 -0
- package/dist/lib/workspace/surfaces/physical-world.js +37 -0
- package/dist/lib/workspace/surfaces/physical-world.js.map +1 -0
- package/dist/lib/workspace/surfaces/sidebar.d.ts +22 -0
- package/dist/lib/workspace/surfaces/sidebar.d.ts.map +1 -0
- package/dist/lib/workspace/surfaces/sidebar.js +90 -0
- package/dist/lib/workspace/surfaces/sidebar.js.map +1 -0
- package/dist/types/flows.d.ts +2 -1
- package/dist/types/flows.d.ts.map +1 -1
- package/dist/types/physical-world-model.d.ts +65 -0
- package/dist/types/physical-world-model.d.ts.map +1 -0
- package/dist/types/physical-world-model.js +43 -0
- package/dist/types/physical-world-model.js.map +1 -0
- package/dist/types/telemetry.d.ts +37 -0
- package/dist/types/telemetry.d.ts.map +1 -1
- package/dist/types/world-model.d.ts.map +1 -1
- package/dist/types/world-model.js +14 -7
- package/dist/types/world-model.js.map +1 -1
- package/dist/utils/context-hub-port.d.ts.map +1 -1
- package/dist/utils/context-hub-port.js +6 -1
- package/dist/utils/context-hub-port.js.map +1 -1
- package/package.json +3 -2
- package/packages/pi/extensions/index.ts +34 -6
- package/scripts/telemetry-dashboard.sh +44 -0
- package/scripts/test-planning-loop-e2e.ts +181 -0
- package/scripts/test-server-inference.ts +49 -0
- package/scripts/test-state-sensitivity.ts +32 -0
- package/scripts/train/v2/benchmark.py +661 -0
- package/scripts/train/v2/generate_balanced.py +439 -0
- package/scripts/train/v2/generate_hard_negatives.py +219 -0
- package/scripts/train/v2/infer.py +149 -36
- package/scripts/train/v2/infer_server.py +224 -0
- package/scripts/train/v2/online_train.py +576 -0
- package/scripts/train/v2/precompute.py +24 -6
- package/template/CLAUDE.md +74 -132
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @purpose Generate self-driving flow definitions for new projects
|
|
3
|
+
*
|
|
4
|
+
* Creates the autonomous improvement loop:
|
|
5
|
+
* Issue filed → PP picks up → PR → eval → auto-merge → issue closed → retrain
|
|
6
|
+
*
|
|
7
|
+
* Flows are YAML-safe (no embedded Python/complex bash — uses script files).
|
|
8
|
+
*/
|
|
9
|
+
export function generateSelfDrivingFlows() {
|
|
10
|
+
return `# Self-driving loop flows
|
|
11
|
+
# Auto-generated by: jfl setup
|
|
12
|
+
# These flows close the autonomous improvement loop:
|
|
13
|
+
# Issue filed → PP picks up → PR → eval → auto-merge → issue closed
|
|
14
|
+
#
|
|
15
|
+
# Requires: Context Hub running (jfl context-hub start)
|
|
16
|
+
# For auto-merge: set GitHub secrets JFL_HUB_URL + JFL_HUB_TOKEN
|
|
17
|
+
|
|
18
|
+
flows:
|
|
19
|
+
# ── Issue Lifecycle ────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
- name: pick-up-backlog-issues
|
|
22
|
+
description: "PP picks up highest-priority jfl/backlog issue every 30 min"
|
|
23
|
+
enabled: true
|
|
24
|
+
trigger:
|
|
25
|
+
cron: "every-30-minutes"
|
|
26
|
+
gate:
|
|
27
|
+
requires_approval: false
|
|
28
|
+
cooldown_hours: 4
|
|
29
|
+
actions:
|
|
30
|
+
- type: log
|
|
31
|
+
message: "Checking for backlog issues to pick up..."
|
|
32
|
+
- type: command
|
|
33
|
+
command: |
|
|
34
|
+
ISSUE_JSON=$(gh issue list --label "jfl/backlog" --state open --limit 1 --json number,title,body,labels 2>/dev/null || echo "[]")
|
|
35
|
+
NUM=$(echo "$ISSUE_JSON" | python3 -c "import sys,json; i=json.load(sys.stdin); print(i[0]['number'] if i else '')" 2>/dev/null || echo "")
|
|
36
|
+
if [ -z "$NUM" ]; then echo "No backlog issues"; exit 0; fi
|
|
37
|
+
TITLE=$(echo "$ISSUE_JSON" | python3 -c "import sys,json; i=json.load(sys.stdin); print(i[0]['title'] if i else '')" 2>/dev/null || echo "")
|
|
38
|
+
BODY=$(echo "$ISSUE_JSON" | python3 -c "import sys,json; i=json.load(sys.stdin); print(i[0].get('body','') or '' if i else '')" 2>/dev/null || echo "")
|
|
39
|
+
echo "Picking up #$NUM: $TITLE"
|
|
40
|
+
gh issue edit "$NUM" --remove-label "jfl/backlog" --add-label "jfl/in-progress" 2>/dev/null || true
|
|
41
|
+
gh issue comment "$NUM" --body "🤖 PP picked this up. Working on a fix." 2>/dev/null || true
|
|
42
|
+
BRANCH="pp/issue-\${NUM}"
|
|
43
|
+
TASK="GitHub #\${NUM}: \${TITLE}\\n\\n\${BODY}\\n\\nIMPORTANT: Include 'Closes #\${NUM}' in the PR body."
|
|
44
|
+
jfl peter pr --task "$TASK" 2>&1 || true
|
|
45
|
+
|
|
46
|
+
- name: auto-merge-on-improvement
|
|
47
|
+
description: "Auto-merge PRs when eval score improves"
|
|
48
|
+
enabled: true
|
|
49
|
+
trigger:
|
|
50
|
+
pattern: "eval:scored"
|
|
51
|
+
condition: 'data.improved == "true"'
|
|
52
|
+
gate:
|
|
53
|
+
requires_approval: false
|
|
54
|
+
actions:
|
|
55
|
+
- type: log
|
|
56
|
+
message: "Eval passed: PR #{{data.pr_number}} delta={{data.delta}}"
|
|
57
|
+
- type: command
|
|
58
|
+
command: 'gh pr merge "{{data.pr_number}}" --merge --delete-branch --body "Auto-merged: score improved by {{data.delta}}" 2>/dev/null || true'
|
|
59
|
+
|
|
60
|
+
- name: flag-regression
|
|
61
|
+
description: "Request changes on PRs when eval regresses"
|
|
62
|
+
enabled: true
|
|
63
|
+
trigger:
|
|
64
|
+
pattern: "eval:scored"
|
|
65
|
+
condition: 'data.improved == "false" && data.pr_number'
|
|
66
|
+
actions:
|
|
67
|
+
- type: command
|
|
68
|
+
command: 'gh pr review "{{data.pr_number}}" --request-changes --body "❌ Eval regressed by {{data.delta}}" 2>/dev/null || true'
|
|
69
|
+
|
|
70
|
+
# ── Training Data ──────────────────────────────────────────────────
|
|
71
|
+
|
|
72
|
+
- name: log-training-tuple
|
|
73
|
+
description: "Log training tuple after every eval"
|
|
74
|
+
enabled: true
|
|
75
|
+
trigger:
|
|
76
|
+
pattern: "eval:scored"
|
|
77
|
+
actions:
|
|
78
|
+
- type: command
|
|
79
|
+
command: 'jfl eval log --agent "{{data.agent}}" --metrics "{\\"composite\\":{{data.composite}},\\"delta\\":{{data.delta}}}" 2>/dev/null || true'
|
|
80
|
+
|
|
81
|
+
- name: mine-on-session-end
|
|
82
|
+
description: "Mine training tuples from journal on session end"
|
|
83
|
+
enabled: true
|
|
84
|
+
trigger:
|
|
85
|
+
pattern: "session:ended"
|
|
86
|
+
actions:
|
|
87
|
+
- type: command
|
|
88
|
+
command: "jfl eval mine --all 2>/dev/null || true"
|
|
89
|
+
|
|
90
|
+
# ── Nightly ────────────────────────────────────────────────────────
|
|
91
|
+
|
|
92
|
+
- name: nightly-retrain
|
|
93
|
+
description: "Retrain PolicyHead nightly if enough new data"
|
|
94
|
+
enabled: true
|
|
95
|
+
trigger:
|
|
96
|
+
cron: "daily"
|
|
97
|
+
gate:
|
|
98
|
+
requires_approval: false
|
|
99
|
+
actions:
|
|
100
|
+
- type: command
|
|
101
|
+
command: |
|
|
102
|
+
BUFFER=$(wc -l < .jfl/training-buffer.jsonl 2>/dev/null || echo "0")
|
|
103
|
+
LAST=$(cat .jfl/checkpoints/policy-head-v2.json 2>/dev/null | python3 -c "import json,sys; print(json.load(sys.stdin).get('trained_on',0))" 2>/dev/null || echo "0")
|
|
104
|
+
NEW=$((BUFFER - LAST))
|
|
105
|
+
if [ "$NEW" -ge 50 ]; then
|
|
106
|
+
echo "Retraining: $NEW new tuples"
|
|
107
|
+
jfl train transform && jfl train policy-head --force 2>&1 || true
|
|
108
|
+
else
|
|
109
|
+
echo "Skip retrain: only $NEW new tuples (need 50+)"
|
|
110
|
+
fi
|
|
111
|
+
`;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=flow-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-generator.js","sourceRoot":"","sources":["../../../src/lib/setup/flow-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqGR,CAAA;AACD,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @purpose Bridge between TLA+ invariants and runtime InvariantMonitor
|
|
3
|
+
*
|
|
4
|
+
* Phase 2: Generate InvariantMonitor rules from:
|
|
5
|
+
* 1. TLA+ invariant definitions (spec-generator)
|
|
6
|
+
* 2. TLC violation counterexamples (jfl verify output)
|
|
7
|
+
* 3. PlanningLoop invariant gates
|
|
8
|
+
*
|
|
9
|
+
* Phase 3: Generate negative training tuples from TLC violations
|
|
10
|
+
* for PolicyHead training (the model learns to avoid unsafe actions).
|
|
11
|
+
*/
|
|
12
|
+
import type { SystemModel } from "./spec-generator.js";
|
|
13
|
+
/** A runtime invariant rule generated from formal verification */
|
|
14
|
+
export interface RuntimeInvariantRule {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
severity: "critical" | "error" | "warning";
|
|
19
|
+
source: "tla+" | "tlc_violation" | "planning_gate" | "manual";
|
|
20
|
+
/** The condition that triggers this rule (TypeScript expression shape) */
|
|
21
|
+
condition: InvariantCondition;
|
|
22
|
+
/** What to do when triggered */
|
|
23
|
+
action: "VETO" | "THROTTLE" | "WARN";
|
|
24
|
+
/** Recovery suggestion */
|
|
25
|
+
recovery: string;
|
|
26
|
+
/** Original TLA+ formula if available */
|
|
27
|
+
tlaFormula?: string;
|
|
28
|
+
/** TLC counterexample trace if from a violation */
|
|
29
|
+
counterexample?: CounterexampleTrace;
|
|
30
|
+
}
|
|
31
|
+
export interface InvariantCondition {
|
|
32
|
+
/** Which state fields to check */
|
|
33
|
+
stateFields: string[];
|
|
34
|
+
/** Human-readable expression */
|
|
35
|
+
expression: string;
|
|
36
|
+
/** TypeScript predicate body */
|
|
37
|
+
predicate: string;
|
|
38
|
+
}
|
|
39
|
+
export interface CounterexampleTrace {
|
|
40
|
+
steps: CounterexampleStep[];
|
|
41
|
+
depth: number;
|
|
42
|
+
invariantViolated: string;
|
|
43
|
+
}
|
|
44
|
+
export interface CounterexampleStep {
|
|
45
|
+
step: number;
|
|
46
|
+
action: string;
|
|
47
|
+
state: Record<string, string>;
|
|
48
|
+
}
|
|
49
|
+
/** Training tuple generated from a TLC violation */
|
|
50
|
+
export interface ViolationTrainingTuple {
|
|
51
|
+
/** State text for PolicyHead embedding */
|
|
52
|
+
state_text: string;
|
|
53
|
+
/** Goal text that led to the violation */
|
|
54
|
+
goal_text: string;
|
|
55
|
+
/** The action that was taken (and violated the invariant) */
|
|
56
|
+
action_type: string;
|
|
57
|
+
/** Always "regressed" — these are negative examples */
|
|
58
|
+
outcome: "regressed";
|
|
59
|
+
/** The invariant that was violated */
|
|
60
|
+
invariant: string;
|
|
61
|
+
/** Source: "tlc_violation" */
|
|
62
|
+
source: string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Generate InvariantMonitor rules from a SystemModel's planning loop gates
|
|
66
|
+
* and TLA+ invariant definitions.
|
|
67
|
+
*/
|
|
68
|
+
export declare function generateRuntimeRules(model: SystemModel): RuntimeInvariantRule[];
|
|
69
|
+
/**
|
|
70
|
+
* Read TLC violation results and generate runtime rules from counterexamples.
|
|
71
|
+
* Each counterexample becomes a rule that prevents the specific state transition
|
|
72
|
+
* that led to the violation.
|
|
73
|
+
*/
|
|
74
|
+
export declare function generateRulesFromViolations(projectRoot: string): RuntimeInvariantRule[];
|
|
75
|
+
/**
|
|
76
|
+
* Convert TLC violation counterexamples into negative training tuples
|
|
77
|
+
* for the PolicyHead. Each violation trace becomes a (state, action, negative_reward)
|
|
78
|
+
* tuple that teaches the model to avoid unsafe actions.
|
|
79
|
+
*/
|
|
80
|
+
export declare function generateViolationTrainingTuples(projectRoot: string): ViolationTrainingTuple[];
|
|
81
|
+
/**
|
|
82
|
+
* Write generated runtime rules to .jfl/invariant-rules.json
|
|
83
|
+
* These are loaded by the InvariantMonitor at runtime.
|
|
84
|
+
*/
|
|
85
|
+
export declare function writeRuntimeRules(projectRoot: string, rules: RuntimeInvariantRule[]): string;
|
|
86
|
+
/**
|
|
87
|
+
* Write violation training tuples to the training buffer
|
|
88
|
+
* (appended to existing training-buffer.jsonl)
|
|
89
|
+
*/
|
|
90
|
+
export declare function writeViolationTuples(projectRoot: string, tuples: ViolationTrainingTuple[]): number;
|
|
91
|
+
//# sourceMappingURL=invariant-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariant-bridge.d.ts","sourceRoot":"","sources":["../../../src/lib/setup/invariant-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAA;AAMrE,kEAAkE;AAClE,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAAA;IAC1C,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,eAAe,GAAG,QAAQ,CAAA;IAE7D,0EAA0E;IAC1E,SAAS,EAAE,kBAAkB,CAAA;IAE7B,gCAAgC;IAChC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAA;IAEpC,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAEhB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,mDAAmD;IACnD,cAAc,CAAC,EAAE,mBAAmB,CAAA;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,kBAAkB,EAAE,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B;AAED,oDAAoD;AACpD,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,OAAO,EAAE,WAAW,CAAA;IACpB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAA;CACf;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,oBAAoB,EAAE,CA8B/E;AAsGD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAwCvF;AAuDD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAyC7F;AAsED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAI5F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,CA0ClG"}
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @purpose Bridge between TLA+ invariants and runtime InvariantMonitor
|
|
3
|
+
*
|
|
4
|
+
* Phase 2: Generate InvariantMonitor rules from:
|
|
5
|
+
* 1. TLA+ invariant definitions (spec-generator)
|
|
6
|
+
* 2. TLC violation counterexamples (jfl verify output)
|
|
7
|
+
* 3. PlanningLoop invariant gates
|
|
8
|
+
*
|
|
9
|
+
* Phase 3: Generate negative training tuples from TLC violations
|
|
10
|
+
* for PolicyHead training (the model learns to avoid unsafe actions).
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
13
|
+
import { join } from "path";
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Phase 2: Generate Runtime Rules from TLA+ Model
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Generate InvariantMonitor rules from a SystemModel's planning loop gates
|
|
19
|
+
* and TLA+ invariant definitions.
|
|
20
|
+
*/
|
|
21
|
+
export function generateRuntimeRules(model) {
|
|
22
|
+
const rules = [];
|
|
23
|
+
// From planning loop invariant gates
|
|
24
|
+
if (model.planningLoop) {
|
|
25
|
+
for (const gate of model.planningLoop.invariantGates) {
|
|
26
|
+
rules.push(gateToRule(gate));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// From TLA+ invariant definitions
|
|
30
|
+
for (const inv of model.invariants) {
|
|
31
|
+
rules.push({
|
|
32
|
+
id: `tla_${inv.name}`,
|
|
33
|
+
name: inv.name,
|
|
34
|
+
description: inv.description,
|
|
35
|
+
severity: inv.severity === "info" ? "warning" : inv.severity,
|
|
36
|
+
source: "tla+",
|
|
37
|
+
condition: {
|
|
38
|
+
stateFields: extractStateFields(inv.formula),
|
|
39
|
+
expression: inv.description,
|
|
40
|
+
predicate: tlaToTSPredicate(inv.name, inv.formula),
|
|
41
|
+
},
|
|
42
|
+
action: inv.severity === "critical" ? "VETO" : "WARN",
|
|
43
|
+
recovery: `Address ${inv.name} violation — ${inv.description}`,
|
|
44
|
+
tlaFormula: inv.formula,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return rules;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Convert a PlanningLoop InvariantGate to a RuntimeInvariantRule
|
|
51
|
+
*/
|
|
52
|
+
function gateToRule(gate) {
|
|
53
|
+
return {
|
|
54
|
+
id: `gate_${gate.name}`,
|
|
55
|
+
name: gate.name,
|
|
56
|
+
description: gate.condition,
|
|
57
|
+
severity: gate.action === "VETO" ? "critical" : gate.action === "THROTTLE" ? "error" : "warning",
|
|
58
|
+
source: "planning_gate",
|
|
59
|
+
condition: {
|
|
60
|
+
stateFields: extractStateFields(gate.tlaFormula),
|
|
61
|
+
expression: gate.condition,
|
|
62
|
+
predicate: gateToPredicate(gate),
|
|
63
|
+
},
|
|
64
|
+
action: gate.action,
|
|
65
|
+
recovery: `Resolve ${gate.name}: ${gate.condition}`,
|
|
66
|
+
tlaFormula: gate.tlaFormula,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Extract state field names from a TLA+ formula
|
|
71
|
+
*/
|
|
72
|
+
function extractStateFields(formula) {
|
|
73
|
+
const fields = [];
|
|
74
|
+
const patterns = {
|
|
75
|
+
hubStatus: "systemState.hubConnections",
|
|
76
|
+
serviceStatus: "systemState.hubConnections",
|
|
77
|
+
agentStatus: "systemState.activeAgents",
|
|
78
|
+
repoLocks: "systemState.fileLocks",
|
|
79
|
+
cpuTemp: "systemState.cpuTemp",
|
|
80
|
+
memoryPressure: "systemState.memoryPressure",
|
|
81
|
+
humanEditing: "contextState.humanActivity",
|
|
82
|
+
trainingBuffer: "systemState.pendingEvals",
|
|
83
|
+
planningPhase: "planningPhase",
|
|
84
|
+
selectedTool: "selectedTool",
|
|
85
|
+
rolloutCount: "rolloutCount",
|
|
86
|
+
};
|
|
87
|
+
for (const [tlaVar, stateField] of Object.entries(patterns)) {
|
|
88
|
+
if (formula.includes(tlaVar)) {
|
|
89
|
+
fields.push(stateField);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return [...new Set(fields)];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Convert a TLA+ invariant name to a TypeScript predicate
|
|
96
|
+
* Returns a function body string that takes (state: WorldState)
|
|
97
|
+
*/
|
|
98
|
+
function tlaToTSPredicate(name, formula) {
|
|
99
|
+
const predicates = {
|
|
100
|
+
NoParallelEdits: `
|
|
101
|
+
const locks = state.systemState.fileLocks;
|
|
102
|
+
const uniqueLocks = new Set(locks);
|
|
103
|
+
return uniqueLocks.size < locks.length; // violation if duplicates`,
|
|
104
|
+
HubRequiredForScheduling: `
|
|
105
|
+
const hubDown = state.systemState.hubConnections === 0;
|
|
106
|
+
const hasActive = state.systemState.activeAgents.length > 0;
|
|
107
|
+
return hubDown && hasActive; // violation if hub down with active agents`,
|
|
108
|
+
LockIntegrity: `
|
|
109
|
+
const active = Object.entries(state.systemState.worktreeAllocation)
|
|
110
|
+
.filter(([, path]) => path !== "none");
|
|
111
|
+
return active.length > 0 && state.systemState.fileLocks.length === 0;
|
|
112
|
+
// violation if active agents without locks`,
|
|
113
|
+
};
|
|
114
|
+
return predicates[name] || `return false; // TODO: implement check for ${name}`;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Convert a PlanningLoop gate to a TypeScript predicate string
|
|
118
|
+
*/
|
|
119
|
+
function gateToPredicate(gate) {
|
|
120
|
+
const predicates = {
|
|
121
|
+
NoAgentStranding: `return state.systemState.hubConnections === 0 && state.systemState.activeAgents.length > 0`,
|
|
122
|
+
HumanAgentIsolation: `return state.contextState.humanActivity === true`,
|
|
123
|
+
WorktreeExclusivity: `
|
|
124
|
+
const allocs = Object.values(state.systemState.worktreeAllocation).filter(p => p !== "none");
|
|
125
|
+
return allocs.length !== new Set(allocs).size`,
|
|
126
|
+
ProposalRequired: `return proposals.length === 0`,
|
|
127
|
+
InvariantCheckRequired: `return !allProposalsChecked`,
|
|
128
|
+
RolloutBeforeSelect: `return rolloutCount === 0`,
|
|
129
|
+
AuthorityRespected: `return false; // enforced by planning loop structure`,
|
|
130
|
+
ThermalSafety: `return (state.systemState as any).cpuTemp > 85`,
|
|
131
|
+
MemoryBound: `return (state.systemState as any).memoryPressure > 80`,
|
|
132
|
+
};
|
|
133
|
+
return predicates[gate.name] || `return false; // TODO: implement ${gate.name}`;
|
|
134
|
+
}
|
|
135
|
+
// ============================================================================
|
|
136
|
+
// Phase 2: Generate Rules from TLC Violations
|
|
137
|
+
// ============================================================================
|
|
138
|
+
/**
|
|
139
|
+
* Read TLC violation results and generate runtime rules from counterexamples.
|
|
140
|
+
* Each counterexample becomes a rule that prevents the specific state transition
|
|
141
|
+
* that led to the violation.
|
|
142
|
+
*/
|
|
143
|
+
export function generateRulesFromViolations(projectRoot) {
|
|
144
|
+
const violationsPath = join(projectRoot, ".jfl", "specs", "violations.json");
|
|
145
|
+
if (!existsSync(violationsPath))
|
|
146
|
+
return [];
|
|
147
|
+
const data = JSON.parse(readFileSync(violationsPath, "utf-8"));
|
|
148
|
+
const rules = [];
|
|
149
|
+
for (const spec of data.specs || []) {
|
|
150
|
+
for (const violation of spec.violations || []) {
|
|
151
|
+
const trace = violation.trace || [];
|
|
152
|
+
if (trace.length === 0)
|
|
153
|
+
continue;
|
|
154
|
+
// The violation action is the last step that broke the invariant
|
|
155
|
+
const triggerStep = trace[trace.length - 1];
|
|
156
|
+
const prevStep = trace.length > 1 ? trace[trace.length - 2] : null;
|
|
157
|
+
rules.push({
|
|
158
|
+
id: `tlc_${violation.invariant}_${trace.length}`,
|
|
159
|
+
name: `TLC: ${violation.invariant}`,
|
|
160
|
+
description: `TLC found ${violation.invariant} violation via ${triggerStep?.action || "unknown"} at depth ${trace.length}`,
|
|
161
|
+
severity: "critical",
|
|
162
|
+
source: "tlc_violation",
|
|
163
|
+
condition: {
|
|
164
|
+
stateFields: Object.keys(triggerStep?.state || {}),
|
|
165
|
+
expression: `${triggerStep?.action || "Action"} while ${formatViolationCondition(prevStep, violation.invariant)}`,
|
|
166
|
+
predicate: generateViolationPredicate(violation.invariant, trace),
|
|
167
|
+
},
|
|
168
|
+
action: "VETO",
|
|
169
|
+
recovery: `Prevent ${triggerStep?.action} when ${formatViolationCondition(prevStep, violation.invariant)}`,
|
|
170
|
+
tlaFormula: violation.invariant,
|
|
171
|
+
counterexample: {
|
|
172
|
+
steps: trace,
|
|
173
|
+
depth: trace.length,
|
|
174
|
+
invariantViolated: violation.invariant,
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return rules;
|
|
180
|
+
}
|
|
181
|
+
function formatViolationCondition(prevStep, invariant) {
|
|
182
|
+
if (!prevStep?.state)
|
|
183
|
+
return `${invariant} preconditions hold`;
|
|
184
|
+
const conditions = [];
|
|
185
|
+
for (const [key, val] of Object.entries(prevStep.state)) {
|
|
186
|
+
if (key === "serviceStatus" && val.includes("down")) {
|
|
187
|
+
conditions.push("service is down");
|
|
188
|
+
}
|
|
189
|
+
if (key === "agentStatus" && val.includes("running")) {
|
|
190
|
+
conditions.push("agents are running");
|
|
191
|
+
}
|
|
192
|
+
if (key === "repoLocks" && val.includes("{")) {
|
|
193
|
+
conditions.push("repo locks are held");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return conditions.length > 0 ? conditions.join(" and ") : `${invariant} preconditions`;
|
|
197
|
+
}
|
|
198
|
+
function generateViolationPredicate(invariant, trace) {
|
|
199
|
+
// Generate a predicate that detects the preconditions of the violation
|
|
200
|
+
const lastStep = trace[trace.length - 1];
|
|
201
|
+
const action = lastStep?.action || "";
|
|
202
|
+
if (invariant === "HubRequiredForScheduling") {
|
|
203
|
+
return `
|
|
204
|
+
// TLC violation: hub crashed while agent was scheduled/running
|
|
205
|
+
const hubDown = state.systemState.hubConnections === 0;
|
|
206
|
+
const hasActive = state.systemState.activeAgents.length > 0;
|
|
207
|
+
return hubDown && hasActive;`;
|
|
208
|
+
}
|
|
209
|
+
if (invariant === "NoParallelEdits") {
|
|
210
|
+
return `
|
|
211
|
+
// TLC violation: two agents editing same files
|
|
212
|
+
const locks = state.systemState.fileLocks;
|
|
213
|
+
return locks.length !== new Set(locks).size;`;
|
|
214
|
+
}
|
|
215
|
+
if (invariant === "LockIntegrity") {
|
|
216
|
+
return `
|
|
217
|
+
// TLC violation: agent running without proper lock
|
|
218
|
+
const active = state.systemState.activeAgents.filter(a =>
|
|
219
|
+
!state.systemState.fileLocks.some(l => l.includes(a)));
|
|
220
|
+
return active.length > 0;`;
|
|
221
|
+
}
|
|
222
|
+
return `return false; // TODO: implement check for ${invariant} (action: ${action})`;
|
|
223
|
+
}
|
|
224
|
+
// ============================================================================
|
|
225
|
+
// Phase 3: Generate Training Tuples from Violations
|
|
226
|
+
// ============================================================================
|
|
227
|
+
/**
|
|
228
|
+
* Convert TLC violation counterexamples into negative training tuples
|
|
229
|
+
* for the PolicyHead. Each violation trace becomes a (state, action, negative_reward)
|
|
230
|
+
* tuple that teaches the model to avoid unsafe actions.
|
|
231
|
+
*/
|
|
232
|
+
export function generateViolationTrainingTuples(projectRoot) {
|
|
233
|
+
const violationsPath = join(projectRoot, ".jfl", "specs", "violations.json");
|
|
234
|
+
if (!existsSync(violationsPath))
|
|
235
|
+
return [];
|
|
236
|
+
const data = JSON.parse(readFileSync(violationsPath, "utf-8"));
|
|
237
|
+
const tuples = [];
|
|
238
|
+
for (const spec of data.specs || []) {
|
|
239
|
+
for (const violation of spec.violations || []) {
|
|
240
|
+
const trace = violation.trace || [];
|
|
241
|
+
if (trace.length < 2)
|
|
242
|
+
continue;
|
|
243
|
+
// Each step in the trace that leads toward the violation is a negative example
|
|
244
|
+
for (let i = 1; i < trace.length; i++) {
|
|
245
|
+
const step = trace[i];
|
|
246
|
+
const prevStep = trace[i - 1];
|
|
247
|
+
const action = step.action || "unknown";
|
|
248
|
+
// Map TLC action names to v2 tool names
|
|
249
|
+
const toolName = tlcActionToTool(action);
|
|
250
|
+
if (!toolName)
|
|
251
|
+
continue;
|
|
252
|
+
// Build state text from the TLC state
|
|
253
|
+
const stateText = buildStateTextFromTLC(prevStep.state, spec.specName);
|
|
254
|
+
// Build goal text from the invariant being violated
|
|
255
|
+
const goalText = `${invariantToGoal(violation.invariant)}. Context: ${action} was attempted.`;
|
|
256
|
+
tuples.push({
|
|
257
|
+
state_text: stateText,
|
|
258
|
+
goal_text: goalText,
|
|
259
|
+
action_type: toolName,
|
|
260
|
+
outcome: "regressed",
|
|
261
|
+
invariant: violation.invariant,
|
|
262
|
+
source: "tlc_violation",
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return tuples;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Map TLC action names to v2 PolicyHead tool names
|
|
271
|
+
*/
|
|
272
|
+
function tlcActionToTool(tlcAction) {
|
|
273
|
+
const mapping = {
|
|
274
|
+
ScheduleAgent: "run_experiment",
|
|
275
|
+
AgentStart: "run_experiment",
|
|
276
|
+
AgentEval: "run_experiment",
|
|
277
|
+
AgentComplete: "run_experiment",
|
|
278
|
+
AgentReset: "update_config",
|
|
279
|
+
AgentRecover: "fix_bug",
|
|
280
|
+
ServiceCrash: "add_monitoring",
|
|
281
|
+
ServiceRestart: "fix_bug",
|
|
282
|
+
PHPropose: "run_experiment",
|
|
283
|
+
DMSimulate: "run_experiment",
|
|
284
|
+
IMCheck: "add_monitoring",
|
|
285
|
+
SelectAction: "run_experiment",
|
|
286
|
+
Execute: "run_experiment",
|
|
287
|
+
};
|
|
288
|
+
return mapping[tlcAction] || null;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Build a PolicyHead-compatible state text from TLC state variables
|
|
292
|
+
*/
|
|
293
|
+
function buildStateTextFromTLC(state, specName) {
|
|
294
|
+
// Extract meaningful signals from TLC state
|
|
295
|
+
const hubDown = state.serviceStatus?.includes('"down"') ?? false;
|
|
296
|
+
const activeAgents = (state.agentStatus?.match(/"running"|"eval"|"scheduled"/g) || []).length;
|
|
297
|
+
const totalAgents = (state.agentStatus?.match(/"/g) || []).length / 2;
|
|
298
|
+
const composite = hubDown ? 0.3 : (activeAgents > 0 ? 0.6 : 0.8);
|
|
299
|
+
const testRate = hubDown ? 0.5 : 0.9;
|
|
300
|
+
const buildHealth = hubDown ? 0.0 : 0.9;
|
|
301
|
+
return [
|
|
302
|
+
`Agent: ${specName}`,
|
|
303
|
+
`Composite: ${composite.toFixed(4)}`,
|
|
304
|
+
`Tests: ${Math.round(testRate * 20)}/${20}`,
|
|
305
|
+
`Trajectory: ${activeAgents}`,
|
|
306
|
+
`Dimensions: test_pass_rate=${testRate.toFixed(4)}, build_health=${buildHealth.toFixed(4)}, hub_health=${hubDown ? "0.0000" : "1.0000"}`,
|
|
307
|
+
`Recent deltas: ${hubDown ? "-0.5000" : "+0.0100"}`,
|
|
308
|
+
].join("\n");
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Convert an invariant name to a natural language goal
|
|
312
|
+
*/
|
|
313
|
+
function invariantToGoal(invariant) {
|
|
314
|
+
const goals = {
|
|
315
|
+
HubRequiredForScheduling: "Ensure agents don't run when the hub is unavailable",
|
|
316
|
+
NoParallelEdits: "Prevent concurrent file edits that could cause merge conflicts",
|
|
317
|
+
LockIntegrity: "Maintain worktree lock consistency for running agents",
|
|
318
|
+
BoundedConcurrency: "Keep concurrent agent count within safe limits",
|
|
319
|
+
BufferBounded: "Prevent training buffer overflow",
|
|
320
|
+
NoExecutionWithoutIMApproval: "Ensure all actions pass invariant checks before execution",
|
|
321
|
+
VetoedNeverExecuted: "Never execute an action that was vetoed by safety checks",
|
|
322
|
+
HubRequiredForExecution: "Block action execution when hub is down",
|
|
323
|
+
SimulationBeforeSelection: "Require DM rollout before selecting an action",
|
|
324
|
+
AuthorityHierarchy: "Respect the IM > RO > WO > PH authority chain",
|
|
325
|
+
};
|
|
326
|
+
return goals[invariant] || `Maintain ${invariant} system invariant`;
|
|
327
|
+
}
|
|
328
|
+
// ============================================================================
|
|
329
|
+
// Write to Disk
|
|
330
|
+
// ============================================================================
|
|
331
|
+
/**
|
|
332
|
+
* Write generated runtime rules to .jfl/invariant-rules.json
|
|
333
|
+
* These are loaded by the InvariantMonitor at runtime.
|
|
334
|
+
*/
|
|
335
|
+
export function writeRuntimeRules(projectRoot, rules) {
|
|
336
|
+
const rulesPath = join(projectRoot, ".jfl", "invariant-rules.json");
|
|
337
|
+
writeFileSync(rulesPath, JSON.stringify(rules, null, 2));
|
|
338
|
+
return rulesPath;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Write violation training tuples to the training buffer
|
|
342
|
+
* (appended to existing training-buffer.jsonl)
|
|
343
|
+
*/
|
|
344
|
+
export function writeViolationTuples(projectRoot, tuples) {
|
|
345
|
+
if (tuples.length === 0)
|
|
346
|
+
return 0;
|
|
347
|
+
const bufferPath = join(projectRoot, ".jfl", "training-buffer.jsonl");
|
|
348
|
+
mkdirSync(join(projectRoot, ".jfl"), { recursive: true });
|
|
349
|
+
const lines = tuples.map(t => JSON.stringify({
|
|
350
|
+
v: 1,
|
|
351
|
+
ts: new Date().toISOString(),
|
|
352
|
+
session: "tlc-violation-mining",
|
|
353
|
+
state: {
|
|
354
|
+
composite_score: 0.3,
|
|
355
|
+
dimension_scores: { hub_health: 0, build_health: 0 },
|
|
356
|
+
tests_passing: 0,
|
|
357
|
+
tests_total: 1,
|
|
358
|
+
trajectory_length: 0,
|
|
359
|
+
recent_deltas: [-0.5],
|
|
360
|
+
agent: "system",
|
|
361
|
+
},
|
|
362
|
+
action: {
|
|
363
|
+
type: t.action_type,
|
|
364
|
+
description: t.goal_text,
|
|
365
|
+
files_affected: [],
|
|
366
|
+
scope: "medium",
|
|
367
|
+
},
|
|
368
|
+
outcome: {
|
|
369
|
+
improved: false,
|
|
370
|
+
delta: -0.1,
|
|
371
|
+
reward: -1.0,
|
|
372
|
+
},
|
|
373
|
+
meta: {
|
|
374
|
+
source: t.source,
|
|
375
|
+
invariant: t.invariant,
|
|
376
|
+
state_text: t.state_text,
|
|
377
|
+
goal_text: t.goal_text,
|
|
378
|
+
},
|
|
379
|
+
}));
|
|
380
|
+
const existing = existsSync(bufferPath) ? readFileSync(bufferPath, "utf-8") : "";
|
|
381
|
+
writeFileSync(bufferPath, existing + lines.join("\n") + "\n");
|
|
382
|
+
return tuples.length;
|
|
383
|
+
}
|
|
384
|
+
//# sourceMappingURL=invariant-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariant-bridge.js","sourceRoot":"","sources":["../../../src/lib/setup/invariant-bridge.ts"],"names":[],"mappings":"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"}
|