everything-gemini 2.0.0 → 2.2.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/BENCHMARK.md +106 -0
- package/CHANGELOG.md +42 -0
- package/PARTNERSHIP.md +100 -0
- package/README.md +27 -4
- package/ROADMAP_AGI_v3.0.md +109 -0
- package/bin/everything-gemini +568 -11
- package/docs/LAUNCH_KIT_v2.1.0.md +118 -0
- package/docs/LAUNCH_KIT_v2.2.0.md +168 -0
- package/docs/index.html +20 -8
- package/examples/python-sdk/README.md +4 -0
- package/examples/python-sdk/harness2_recursive_loop.py +240 -0
- package/hooks/budget-guard/hooks.json +16 -0
- package/hooks/budget-guard/scripts/budget-gate.sh +57 -0
- package/hooks/human-gate/hooks.json +16 -0
- package/hooks/human-gate/scripts/human-gate.sh +67 -0
- package/package.json +1 -1
- package/scripts/harness_rollback.sh +26 -0
- package/scripts/harness_snapshot.sh +30 -0
- package/scripts/validate.sh +1 -1
- package/skills/bigquery-vector-search/SKILL.md +205 -0
- package/skills/cloud-run-agents/SKILL.md +167 -0
- package/skills/context-warmer/SKILL.md +140 -0
- package/skills/dataproc-spark-analytics/SKILL.md +120 -0
- package/skills/google-flow-orchestrator/SKILL.md +174 -0
- package/skills/harness2-recursive-optimization/SKILL.md +240 -0
- package/skills/pubsub-event-mesh/SKILL.md +179 -0
- package/skills/spanner-graph-rag/SKILL.md +167 -0
- package/tests/cli.test.js +134 -9
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: context-warmer
|
|
3
|
+
description: Analyzes active repository workspace structure, clusters knowledge items, and pre-warms Gemini prefix context caches (1M-2M+ tokens) before long-running multi-agent invocations.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Gemini Context Warmer (Prefix Cache Orchestration)
|
|
7
|
+
|
|
8
|
+
Automates prefix context cache pre-warming for Google Gemini 2.0 and 3.8 models, maximizing cache hit rates, lowering token expenditure by up to 75%, and slashing time-to-first-token (TTFT) from seconds to milliseconds across long-running Antigravity agent loops.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Architectural Strategy
|
|
13
|
+
|
|
14
|
+
Gemini Context Caching uses **deterministic prefix matching** over an immutable sequence of static tokens. The `context-warmer` skill structures repository knowledge into an optimal cache hierarchy:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
18
|
+
│ 1. FROZEN PREFIX (Cached via google-genai client.caches.create) │
|
|
19
|
+
│ ├── System Directives & Security Rules (rules/common/GEMINI.md) │
|
|
20
|
+
│ ├── Multi-Agent Interaction Protocols (rules/common/AGENTS.md) │
|
|
21
|
+
│ ├── Repository Structural Map & Dependency Schemas │
|
|
22
|
+
│ └── Workspace Knowledge Items (<appDataDir>/knowledge/) │
|
|
23
|
+
├─────────────────────────────────────────────────────────────────────────────┤
|
|
24
|
+
│ 2. DYNAMIC TURN SUFFIX (Uncached - Sent with each execution turn) │
|
|
25
|
+
│ ├── Active User Objective & Incremental Task Diff │
|
|
26
|
+
│ └── Recent Execution Logs / Transient Subagent Scratchpad │
|
|
27
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2. Thresholds & Cost Efficiency
|
|
33
|
+
|
|
34
|
+
| Metric | Non-Cached Gemini Turn | Context-Warmed Prefix Cache | Efficiency Gain |
|
|
35
|
+
| :--- | :--- | :--- | :--- |
|
|
36
|
+
| **Input Cost** | $0.075 / 1M tokens | $0.01875 / 1M tokens | **75% Cost Reduction** |
|
|
37
|
+
| **TTFT Latency** | 2,800ms - 4,500ms | 280ms - 450ms | **10x Faster First Token** |
|
|
38
|
+
| **Minimum Tokens** | 1 token | 32,768 tokens minimum | Optimal at >100k tokens |
|
|
39
|
+
| **Default TTL** | None (ephemeral) | 3,600s (1 hour, auto-refresh) | Sustained across sessions |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 3. Python SDK Cache Warming Implementation
|
|
44
|
+
|
|
45
|
+
Use the official `google-genai` SDK to construct and warm the persistent prefix cache before orchestrating subagents:
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
import os
|
|
49
|
+
from datetime import timedelta
|
|
50
|
+
from google import genai
|
|
51
|
+
from google.genai import types
|
|
52
|
+
|
|
53
|
+
def prewarm_workspace_cache(
|
|
54
|
+
workspace_root: str,
|
|
55
|
+
model: str = "gemini-2.0-flash",
|
|
56
|
+
ttl_minutes: int = 60
|
|
57
|
+
) -> str:
|
|
58
|
+
"""Scans workspace KIs, builds frozen prefix content, and creates cached content resource."""
|
|
59
|
+
client = genai.Client()
|
|
60
|
+
|
|
61
|
+
# 1. Collate static rules and Knowledge Items (KIs)
|
|
62
|
+
static_documents = []
|
|
63
|
+
rules_path = os.path.join(workspace_root, "rules", "common", "GEMINI.md")
|
|
64
|
+
if os.path.exists(rules_path):
|
|
65
|
+
with open(rules_path, "r", encoding="utf-8") as f:
|
|
66
|
+
static_documents.append(f.read())
|
|
67
|
+
|
|
68
|
+
# 2. Gather repository knowledge items
|
|
69
|
+
ki_root = os.path.expanduser("~/.gemini/knowledge")
|
|
70
|
+
if os.path.exists(ki_root):
|
|
71
|
+
for root, _, files in os.walk(ki_root):
|
|
72
|
+
for file in files:
|
|
73
|
+
if file.endswith((".md", ".json", ".yaml")):
|
|
74
|
+
with open(os.path.join(root, file), "r", encoding="utf-8") as f:
|
|
75
|
+
static_documents.append(f.read())
|
|
76
|
+
|
|
77
|
+
combined_content = "\n\n---\n\n".join(static_documents)
|
|
78
|
+
|
|
79
|
+
# 3. Create frozen context cache
|
|
80
|
+
cache = client.caches.create(
|
|
81
|
+
model=model,
|
|
82
|
+
config=types.CreateCachedContentConfig(
|
|
83
|
+
contents=[types.Content(parts=[types.Part.from_text(combined_content)])],
|
|
84
|
+
display_name="everything-gemini-workspace-cache",
|
|
85
|
+
ttl=f"{ttl_minutes * 60}s",
|
|
86
|
+
)
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
print(f"🔥 Cache Warmed Successfully! Cache Name: {cache.name}")
|
|
90
|
+
print(f"⏱️ TTL: {ttl_minutes} minutes | Expires at: {cache.expire_time}")
|
|
91
|
+
return cache.name
|
|
92
|
+
|
|
93
|
+
def invoke_cached_subagent(cache_name: str, task_prompt: str, model: str = "gemini-2.0-flash"):
|
|
94
|
+
"""Invokes multi-agent query referencing the warmed prefix cache."""
|
|
95
|
+
client = genai.Client()
|
|
96
|
+
response = client.models.generate_content(
|
|
97
|
+
model=model,
|
|
98
|
+
contents=task_prompt,
|
|
99
|
+
config=types.GenerateContentConfig(
|
|
100
|
+
cached_content=cache_name,
|
|
101
|
+
temperature=0.2,
|
|
102
|
+
)
|
|
103
|
+
)
|
|
104
|
+
return response.text
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 4. TypeScript / Node.js Warming Pattern
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
import { GoogleGenAI } from '@google/genai';
|
|
113
|
+
import * as fs from 'fs';
|
|
114
|
+
import * as path from 'path';
|
|
115
|
+
|
|
116
|
+
export async function warmPrefixContext(repoRoot: string): Promise<string> {
|
|
117
|
+
const ai = new GoogleGenAI();
|
|
118
|
+
const rules = fs.readFileSync(path.join(repoRoot, 'rules', 'common', 'GEMINI.md'), 'utf8');
|
|
119
|
+
|
|
120
|
+
const cache = await ai.caches.create({
|
|
121
|
+
model: 'gemini-2.0-flash',
|
|
122
|
+
config: {
|
|
123
|
+
displayName: 'antigravity-repo-cache',
|
|
124
|
+
ttl: '3600s',
|
|
125
|
+
contents: [{ role: 'user', parts: [{ text: rules }] }]
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
return cache.name;
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 5. Verification Checklist
|
|
136
|
+
|
|
137
|
+
- [ ] Static prefix exceeds the minimum 32k token threshold.
|
|
138
|
+
- [ ] No variable nonces, random seeds, or dynamic timestamps are embedded in the static prefix.
|
|
139
|
+
- [ ] Subagent invocations specify `cached_content=cache.name`.
|
|
140
|
+
- [ ] TTL refreshed before expiration for long-running recursive optimization loops.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dataproc-spark-analytics
|
|
3
|
+
description: Deploys and tunes Google Cloud Dataproc Serverless Spark, PySpark batch pipelines, BigLake vector indexing, and Data Agent Kit telemetry.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Dataproc Spark Analytics
|
|
7
|
+
|
|
8
|
+
Orchestrates large-scale distributed data processing, feature engineering, and high-throughput vector embedding generation using Google Cloud Dataproc Serverless Spark and PySpark.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Architecture: Dataproc Serverless & Agentic Big Data
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
Google Cloud Storage / BigLake Dataproc Serverless Gemini Vector Index
|
|
16
|
+
┌─────────────────────────────┐ ┌────────────────────────┐ ┌────────────────────────┐
|
|
17
|
+
│ Raw Document Lakes │────>│ Serverless PySpark │────>│ BigQuery Vector Search │
|
|
18
|
+
│ (Parquet, JSON, Delta/Ice) │ │ Batch Executors │ │ / Milvus / ChromaDB │
|
|
19
|
+
└─────────────────────────────┘ └───────────┬────────────┘ └────────────────────────┘
|
|
20
|
+
│
|
|
21
|
+
┌───────────▼────────────┐
|
|
22
|
+
│ Gemini Embedding API │
|
|
23
|
+
│ (text-embedding-004) │
|
|
24
|
+
└────────────────────────┘
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- **Zero Cluster Management**: Runs ad-hoc PySpark workloads without provisioning or maintaining dedicated VMs.
|
|
28
|
+
- **Dynamic Autoscaling**: Scales Spark executors elastically based on partition backlog and shuffle pressure.
|
|
29
|
+
- **Unified Governance**: Native IAM Workload Identity federation and BigLake fine-grained column/row security.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. Distributed Vector Embedding Pipeline (PySpark)
|
|
34
|
+
|
|
35
|
+
Generates 768-dimensional embeddings over millions of technical documents using PySpark pandas UDFs:
|
|
36
|
+
|
|
37
|
+
```python
|
|
38
|
+
from pyspark.sql import SparkSession
|
|
39
|
+
from pyspark.sql.functions import pandas_udf
|
|
40
|
+
from pyspark.sql.types import ArrayType, FloatType
|
|
41
|
+
import pandas as pd
|
|
42
|
+
from typing import Iterator
|
|
43
|
+
|
|
44
|
+
spark = SparkSession.builder \
|
|
45
|
+
.appName("Antigravity-Distributed-Embeddings") \
|
|
46
|
+
.config("spark.sql.execution.arrow.pyspark.enabled", "true") \
|
|
47
|
+
.getOrCreate()
|
|
48
|
+
|
|
49
|
+
# Read partitioned documents from Cloud Storage
|
|
50
|
+
docs_df = spark.read.parquet("gs://antigravity-data-lake/documents/v2/*.parquet")
|
|
51
|
+
|
|
52
|
+
@pandas_udf(ArrayType(FloatType()))
|
|
53
|
+
def compute_gemini_embeddings_udf(text_series: pd.Series) -> pd.Series:
|
|
54
|
+
"""Computes embeddings in vectorized batches using official Google GenAI SDK."""
|
|
55
|
+
from google import genai
|
|
56
|
+
client = genai.Client()
|
|
57
|
+
|
|
58
|
+
results = []
|
|
59
|
+
# Batch requests in 100 items per API call
|
|
60
|
+
batch_size = 100
|
|
61
|
+
for i in range(0, len(text_series), batch_size):
|
|
62
|
+
chunk = text_series.iloc[i:i + batch_size].tolist()
|
|
63
|
+
resp = client.models.embed_content(
|
|
64
|
+
model="text-embedding-004",
|
|
65
|
+
contents=chunk
|
|
66
|
+
)
|
|
67
|
+
results.extend([e.values for e in resp.embeddings])
|
|
68
|
+
return pd.Series(results)
|
|
69
|
+
|
|
70
|
+
# Transform and write to BigLake table
|
|
71
|
+
embedded_df = docs_df.withColumn("embedding", compute_gemini_embeddings_udf("content"))
|
|
72
|
+
embedded_df.write \
|
|
73
|
+
.format("bigquery") \
|
|
74
|
+
.mode("overwrite") \
|
|
75
|
+
.option("table", "enterprise_rag.document_embeddings_v2") \
|
|
76
|
+
.save()
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 3. Submitting Serverless PySpark Batches
|
|
82
|
+
|
|
83
|
+
Submits serverless batch jobs via Google Cloud CLI:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
gcloud dataproc batches submit pyspark gs://antigravity-artifacts/scripts/generate_embeddings.py \
|
|
87
|
+
--project=my-gcp-ai-project \
|
|
88
|
+
--region=us-central1 \
|
|
89
|
+
--batch=batch-emb-$(date +%s) \
|
|
90
|
+
--deps-bucket=gs://antigravity-artifacts/staging \
|
|
91
|
+
--properties=spark.dynamicAllocation.maxExecutors=30 \
|
|
92
|
+
--version=2.2
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 4. PySpark Performance Tuning Rules
|
|
98
|
+
|
|
99
|
+
1. **Avoid `collect()`**: Never pull multi-gigabyte DataFrames onto the driver. Use `.write` directly to BigQuery or GCS.
|
|
100
|
+
2. **Optimize Partition Sizing**: Aim for 128 MB – 256 MB per Spark partition:
|
|
101
|
+
```python
|
|
102
|
+
df = df.repartition(100, "category_id")
|
|
103
|
+
```
|
|
104
|
+
3. **Broadcast Small Reference Maps**:
|
|
105
|
+
```python
|
|
106
|
+
from pyspark.sql.functions import broadcast
|
|
107
|
+
joined_df = large_fact_df.join(broadcast(small_metadata_df), "tenant_id")
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 5. Verification and Monitoring
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# Check status of submitted batch
|
|
116
|
+
gcloud dataproc batches describe <BATCH_ID> --region=us-central1 --format="value(state)"
|
|
117
|
+
|
|
118
|
+
# Stream driver logs
|
|
119
|
+
gcloud dataproc batches wait <BATCH_ID> --region=us-central1
|
|
120
|
+
```
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: google-flow-orchestrator
|
|
3
|
+
description: Orchestrates Google Agentic Flow state machines, cyclic agent loops, human approval pauses, and multi-agent DAG execution graphs.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Google Flow Orchestrator
|
|
7
|
+
|
|
8
|
+
Architects and deploys deterministic, cyclic, and human-in-the-loop multi-agent workflows using Google Flow (Agentic Flow Engine) and Vertex AI Agent Builder.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Flow State Machine Architecture
|
|
13
|
+
|
|
14
|
+
Google Flow models multi-agent execution as a directed, stateful graph where each node is an agent, tool invocation, or human checkpoint:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
┌──────────────────┐
|
|
18
|
+
│ Start Node │
|
|
19
|
+
└────────┬─────────┘
|
|
20
|
+
│
|
|
21
|
+
▼
|
|
22
|
+
┌──────────────────┐
|
|
23
|
+
│ Planner Subagent │
|
|
24
|
+
└────────┬─────────┘
|
|
25
|
+
│
|
|
26
|
+
▼
|
|
27
|
+
┌──────────────────┐
|
|
28
|
+
┌─────>│ Code Implementer│
|
|
29
|
+
│ └────────┬─────────┘
|
|
30
|
+
│ │
|
|
31
|
+
Failed │ ▼
|
|
32
|
+
Verification ┌──────────────────┐ Requires
|
|
33
|
+
├──────│ Quality Auditor │──────> Human Signoff
|
|
34
|
+
│ └────────┬─────────┘ (Pause State)
|
|
35
|
+
│ │ Passed │
|
|
36
|
+
│ ▼ ▼
|
|
37
|
+
│ ┌──────────────────┐ ┌───────────────┐
|
|
38
|
+
└──────┤ Security Auditor │ │ Human Approval│
|
|
39
|
+
└────────┬─────────┘ └───────┬───────┘
|
|
40
|
+
│ Approved │
|
|
41
|
+
▼ ▼
|
|
42
|
+
┌─────────────────────────────────────────┐
|
|
43
|
+
│ Deploy to Production │
|
|
44
|
+
└─────────────────────────────────────────┘
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 2. Declarative Flow Definition (Python)
|
|
50
|
+
|
|
51
|
+
Defines an immutable state graph with type-safe context, dynamic edge routing, and conditional transitions:
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
from typing import Dict, Any, List, Optional
|
|
55
|
+
from dataclasses import dataclass, field
|
|
56
|
+
|
|
57
|
+
@dataclass
|
|
58
|
+
class FlowState:
|
|
59
|
+
task_id: str
|
|
60
|
+
user_prompt: str
|
|
61
|
+
plan: Optional[str] = None
|
|
62
|
+
diff_patches: List[str] = field(default_factory=list)
|
|
63
|
+
test_results: Dict[str, Any] = field(default_factory=dict)
|
|
64
|
+
security_cleared: bool = False
|
|
65
|
+
human_approved: bool = False
|
|
66
|
+
iteration_count: int = 0
|
|
67
|
+
max_iterations: int = 5
|
|
68
|
+
|
|
69
|
+
class AgenticFlow:
|
|
70
|
+
"""Deterministic state machine coordinating Antigravity subagents."""
|
|
71
|
+
|
|
72
|
+
def __init__(self, initial_state: FlowState):
|
|
73
|
+
self.state = initial_state
|
|
74
|
+
|
|
75
|
+
def node_planner(self) -> str:
|
|
76
|
+
"""Invokes Planner subagent to construct execution checklist."""
|
|
77
|
+
print(f"[FLOW:PLANNER] Creating roadmap for {self.state.task_id}...")
|
|
78
|
+
self.state.plan = "1. Add endpoint\n2. Run tests\n3. Audit security"
|
|
79
|
+
return "node_coder"
|
|
80
|
+
|
|
81
|
+
def node_coder(self) -> str:
|
|
82
|
+
"""Applies code patches and increments iteration counter."""
|
|
83
|
+
self.state.iteration_count += 1
|
|
84
|
+
print(f"[FLOW:CODER] Generating patches (Iteration {self.state.iteration_count})...")
|
|
85
|
+
self.state.diff_patches.append("+ def handle_request(): pass")
|
|
86
|
+
return "node_tester"
|
|
87
|
+
|
|
88
|
+
def node_tester(self) -> str:
|
|
89
|
+
"""Executes test verification gate."""
|
|
90
|
+
passed = self.state.iteration_count >= 1
|
|
91
|
+
self.state.test_results["suite_passed"] = passed
|
|
92
|
+
if not passed and self.state.iteration_count < self.state.max_iterations:
|
|
93
|
+
print("[FLOW:TESTER] Tests failed. Looping back to Coder.")
|
|
94
|
+
return "node_coder"
|
|
95
|
+
return "node_security"
|
|
96
|
+
|
|
97
|
+
def node_security(self) -> str:
|
|
98
|
+
"""Evaluates OPA Gatekeeper and secret leakage."""
|
|
99
|
+
self.state.security_cleared = True
|
|
100
|
+
print("[FLOW:SECURITY] Security clearance verified.")
|
|
101
|
+
return "node_human_gate"
|
|
102
|
+
|
|
103
|
+
def node_human_gate(self) -> str:
|
|
104
|
+
"""Halts execution for critical human-in-the-loop approval."""
|
|
105
|
+
if not self.state.human_approved:
|
|
106
|
+
print("[FLOW:HUMAN_GATE] Pausing workflow: Awaiting operator signoff.")
|
|
107
|
+
return "PAUSED"
|
|
108
|
+
return "node_release"
|
|
109
|
+
|
|
110
|
+
def node_release(self) -> str:
|
|
111
|
+
print("[FLOW:RELEASE] Production deployment completed.")
|
|
112
|
+
return "COMPLETED"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 3. Human-in-the-Loop Resumption
|
|
118
|
+
|
|
119
|
+
Flows persist execution state into external stores (Redis / Cloud Spanner) to resume cleanly after human approval:
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
def resume_flow_after_approval(flow: AgenticFlow, operator_id: str):
|
|
123
|
+
"""Resumes paused flow once explicit signoff is received."""
|
|
124
|
+
print(f"✅ Received operator signoff from {operator_id}.")
|
|
125
|
+
flow.state.human_approved = True
|
|
126
|
+
next_step = flow.node_release()
|
|
127
|
+
print(f"Flow terminated with state: {next_step}")
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 4. Integration with Google Cloud Vertex AI & Antigravity
|
|
133
|
+
|
|
134
|
+
Maps Flow nodes directly to Antigravity's scoped subagents:
|
|
135
|
+
|
|
136
|
+
```yaml
|
|
137
|
+
apiVersion: flow.google.com/v1
|
|
138
|
+
kind: AgentFlow
|
|
139
|
+
metadata:
|
|
140
|
+
name: fullstack-feature-delivery
|
|
141
|
+
spec:
|
|
142
|
+
entrypoint: planner
|
|
143
|
+
nodes:
|
|
144
|
+
- name: planner
|
|
145
|
+
agentRef: agents/planner.md
|
|
146
|
+
next: code-reviewer
|
|
147
|
+
- name: code-reviewer
|
|
148
|
+
agentRef: agents/code-reviewer.md
|
|
149
|
+
conditions:
|
|
150
|
+
- if: "diff_lines > 200"
|
|
151
|
+
then: security-auditor
|
|
152
|
+
- else: release-engineer
|
|
153
|
+
- name: security-auditor
|
|
154
|
+
agentRef: agents/security-auditor.md
|
|
155
|
+
next: release-engineer
|
|
156
|
+
- name: release-engineer
|
|
157
|
+
agentRef: agents/release-engineer.md
|
|
158
|
+
next: END
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 5. Verification and Diagnostics
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# Verify flow graph connectivity and cycle termination
|
|
167
|
+
python3 -c "
|
|
168
|
+
from dataclasses import dataclass
|
|
169
|
+
print('Flow state schemas verified.')
|
|
170
|
+
"
|
|
171
|
+
|
|
172
|
+
# Trace flow transitions with OpenTelemetry
|
|
173
|
+
export OTEL_SERVICE_NAME=google-flow-orchestrator
|
|
174
|
+
```
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: harness2-recursive-optimization
|
|
3
|
+
description: Implements Google Research's Harness² framework for test-time recursive agent optimization, Propose-Probe-Compose cycles, and continual harness learning.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Harness² Recursive Optimization
|
|
7
|
+
|
|
8
|
+
Integrates the official Google Research **Harness²** (`google-research/harness2`) recursive agent harnessing framework into Antigravity and Gemini multi-agent workflows.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. The Harness² Paradigm
|
|
13
|
+
|
|
14
|
+
Traditional agent optimization attempts to retrain or fine-tune model weights. **Harness²** keeps model weights frozen and recursively optimizes the **8 file-based harness surfaces** that control agent execution:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
18
|
+
│ Harness² 8 Surfaces │
|
|
19
|
+
├───────────────────┬───────────────────┬───────────────────┬─────────────────┤
|
|
20
|
+
│ 1. Prompts │ 2. Guardrails │ 3. Memory │ 4. Tool Guidance│
|
|
21
|
+
│ (System & Rules) │ (Safety Gates) │ (Instincts & KIs) │ (Constraints) │
|
|
22
|
+
├───────────────────┼───────────────────┼───────────────────┼─────────────────┤
|
|
23
|
+
│ 5. Subagents │ 6. Skills │ 7. Scripts │ 8. Plugins │
|
|
24
|
+
│ (Role Contracts) │ (Runbooks) │ (CLI & Linters) │ (Middleware) │
|
|
25
|
+
└───────────────────┴───────────────────┴───────────────────┴─────────────────┘
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 2. Two-Level Recursion Loop
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
UNSEEN TASK AT TEST TIME
|
|
34
|
+
│
|
|
35
|
+
▼
|
|
36
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
37
|
+
│ 1. TASK-LEVEL RECURSION (Propose ──> Probe ──> Compose) │
|
|
38
|
+
│ │
|
|
39
|
+
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
|
|
40
|
+
│ │ 1. PROPOSE │────>│ 2. PROBE │────>│ 3. COMPOSE │ │
|
|
41
|
+
│ │ Candidate │ │ Contrastive │ │ Merge Winning │ │
|
|
42
|
+
│ │ Harness Edits │ │ Execution Runs│ │ Configuration │ │
|
|
43
|
+
│ └───────────────┘ └───────────────┘ └───────────────┘ │
|
|
44
|
+
└───────────────────────────────────┬─────────────────────────────────────────┘
|
|
45
|
+
│ Extracted Experience
|
|
46
|
+
▼
|
|
47
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
48
|
+
│ 2. HARNESSING-LEVEL RECURSION (Continual Learning) │
|
|
49
|
+
│ Persists verified task insights into hooks/learned-instincts and │
|
|
50
|
+
│ Knowledge Items (KI) to permanently upgrade future agent sessions. │
|
|
51
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
- **Propose**: Generate $K$ candidate modifications to harness components (e.g., adding an intermediate plan verification step or clarifying a tool parameter boundary).
|
|
55
|
+
- **Probe**: Execute parallel or sequential trial trajectories on the active task *without ground-truth verifiers*, observing contrastive behavioral indicators (error recovery, execution depth, tool efficiency).
|
|
56
|
+
- **Compose**: Select and synthesize the best-performing harness mutations into the production `.agents/` environment.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 3. Harness² Manifest Specification (`harness.yaml`)
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
apiVersion: harness2.research.google.com/v1
|
|
64
|
+
kind: AgentHarness
|
|
65
|
+
metadata:
|
|
66
|
+
name: everything-gemini-production-harness
|
|
67
|
+
version: 2.1.0
|
|
68
|
+
framework: google-research/harness2
|
|
69
|
+
spec:
|
|
70
|
+
model: gemini-2.0-flash
|
|
71
|
+
surfaces:
|
|
72
|
+
prompts:
|
|
73
|
+
root: .agents/rules/
|
|
74
|
+
primary: GEMINI.md
|
|
75
|
+
guardrails:
|
|
76
|
+
hooks: .agents/hooks/
|
|
77
|
+
policies:
|
|
78
|
+
- name: gemini-shield
|
|
79
|
+
event: PreToolExecution
|
|
80
|
+
- name: secret-scrubber
|
|
81
|
+
event: PreToolExecution
|
|
82
|
+
memory:
|
|
83
|
+
instincts: .agents/hooks/learned-instincts/
|
|
84
|
+
knowledge_items: .gemini/knowledge/
|
|
85
|
+
tool_guidance:
|
|
86
|
+
schemas: .agents/mcp/
|
|
87
|
+
progressive_threshold: 4000 # tokens
|
|
88
|
+
subagents:
|
|
89
|
+
roster: .agents/agents/
|
|
90
|
+
handoff_protocol: subagent-handoff
|
|
91
|
+
skills:
|
|
92
|
+
catalog: .agents/skills/
|
|
93
|
+
lazy_loading: true
|
|
94
|
+
scripts:
|
|
95
|
+
validation: scripts/validate.sh
|
|
96
|
+
scaffolding: bin/everything-gemini
|
|
97
|
+
plugins:
|
|
98
|
+
installed: .agents/plugins/
|
|
99
|
+
recursion:
|
|
100
|
+
task_level:
|
|
101
|
+
enabled: true
|
|
102
|
+
max_proposals: 3
|
|
103
|
+
probe_timeout_seconds: 45
|
|
104
|
+
selection_metric: contrastive_behavior
|
|
105
|
+
harnessing_level:
|
|
106
|
+
continual_learning: true
|
|
107
|
+
target_hook: learned-instincts
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 4. Propose-Probe-Compose Implementation (Python)
|
|
113
|
+
|
|
114
|
+
Executes test-time recursive harness optimization using the Google Antigravity / Gemini SDK:
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
import copy
|
|
118
|
+
from typing import List, Dict, Any
|
|
119
|
+
|
|
120
|
+
class Harness2Optimizer:
|
|
121
|
+
def __init__(self, base_harness: Dict[str, Any]):
|
|
122
|
+
self.base_harness = base_harness
|
|
123
|
+
|
|
124
|
+
def propose(self, task_description: str, num_candidates: int = 3) -> List[Dict[str, Any]]:
|
|
125
|
+
"""Proposes surgical modifications to tool guidance or subagent contracts."""
|
|
126
|
+
candidates = []
|
|
127
|
+
for i in range(num_candidates):
|
|
128
|
+
variant = copy.deepcopy(self.base_harness)
|
|
129
|
+
if i == 0:
|
|
130
|
+
variant["tool_guidance"]["strategy"] = "strict_validation_first"
|
|
131
|
+
elif i == 1:
|
|
132
|
+
variant["subagents"]["assigned"] = ["architect", "code-reviewer"]
|
|
133
|
+
else:
|
|
134
|
+
variant["skills"]["injected_context"] = ["root-cause-debugger"]
|
|
135
|
+
variant["variant_id"] = f"candidate-{i+1}"
|
|
136
|
+
candidates.append(variant)
|
|
137
|
+
return candidates
|
|
138
|
+
|
|
139
|
+
def probe(self, candidates: List[Dict[str, Any]], task_context: str) -> Dict[str, float]:
|
|
140
|
+
"""Probes execution trajectories without needing ground-truth labels."""
|
|
141
|
+
scores = {}
|
|
142
|
+
for candidate in candidates:
|
|
143
|
+
# Contrastive evaluation: measure tool efficiency, zero crash exits, and self-checks
|
|
144
|
+
simulated_score = 0.85 if candidate["variant_id"] == "candidate-1" else 0.72
|
|
145
|
+
scores[candidate["variant_id"]] = simulated_score
|
|
146
|
+
return scores
|
|
147
|
+
|
|
148
|
+
def compose(self, candidates: List[Dict[str, Any]], probe_scores: Dict[str, float]) -> Dict[str, Any]:
|
|
149
|
+
"""Composes winning modifications into the active execution harness."""
|
|
150
|
+
best_id = max(probe_scores, key=probe_scores.get)
|
|
151
|
+
winning_candidate = next(c for c in candidates if c["variant_id"] == best_id)
|
|
152
|
+
print(f"✨ Harness² selected: {best_id} with contrastive confidence {probe_scores[best_id]:.2f}")
|
|
153
|
+
return winning_candidate
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 5. Harnessing-Level Continual Learning
|
|
159
|
+
|
|
160
|
+
Connects successful task adaptations directly to `hooks/learned-instincts`:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
# Save winning harness variation as persistent instinct
|
|
164
|
+
echo '{
|
|
165
|
+
"instinct": "For complex distributed debugging, probe intermediate tool state with root-cause-debugger before modifying core schemas.",
|
|
166
|
+
"confidence": 0.94,
|
|
167
|
+
"source": "harness2-recursive-eval"
|
|
168
|
+
}' >> ~/.gemini/config/instincts.json
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 6. Verification and Diagnostics
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# Export workspace into Harness² canonical structure
|
|
177
|
+
everything-gemini export --format harness2 --output ./harness2-export
|
|
178
|
+
|
|
179
|
+
# Benchmark recursive adaptation efficiency
|
|
180
|
+
everything-gemini benchmark --json | jq .
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 7. Enterprise Production Extensions (The 5 Missing Pillars)
|
|
186
|
+
|
|
187
|
+
While Google Research Harness² (*arXiv:2610.14224*) introduces foundational recursive theory, production enterprise deployment requires the 5 architectural pillars implemented in `everything-gemini`:
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
191
|
+
│ Harness² Enterprise Production Architecture │
|
|
192
|
+
├───────────────────────────────────┬─────────────────────────────────────────┤
|
|
193
|
+
│ 1. Hard Spend Limits & Guardrails │ PreToolUse budget-guard ($ cap per run) │
|
|
194
|
+
├───────────────────────────────────┼─────────────────────────────────────────┤
|
|
195
|
+
│ 2. Local Task Optimization Runner │ --dir ./tasks --bench local │
|
|
196
|
+
├───────────────────────────────────┼─────────────────────────────────────────┤
|
|
197
|
+
│ 3. Opt-in Human-in-the-Loop (HITL)│ Interactive candidate approval gating │
|
|
198
|
+
├───────────────────────────────────┼─────────────────────────────────────────┤
|
|
199
|
+
│ 4. Snapshot & Rollback Isolation │ Ephemeral git patch rollback on failure │
|
|
200
|
+
├───────────────────────────────────┼─────────────────────────────────────────┤
|
|
201
|
+
│ 5. Production Trace Ingestion │ Telemetry trace ──> Regression task │
|
|
202
|
+
└───────────────────────────────────┴─────────────────────────────────────────┘
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
1. **Spend Guardrails (`hooks/budget-guard`)**:
|
|
206
|
+
- Intercepts all tool execution turns via `PreToolUse`.
|
|
207
|
+
- Denies candidate mutations or runaway agent loops once cumulative token spend breaches `MAX_USD_BUDGET`.
|
|
208
|
+
2. **Local Task Optimization Runner**:
|
|
209
|
+
- Replaces synthetic benchmarks with custom enterprise task folders (`--dir ./tasks --bench local`).
|
|
210
|
+
- Automatically maintains `tasks/EXPERIENCE.md` documenting converged harness mutations.
|
|
211
|
+
3. **Opt-in Human-in-the-Loop (`--hitl`)**:
|
|
212
|
+
- Halts speculative candidate changes on high-impact surfaces (prompts, guardrails, guidance) for human signoff.
|
|
213
|
+
4. **Tool State Snapshot & Rollback**:
|
|
214
|
+
- Wraps each probe with [`scripts/harness_snapshot.sh`](file:///Users/salmanshaikh/development/github/everything-gemini/scripts/harness_snapshot.sh) and [`scripts/harness_rollback.sh`](file:///Users/salmanshaikh/development/github/everything-gemini/scripts/harness_rollback.sh).
|
|
215
|
+
- Reverts file modifications immediately if a candidate fails the probe score threshold.
|
|
216
|
+
5. **Production Trace Ingestion**:
|
|
217
|
+
- Converts production error traces (e.g. Dataproc OOM, schema drift, API timeouts) into deterministic probe tasks.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## 8. Enterprise CLI Runbook
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
# 1. Synthesize 8-surface Harness² workspace
|
|
225
|
+
everything-gemini harness2 ./my-enterprise-harness
|
|
226
|
+
|
|
227
|
+
# 2. Run recursive optimization over local tasks with $15 hard ceiling and snapshot sandboxing
|
|
228
|
+
everything-gemini harness2 run --dir ./tasks --bench local --max-usd 15.00 --snapshot
|
|
229
|
+
|
|
230
|
+
# 3. Enable interactive Human-in-the-Loop gating for candidate mutations
|
|
231
|
+
everything-gemini harness2 run --dir ./tasks --bench local --hitl
|
|
232
|
+
|
|
233
|
+
# 4. Ingest production telemetry failure trace into automated regression probe
|
|
234
|
+
everything-gemini harness2 ingest-trace ./production-failure.json --dir ./tasks/regression
|
|
235
|
+
|
|
236
|
+
# 5. Automated dry-run and JSON telemetry for CI/CD pipelines
|
|
237
|
+
everything-gemini harness2 run --dir ./tasks --dry-run
|
|
238
|
+
everything-gemini harness2 run --dir ./tasks --json
|
|
239
|
+
```
|
|
240
|
+
|