mirror of
https://github.com/allaunthefox/Research-Stack.git
synced 2026-08-17 13:50:36 +00:00
Ignore generated run outputs and scrub API key scripts
This commit is contained in:
parent
9213d9755e
commit
f9de097951
3 changed files with 747 additions and 0 deletions
71
.gitignore
vendored
71
.gitignore
vendored
|
|
@ -64,12 +64,19 @@ data/*.iso
|
||||||
**/_build/
|
**/_build/
|
||||||
**/__pycache__/
|
**/__pycache__/
|
||||||
|
|
||||||
|
# Agda build artifacts
|
||||||
|
*.agdai
|
||||||
|
|
||||||
# Hardware/FPGA build artifacts
|
# Hardware/FPGA build artifacts
|
||||||
**/obj_dir/
|
**/obj_dir/
|
||||||
**/hardware/sparkle/tangnano9k/*.fs
|
**/hardware/sparkle/tangnano9k/*.fs
|
||||||
**/hardware/sparkle/tangnano9k/*.pnr.json
|
**/hardware/sparkle/tangnano9k/*.pnr.json
|
||||||
**/hardware/sparkle/tangnano9k/*.history
|
**/hardware/sparkle/tangnano9k/*.history
|
||||||
**/hardware/sparkle/tangnano9k/sparkle_tangnano9k.json
|
**/hardware/sparkle/tangnano9k/sparkle_tangnano9k.json
|
||||||
|
4-Infrastructure/hardware/tangnano9k/
|
||||||
|
4-Infrastructure/hardware/tangnano9k_*.fs
|
||||||
|
4-Infrastructure/hardware/tangnano9k_*.json
|
||||||
|
4-Infrastructure/hardware/tangnano9k_*_pnr.json
|
||||||
*.vcd
|
*.vcd
|
||||||
*_tb.v
|
*_tb.v
|
||||||
*_test_vectors.json
|
*_test_vectors.json
|
||||||
|
|
@ -89,6 +96,10 @@ shared-data/
|
||||||
**/target/
|
**/target/
|
||||||
tools/servo-fetch/
|
tools/servo-fetch/
|
||||||
|
|
||||||
|
# Local runtime sandboxes
|
||||||
|
**/.sandbox-home/
|
||||||
|
**/.sandbox-tmp/
|
||||||
|
|
||||||
# JavaScript build artifacts
|
# JavaScript build artifacts
|
||||||
**/node_modules/
|
**/node_modules/
|
||||||
|
|
||||||
|
|
@ -112,12 +123,72 @@ extensions/
|
||||||
2-Search-Space/PINNs/
|
2-Search-Space/PINNs/
|
||||||
2-Search-Space/alphageometry/
|
2-Search-Space/alphageometry/
|
||||||
2-Search-Space/neural-conservation-law/
|
2-Search-Space/neural-conservation-law/
|
||||||
|
2-Search-Space/search/stract/crates/optics/testcases/samples/
|
||||||
6-Documentation/papers/Downloads_from_internet/
|
6-Documentation/papers/Downloads_from_internet/
|
||||||
6-Documentation/papers/downloads/
|
6-Documentation/papers/downloads/
|
||||||
6-Documentation/papers/facebook_pdfs/
|
6-Documentation/papers/facebook_pdfs/
|
||||||
6-Documentation/papers/literature/
|
6-Documentation/papers/literature/
|
||||||
6-Documentation/papers/supporting-materials/
|
6-Documentation/papers/supporting-materials/
|
||||||
|
|
||||||
|
# Generated benchmark corpora and run outputs.
|
||||||
|
3-Mathematical-Models/dna_benchmark/**/corpus/
|
||||||
|
3-Mathematical-Models/dna_benchmark/results/
|
||||||
|
3-Mathematical-Models/dna_benchmark/**/compressor_manifold.json
|
||||||
|
3-Mathematical-Models/dna_benchmark/**/eigenvalue_survey.json
|
||||||
|
3-Mathematical-Models/equations_parquet_tagged/*_curriculum.jsonl
|
||||||
|
3-Mathematical-Models/equations_parquet_tagged/*_receipt.json
|
||||||
|
3-Mathematical-Models/equations_parquet_tagged/*_table.csv
|
||||||
|
3-Mathematical-Models/unified_surface/cache/
|
||||||
|
|
||||||
|
# Generated shim/app run bundles.
|
||||||
|
4-Infrastructure/shim/erdos_surface_orchestrator/out/
|
||||||
|
4-Infrastructure/shim/*_after.json
|
||||||
|
4-Infrastructure/shim/*_benchmarks.csv
|
||||||
|
4-Infrastructure/shim/*_before.json
|
||||||
|
4-Infrastructure/shim/*_bit.json
|
||||||
|
4-Infrastructure/shim/*_checkpoint.json
|
||||||
|
4-Infrastructure/shim/*_compression.json
|
||||||
|
4-Infrastructure/shim/*_curriculum.jsonl
|
||||||
|
4-Infrastructure/shim/*_eigenvectors.json
|
||||||
|
4-Infrastructure/shim/*_lut.json
|
||||||
|
4-Infrastructure/shim/*_manifest.jsonl
|
||||||
|
4-Infrastructure/shim/*_packages.json
|
||||||
|
4-Infrastructure/shim/*_packets.jsonl
|
||||||
|
4-Infrastructure/shim/*_pull.json
|
||||||
|
4-Infrastructure/shim/*_receipt.json
|
||||||
|
4-Infrastructure/shim/*_receipt_*.json
|
||||||
|
4-Infrastructure/shim/*_report.json
|
||||||
|
4-Infrastructure/shim/*_responses.jsonl
|
||||||
|
4-Infrastructure/shim/*_results.json
|
||||||
|
4-Infrastructure/shim/*_sft.jsonl
|
||||||
|
4-Infrastructure/shim/*_smoke.json
|
||||||
|
4-Infrastructure/shim/*_stream.bin
|
||||||
|
4-Infrastructure/shim/finance_claim_remote_bundle/
|
||||||
|
4-Infrastructure/shim/finance_claim_lut_fixtures/claim-*/
|
||||||
|
4-Infrastructure/shim/finance_claim_lut_fixtures/*.pdf
|
||||||
|
4-Infrastructure/shim/full_gambit_runs/
|
||||||
|
4-Infrastructure/shim/h200_encode_dry_run/
|
||||||
|
4-Infrastructure/shim/offload_receipts/
|
||||||
|
4-Infrastructure/shim/parallel_metaprobe_runs/
|
||||||
|
4-Infrastructure/shim/tang9k_pbacs_receipts/
|
||||||
|
5-Applications/linear-native-tauri/gen/
|
||||||
|
|
||||||
|
# Generated hardware probe products.
|
||||||
|
4-Infrastructure/hardware/batch_results/
|
||||||
|
4-Infrastructure/hardware/*_receipt.json
|
||||||
|
4-Infrastructure/hardware/*.png
|
||||||
|
4-Infrastructure/hardware/*.pdf
|
||||||
|
4-Infrastructure/hardware/metamanifold_prover.json
|
||||||
|
|
||||||
|
# Local documentation exports and downloaded references.
|
||||||
|
6-Documentation/chat-log-dumps/
|
||||||
|
6-Documentation/docs/reference-videos/
|
||||||
|
6-Documentation/docs/x86_64_specs/*.pdf
|
||||||
|
6-Documentation/docs/x86_64_specs/*.txt
|
||||||
|
6-Documentation/reports/jupyter-books/
|
||||||
|
6-Documentation/reports/typst/*.pdf
|
||||||
|
5-Applications/text-to-cad/models/.*/
|
||||||
|
|
||||||
# Kernel module build artifacts
|
# Kernel module build artifacts
|
||||||
*.ko
|
*.ko
|
||||||
*.mod
|
*.mod
|
||||||
|
|
|
||||||
334
5-Applications/scripts/adaptive_research_analysis.py
Normal file
334
5-Applications/scripts/adaptive_research_analysis.py
Normal file
|
|
@ -0,0 +1,334 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# /// script
|
||||||
|
# requires-python = ">=3.10"
|
||||||
|
# dependencies = ["requests", "rich"]
|
||||||
|
# ///
|
||||||
|
"""
|
||||||
|
Adaptive Research Stack Analyzer
|
||||||
|
Uses Ollama Cloud API to run a three-pass analysis:
|
||||||
|
1. Summarize - distill key ideas from core documents
|
||||||
|
2. Cross-link - find connections across domains
|
||||||
|
3. Critique - identify gaps, weak claims, missing proofs
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
uv run scripts/adaptive_research_analysis.py
|
||||||
|
uv run scripts/adaptive_research_analysis.py --model gemma3:12b --out /tmp/analysis.md
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import datetime
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import textwrap
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from rich.console import Console
|
||||||
|
from rich.markdown import Markdown
|
||||||
|
from rich.panel import Panel
|
||||||
|
from rich.progress import Progress, SpinnerColumn, TextColumn
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Config
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
RESEARCH_ROOT = Path("/home/allaun/Documents/Research Stack")
|
||||||
|
API_BASE = "https://ollama.com/v1"
|
||||||
|
API_KEY = os.environ.get("OLLAMA_API_KEY", "")
|
||||||
|
# Model priority: cogito (Cognition 671B) → qwen3-next (80B) → gemma4 (31B) → deepseek-v4-flash
|
||||||
|
DEFAULT_MODEL = "cogito-2.1:671b"
|
||||||
|
FALLBACK_CHAIN = ["qwen3-next:80b", "gemma4:31b", "deepseek-v4-flash"]
|
||||||
|
|
||||||
|
# Key documents to feed into the analysis (relative to RESEARCH_ROOT)
|
||||||
|
CORE_DOCS = [
|
||||||
|
"README.md",
|
||||||
|
"CONCEPTS.md",
|
||||||
|
"ARCHITECTURE.md",
|
||||||
|
"SIGNAL_THEORY_COMPENDIUM.md",
|
||||||
|
"6-Documentation/EXPLANATION_FOR_HUMANS.md",
|
||||||
|
"6-Documentation/MATH_CORE.md",
|
||||||
|
"6-Documentation/VISION_NORTH_STAR.md",
|
||||||
|
"6-Documentation/GLOSSARY.md",
|
||||||
|
"6-Documentation/FIRST_PRINCIPLES_DAG.md",
|
||||||
|
"6-Documentation/FIELD_EQUATION_COMPARISON.md",
|
||||||
|
"6-Documentation/docs/SKEPTICISM_GRADIENT_REASSESSMENT_2026-04-29.md",
|
||||||
|
"6-Documentation/docs/CLAIM_STATE_AUDIT_2026-05-05.md",
|
||||||
|
"6-Documentation/docs/IMPLEMENTATION_ATTACK_ANALYSIS.md",
|
||||||
|
"6-Documentation/docs/ENE_RESEARCH_TOPIC_CANDIDATES.md",
|
||||||
|
"6-Documentation/docs/OTOM_V1_PAPER_STRUCTURE_AND_NEXT_GEN_SIMULATOR.md",
|
||||||
|
"6-Documentation/docs/stack_solidification_staging_manifest_2026-05-10.md",
|
||||||
|
"6-Documentation/docs/cross_domain_adaptation_numeric_review.md",
|
||||||
|
"6-Documentation/docs/BAD_MATH_CLEANUP_REPORT.md",
|
||||||
|
]
|
||||||
|
|
||||||
|
DOMAIN_DIRS = {
|
||||||
|
"Core Formalism (Lean)": "0-Core-Formalism",
|
||||||
|
"Distributed Systems": "1-Distributed-Systems",
|
||||||
|
"Search Space": "2-Search-Space",
|
||||||
|
"Mathematical Models": "3-Mathematical-Models",
|
||||||
|
"Infrastructure / FPGA": "4-Infrastructure",
|
||||||
|
"Applications": "5-Applications",
|
||||||
|
"Documentation": "6-Documentation/docs",
|
||||||
|
}
|
||||||
|
|
||||||
|
MAX_CHARS_PER_DOC = 8_000 # truncate individual docs (DeepSeek handles large context)
|
||||||
|
MAX_CONTEXT_CHARS = 120_000 # total context fed per LLM call
|
||||||
|
|
||||||
|
console = Console()
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Helpers
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def load_doc(path: Path, max_chars: int = MAX_CHARS_PER_DOC) -> str:
|
||||||
|
try:
|
||||||
|
text = path.read_text(errors="replace")
|
||||||
|
if len(text) > max_chars:
|
||||||
|
text = text[:max_chars] + f"\n\n[... truncated at {max_chars} chars ...]"
|
||||||
|
return text
|
||||||
|
except Exception as e:
|
||||||
|
return f"[Could not read {path}: {e}]"
|
||||||
|
|
||||||
|
|
||||||
|
def gather_context() -> str:
|
||||||
|
"""Load core docs and first-file samples from each domain directory."""
|
||||||
|
parts = []
|
||||||
|
|
||||||
|
# Core documents
|
||||||
|
for rel in CORE_DOCS:
|
||||||
|
p = RESEARCH_ROOT / rel
|
||||||
|
if p.exists():
|
||||||
|
parts.append(f"\n\n---\n## FILE: {rel}\n\n{load_doc(p)}")
|
||||||
|
|
||||||
|
# Domain directory samples — grab up to 3 .md files per domain
|
||||||
|
for domain, rel_dir in DOMAIN_DIRS.items():
|
||||||
|
d = RESEARCH_ROOT / rel_dir
|
||||||
|
if not d.is_dir():
|
||||||
|
continue
|
||||||
|
md_files = sorted(d.glob("*.md"))[:3]
|
||||||
|
for mdf in md_files:
|
||||||
|
rel_path = mdf.relative_to(RESEARCH_ROOT)
|
||||||
|
parts.append(f"\n\n---\n## FILE [{domain}]: {rel_path}\n\n{load_doc(mdf, 3000)}")
|
||||||
|
|
||||||
|
combined = "\n".join(parts)
|
||||||
|
if len(combined) > MAX_CONTEXT_CHARS:
|
||||||
|
combined = combined[:MAX_CONTEXT_CHARS] + "\n\n[... context truncated ...]"
|
||||||
|
return combined
|
||||||
|
|
||||||
|
|
||||||
|
def chat(model: str, system: str, user: str, label: str, retries: int = 3) -> str:
|
||||||
|
"""Call Ollama Cloud chat completions endpoint with retry + fallback."""
|
||||||
|
import time
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Authorization": f"Bearer {API_KEY}",
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
|
||||||
|
models_to_try = [model] + [m for m in FALLBACK_CHAIN if m != model]
|
||||||
|
|
||||||
|
for attempt_model in models_to_try:
|
||||||
|
payload = {
|
||||||
|
"model": attempt_model,
|
||||||
|
"messages": [
|
||||||
|
{"role": "system", "content": system},
|
||||||
|
{"role": "user", "content": user},
|
||||||
|
],
|
||||||
|
"stream": False,
|
||||||
|
"options": {"temperature": 0.3, "num_predict": 8192},
|
||||||
|
}
|
||||||
|
for attempt in range(1, retries + 1):
|
||||||
|
with Progress(
|
||||||
|
SpinnerColumn(),
|
||||||
|
TextColumn(f"[bold cyan]{label}[/bold cyan] (model: {attempt_model}, attempt {attempt}/{retries}) ..."),
|
||||||
|
transient=True,
|
||||||
|
console=console,
|
||||||
|
) as progress:
|
||||||
|
progress.add_task("", total=None)
|
||||||
|
try:
|
||||||
|
resp = requests.post(
|
||||||
|
f"{API_BASE}/chat/completions",
|
||||||
|
headers=headers,
|
||||||
|
json=payload,
|
||||||
|
timeout=600,
|
||||||
|
)
|
||||||
|
except requests.exceptions.Timeout:
|
||||||
|
console.print(f"[yellow]Timeout on attempt {attempt}, retrying...[/yellow]")
|
||||||
|
time.sleep(5 * attempt)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if resp.status_code == 200:
|
||||||
|
data = resp.json()
|
||||||
|
content = data["choices"][0]["message"]["content"]
|
||||||
|
# Strip <think>...</think> reasoning blocks if present
|
||||||
|
import re
|
||||||
|
content = re.sub(r"<think>.*?</think>", "", content, flags=re.DOTALL).strip()
|
||||||
|
return content
|
||||||
|
|
||||||
|
error_body = resp.text[:300]
|
||||||
|
if "overloaded" in error_body.lower() or resp.status_code in (503, 429):
|
||||||
|
wait = 10 * attempt
|
||||||
|
console.print(f"[yellow]Server overloaded (attempt {attempt}), waiting {wait}s...[/yellow]")
|
||||||
|
time.sleep(wait)
|
||||||
|
elif resp.status_code == 500:
|
||||||
|
console.print(f"[yellow]500 error with {attempt_model}, trying next model...[/yellow]")
|
||||||
|
break # try fallback model
|
||||||
|
else:
|
||||||
|
console.print(f"[red]API error {resp.status_code}:[/red] {error_body}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
console.print(f"[yellow]Exhausted retries for {attempt_model}, trying fallback...[/yellow]")
|
||||||
|
|
||||||
|
console.print("[red]All models failed. Aborting.[/red]")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Analysis passes
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SYSTEM_BASE = """\
|
||||||
|
You are an expert research analyst reviewing a cutting-edge research stack called OTOM \
|
||||||
|
(One-Time Operations on Manifolds / Ultra-low-power zero-decimal data routing). \
|
||||||
|
The stack spans Lean 4 formal proofs, FPGA hardware, distributed systems, genomics, \
|
||||||
|
astrophysics, signal theory, and compression mathematics. \
|
||||||
|
Be precise, technical, and honest. Do NOT hallucinate citations. \
|
||||||
|
When you are uncertain, say so explicitly.\
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def pass_summarize(model: str, context: str) -> str:
|
||||||
|
system = SYSTEM_BASE + """
|
||||||
|
|
||||||
|
Your task: SUMMARIZE.
|
||||||
|
Produce a structured executive summary of this research stack covering:
|
||||||
|
1. Core thesis and central claims
|
||||||
|
2. Mathematical foundations (key equations, structures, proof techniques)
|
||||||
|
3. Hardware targets and implementation status
|
||||||
|
4. Applied domains (compression, genomics, astrophysics, etc.)
|
||||||
|
5. Current maturity level — what is proven vs speculative
|
||||||
|
Keep each section under 250 words. Use markdown headers.
|
||||||
|
"""
|
||||||
|
user = f"Here is the research stack content:\n\n{context}\n\nProduce the structured summary now."
|
||||||
|
return chat(model, system, user, "Pass 1: Summarize")
|
||||||
|
|
||||||
|
|
||||||
|
def pass_crosslink(model: str, context: str, summary: str) -> str:
|
||||||
|
system = SYSTEM_BASE + """
|
||||||
|
|
||||||
|
Your task: CROSS-DOMAIN LINKING.
|
||||||
|
Given the research content and the summary already produced, identify:
|
||||||
|
1. Non-obvious connections between domains (e.g. genomics ↔ topology, signal theory ↔ FPGA routing)
|
||||||
|
2. Concepts that appear in multiple domains under different names (unification opportunities)
|
||||||
|
3. Mathematical structures that bridge multiple layers of the stack
|
||||||
|
4. Any surprising overlaps with known external research (mention without fabricating citations)
|
||||||
|
Format as a markdown table + narrative explanation for each link found.
|
||||||
|
"""
|
||||||
|
user = f"Summary:\n{summary}\n\n---\nFull context:\n{context}\n\nIdentify cross-domain links now."
|
||||||
|
return chat(model, system, user, "Pass 2: Cross-link")
|
||||||
|
|
||||||
|
|
||||||
|
def pass_critique(model: str, context: str, summary: str) -> str:
|
||||||
|
system = SYSTEM_BASE + """
|
||||||
|
|
||||||
|
Your task: CRITIQUE AND GAP ANALYSIS.
|
||||||
|
Be rigorous and honest. Identify:
|
||||||
|
1. Claims that lack formal proof or empirical validation — flag each clearly
|
||||||
|
2. Mathematical steps that appear hand-wavy or unjustified
|
||||||
|
3. Research gaps: important questions the stack does not yet address
|
||||||
|
4. Risks: places where the stack's assumptions could break down
|
||||||
|
5. Recommended next experiments or proof targets
|
||||||
|
Be constructive but unflinching. A weak critique is useless.
|
||||||
|
Format with severity tags: [CRITICAL], [MODERATE], [MINOR].
|
||||||
|
"""
|
||||||
|
user = f"Summary:\n{summary}\n\n---\nFull context:\n{context}\n\nDeliver the critique now."
|
||||||
|
return chat(model, system, user, "Pass 3: Critique")
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Main
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="Adaptive Research Stack Analyzer")
|
||||||
|
parser.add_argument("--model", default=DEFAULT_MODEL,
|
||||||
|
help=f"Ollama Cloud model to use (default: {DEFAULT_MODEL}, fallback chain: {FALLBACK_CHAIN})")
|
||||||
|
parser.add_argument("--out", default=None,
|
||||||
|
help="Output markdown file path (default: auto-named in Research Stack)")
|
||||||
|
parser.add_argument("--list-models", action="store_true",
|
||||||
|
help="List available Ollama Cloud models and exit")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if not API_KEY:
|
||||||
|
console.print("[red]Set OLLAMA_API_KEY before calling the Ollama Cloud API.[/red]")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if args.list_models:
|
||||||
|
resp = requests.get(
|
||||||
|
"https://ollama.com/api/tags",
|
||||||
|
headers={"Authorization": f"Bearer {API_KEY}"},
|
||||||
|
timeout=30,
|
||||||
|
)
|
||||||
|
models = [m["name"] for m in resp.json().get("models", [])]
|
||||||
|
console.print("\n".join(sorted(models)))
|
||||||
|
return
|
||||||
|
|
||||||
|
console.rule("[bold green]Adaptive Research Stack Analyzer[/bold green]")
|
||||||
|
console.print(f"Model: [bold]{args.model}[/bold] Root: {RESEARCH_ROOT}\n")
|
||||||
|
|
||||||
|
# --- Gather context
|
||||||
|
console.print("[dim]Gathering research documents...[/dim]")
|
||||||
|
context = gather_context()
|
||||||
|
char_count = len(context)
|
||||||
|
console.print(f"[dim]Context: {char_count:,} chars across core docs + domain samples[/dim]\n")
|
||||||
|
|
||||||
|
# --- Three passes
|
||||||
|
summary = pass_summarize(args.model, context)
|
||||||
|
crosslink = pass_crosslink(args.model, context, summary)
|
||||||
|
critique = pass_critique(args.model, context, summary)
|
||||||
|
|
||||||
|
# --- Assemble report
|
||||||
|
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
|
||||||
|
report = f"""# Adaptive Research Analysis Report
|
||||||
|
*Generated: {timestamp} | Model: {args.model}*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pass 1 — Executive Summary
|
||||||
|
|
||||||
|
{summary}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pass 2 — Cross-Domain Links
|
||||||
|
|
||||||
|
{crosslink}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pass 3 — Critique & Gap Analysis
|
||||||
|
|
||||||
|
{critique}
|
||||||
|
|
||||||
|
---
|
||||||
|
*Analysis performed by `scripts/adaptive_research_analysis.py` using Ollama Cloud API.*
|
||||||
|
"""
|
||||||
|
|
||||||
|
# --- Output
|
||||||
|
if args.out:
|
||||||
|
out_path = Path(args.out)
|
||||||
|
else:
|
||||||
|
date_str = datetime.datetime.now().strftime("%Y-%m-%d")
|
||||||
|
out_path = RESEARCH_ROOT / "6-Documentation" / "docs" / "reports" / f"adaptive_analysis_{date_str}.md"
|
||||||
|
out_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
out_path.write_text(report)
|
||||||
|
|
||||||
|
console.rule("[bold green]Analysis Complete[/bold green]")
|
||||||
|
console.print(f"\nReport saved to: [bold]{out_path}[/bold]\n")
|
||||||
|
console.print(Markdown(report[:6000] + ("\n\n*[report truncated for display — see file for full output]*" if len(report) > 6000 else "")))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
342
5-Applications/scripts/eigengate_paradigm_analysis.py
Normal file
342
5-Applications/scripts/eigengate_paradigm_analysis.py
Normal file
|
|
@ -0,0 +1,342 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# /// script
|
||||||
|
# requires-python = ">=3.10"
|
||||||
|
# dependencies = ["requests", "rich"]
|
||||||
|
# ///
|
||||||
|
"""
|
||||||
|
EigenGate Paradigm Analysis
|
||||||
|
Re-runs the three-pass adaptive analysis (summarize / cross-link / critique)
|
||||||
|
with the EigenGate as the central lens.
|
||||||
|
|
||||||
|
Context loaded:
|
||||||
|
- Kernel/EigenGate.lean + GateChain.lean (the new paradigm)
|
||||||
|
- HCMMR/Core.lean + Bridge.lean + Manifest.lean (the old Gate typeclass)
|
||||||
|
- HCMMR/Laws/ (14, 15, 15E, 16, 17, 18)
|
||||||
|
- HCMMR/Kernels/ (RecamanFieldStep, FAMMScarMemory, PrimeGearCache, SNRAnomalyDetector)
|
||||||
|
- HCMMR/v0_2_Roadmap.md
|
||||||
|
- Core/ layer (FoldedPointManifold, UnderverseZeroLayer, QuantumFoamBoundary,
|
||||||
|
S3CProjectedGeodesicResolution, PathEpigeneticManifold)
|
||||||
|
- FAMM.lean, ReceiptCore.lean, FixedPoint.lean (substrate)
|
||||||
|
|
||||||
|
The three passes ask:
|
||||||
|
1. SUMMARIZE — what does the EigenGate paradigm actually unify?
|
||||||
|
2. CROSS-LINK — where does ∥G·s − s∥ ≤ τ naturally appear across all kernels/laws?
|
||||||
|
3. CRITIQUE — what is still hand-wavy, what must be proven, what is the migration plan?
|
||||||
|
"""
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from rich.console import Console
|
||||||
|
from rich.markdown import Markdown
|
||||||
|
from rich.progress import Progress, SpinnerColumn, TextColumn
|
||||||
|
|
||||||
|
RESEARCH_ROOT = Path("/home/allaun/Documents/Research Stack")
|
||||||
|
LEAN_ROOT = RESEARCH_ROOT / "0-Core-Formalism/lean/Semantics/Semantics"
|
||||||
|
API_BASE = "https://ollama.com/v1"
|
||||||
|
API_KEY = os.environ.get("OLLAMA_API_KEY", "")
|
||||||
|
DEFAULT_MODEL = "cogito-2.1:671b"
|
||||||
|
FALLBACK_CHAIN = ["qwen3-next:80b", "gemma4:31b", "deepseek-v4-flash"]
|
||||||
|
|
||||||
|
MAX_PER_FILE = 10_000 # chars per lean file (they're dense)
|
||||||
|
MAX_CONTEXT = 110_000 # total context chars
|
||||||
|
|
||||||
|
console = Console()
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Files to load — ordered by conceptual priority
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
LEAN_FILES = [
|
||||||
|
# ── New paradigm kernel ──────────────────────────────────────────────
|
||||||
|
"Kernel/EigenGate.lean",
|
||||||
|
"Kernel/GateChain.lean",
|
||||||
|
|
||||||
|
# ── Old Gate typeclass (what needs migrating) ─────────────────────
|
||||||
|
"HCMMR/Core.lean",
|
||||||
|
"HCMMR/Bridge.lean",
|
||||||
|
"HCMMR/Manifest.lean",
|
||||||
|
|
||||||
|
# ── Laws (old Gate pattern) ──────────────────────────────────────────
|
||||||
|
"HCMMR/Laws/Law14_Motion.lean",
|
||||||
|
"HCMMR/Laws/Law15_Field.lean",
|
||||||
|
"HCMMR/Laws/Law15E_SignalDetection.lean",
|
||||||
|
"HCMMR/Laws/Law16_Entropy.lean",
|
||||||
|
"HCMMR/Laws/Law17_Observer.lean",
|
||||||
|
"HCMMR/Laws/Law18_Constants.lean",
|
||||||
|
|
||||||
|
# ── Kernels ──────────────────────────────────────────────────────────
|
||||||
|
"HCMMR/Kernels/RecamanFieldStep.lean",
|
||||||
|
"HCMMR/Kernels/FAMMScarMemory.lean",
|
||||||
|
"HCMMR/Kernels/PrimeGearCache.lean",
|
||||||
|
"HCMMR/Kernels/SNRAnomalyDetector.lean",
|
||||||
|
|
||||||
|
# ── Core substrate ───────────────────────────────────────────────────
|
||||||
|
"Core/FoldedPointManifold.lean",
|
||||||
|
"Core/UnderverseZeroLayer.lean",
|
||||||
|
"Core/QuantumFoamBoundary.lean",
|
||||||
|
"Core/S3CProjectedGeodesicResolution.lean",
|
||||||
|
"Core/PathEpigeneticManifold.lean",
|
||||||
|
]
|
||||||
|
|
||||||
|
EXTRA_DOCS = [
|
||||||
|
# Roadmap and substrate prose
|
||||||
|
"HCMMR/v0_2_Roadmap.md",
|
||||||
|
"0-Core-Formalism/lean/Semantics/Semantics/FAMM.lean",
|
||||||
|
]
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Helpers
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def load(path: Path, max_chars: int = MAX_PER_FILE) -> str:
|
||||||
|
try:
|
||||||
|
text = path.read_text(errors="replace")
|
||||||
|
if len(text) > max_chars:
|
||||||
|
text = text[:max_chars] + f"\n-- [truncated at {max_chars} chars]"
|
||||||
|
return text
|
||||||
|
except Exception as e:
|
||||||
|
return f"-- [could not read {path}: {e}]"
|
||||||
|
|
||||||
|
|
||||||
|
def gather_context() -> str:
|
||||||
|
parts = []
|
||||||
|
for rel in LEAN_FILES:
|
||||||
|
p = LEAN_ROOT / rel
|
||||||
|
label = f"LEAN: {rel}"
|
||||||
|
parts.append(f"\n\n---\n## {label}\n\n```lean\n{load(p)}\n```")
|
||||||
|
|
||||||
|
for rel in EXTRA_DOCS:
|
||||||
|
p = RESEARCH_ROOT / rel
|
||||||
|
label = f"DOC: {rel}"
|
||||||
|
parts.append(f"\n\n---\n## {label}\n\n{load(p, 6000)}")
|
||||||
|
|
||||||
|
combined = "\n".join(parts)
|
||||||
|
if len(combined) > MAX_CONTEXT:
|
||||||
|
combined = combined[:MAX_CONTEXT] + "\n\n-- [context truncated]"
|
||||||
|
return combined
|
||||||
|
|
||||||
|
|
||||||
|
def chat(model: str, system: str, user: str, label: str, retries: int = 3) -> str:
|
||||||
|
headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
|
||||||
|
models_to_try = [model] + [m for m in FALLBACK_CHAIN if m != model]
|
||||||
|
|
||||||
|
for attempt_model in models_to_try:
|
||||||
|
payload = {
|
||||||
|
"model": attempt_model,
|
||||||
|
"messages": [
|
||||||
|
{"role": "system", "content": system},
|
||||||
|
{"role": "user", "content": user},
|
||||||
|
],
|
||||||
|
"stream": False,
|
||||||
|
"options": {"temperature": 0.2, "num_predict": 8192},
|
||||||
|
}
|
||||||
|
for attempt in range(1, retries + 1):
|
||||||
|
with Progress(SpinnerColumn(),
|
||||||
|
TextColumn(f"[bold cyan]{label}[/bold cyan] ({attempt_model}, try {attempt}) ..."),
|
||||||
|
transient=True, console=console) as p:
|
||||||
|
p.add_task("", total=None)
|
||||||
|
try:
|
||||||
|
resp = requests.post(f"{API_BASE}/chat/completions",
|
||||||
|
headers=headers, json=payload, timeout=600)
|
||||||
|
except requests.exceptions.Timeout:
|
||||||
|
console.print(f"[yellow]Timeout, retrying...[/yellow]")
|
||||||
|
time.sleep(5 * attempt)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if resp.status_code == 200:
|
||||||
|
content = resp.json()["choices"][0]["message"]["content"]
|
||||||
|
content = re.sub(r"<think>.*?</think>", "", content, flags=re.DOTALL).strip()
|
||||||
|
return content
|
||||||
|
|
||||||
|
body = resp.text[:300]
|
||||||
|
if "overloaded" in body.lower() or resp.status_code in (429, 503):
|
||||||
|
wait = 12 * attempt
|
||||||
|
console.print(f"[yellow]Overloaded, waiting {wait}s...[/yellow]")
|
||||||
|
time.sleep(wait)
|
||||||
|
elif resp.status_code == 500:
|
||||||
|
console.print(f"[yellow]500 on {attempt_model}, trying fallback...[/yellow]")
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
console.print(f"[red]API error {resp.status_code}:[/red] {body}")
|
||||||
|
sys.exit(1)
|
||||||
|
console.print(f"[yellow]Exhausted retries for {attempt_model}[/yellow]")
|
||||||
|
|
||||||
|
console.print("[red]All models failed.[/red]")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# System prompt — shared across all three passes
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
SYSTEM = """\
|
||||||
|
You are an expert in formal verification (Lean 4), type theory, and physics-informed \
|
||||||
|
computation. You are reviewing the HCMMR (Hyper-Coherent Morphic Meta-Recursion) \
|
||||||
|
research stack on its `distilled` branch.
|
||||||
|
|
||||||
|
The stack is undergoing a PARADIGM SHIFT. The old system used a flat `Gate` struct \
|
||||||
|
(name, required, score, verdict). The new paradigm is the `Eigengate`:
|
||||||
|
|
||||||
|
structure Eigengate (α : Type) where
|
||||||
|
operator : α → α -- G: the operator whose fixed points encode the law
|
||||||
|
residual : α → Q0_16 -- ∥G·s − s∥, normalised to [0,1)
|
||||||
|
threshold : Q0_16 -- τ: max admissible residual
|
||||||
|
|
||||||
|
The central doctrine: EVERY physical law, routing decision, and compression check \
|
||||||
|
is an eigenstate condition ∥G·s − s∥ ≤ τ. The full physical universe is the \
|
||||||
|
intersection of λ=1 eigenspaces for all required gate operators simultaneously.
|
||||||
|
|
||||||
|
The migration is INCOMPLETE. EigenGate.lean and GateChain.lean exist but are not \
|
||||||
|
imported by anything. All Laws (14–18) still use the old Gate struct. The kernels \
|
||||||
|
(RecamanFieldStep, FAMMScarMemory, PrimeGearCache, SNRAnomalyDetector) also use old Gate. \
|
||||||
|
LawRecovery.lean (concrete eigengate constructors for each physical law) was never written.
|
||||||
|
|
||||||
|
Be precise, rigorous, and honest. Do not hallucinate. Flag uncertainty explicitly.\
|
||||||
|
"""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Pass 1 — Summarize what the EigenGate paradigm actually unifies
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
PASS1_SYS = SYSTEM + """
|
||||||
|
|
||||||
|
YOUR TASK: PARADIGM SUMMARY.
|
||||||
|
Given all the Lean source files, answer:
|
||||||
|
1. What does the Eigengate pattern (`∥G·s − s∥ ≤ τ`) actually unify across the stack?
|
||||||
|
List every law/kernel and state what G, s, and the residual would be in each case.
|
||||||
|
2. What is the relationship between the old `Gate` struct and `Eigengate`?
|
||||||
|
Are they isomorphic? Can one be mechanically derived from the other?
|
||||||
|
3. What does `Semantics.Kernel.EigenGate` currently prove that the old HCMMR/Core does not?
|
||||||
|
4. What is the correct `α` type for each of the six laws (14, 15K, 15A-D, 15E, 16, 17, 18)?
|
||||||
|
Be specific — what Lean type carries the state?
|
||||||
|
5. Where does the Recamán kernel fit in the eigengate picture?
|
||||||
|
What is G for a Recamán field step?
|
||||||
|
|
||||||
|
Use markdown headers per section. Be concrete — reference actual line numbers and
|
||||||
|
struct fields from the source files where relevant.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Pass 2 — Cross-link: where does ∥G·s − s∥ naturally appear already?
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
PASS2_SYS = SYSTEM + """
|
||||||
|
|
||||||
|
YOUR TASK: CROSS-DOMAIN EIGENGATE DETECTION.
|
||||||
|
Scan all the Lean files in the context. For each file/module, identify:
|
||||||
|
1. Any existing computation that already computes something of the form ∥G·s − s∥
|
||||||
|
(even if not named that way). What is G? What is s? What is the residual value?
|
||||||
|
2. Any existing `residual`, `score`, `epsilon`, or `delta` computation that could
|
||||||
|
directly become the `residual : α → Q0_16` field of an Eigengate.
|
||||||
|
3. Any existing operator/transform that maps a state to a new state — these are
|
||||||
|
candidate `operator : α → α` fields.
|
||||||
|
4. Places where the old Gate struct's `score` field is set to a formula (not just
|
||||||
|
a constant `Q16_16.one`) — these are the richest migration candidates.
|
||||||
|
|
||||||
|
Format as a table: | Module | Existing computation | Candidate G | Candidate residual | Migration difficulty |
|
||||||
|
Then give a prioritized migration order (easiest → hardest) with reasoning.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Pass 3 — Critique and concrete migration plan
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
PASS3_SYS = SYSTEM + """
|
||||||
|
|
||||||
|
YOUR TASK: CRITIQUE AND CONCRETE MIGRATION PLAN.
|
||||||
|
Be rigorous. Identify:
|
||||||
|
|
||||||
|
A) ARCHITECTURAL CRITIQUE
|
||||||
|
[CRITICAL/MODERATE/MINOR] — what is wrong or incomplete in the current design?
|
||||||
|
Pay special attention to:
|
||||||
|
- The type parameter `α` in `Eigengate (α : Type)` — is it flexible enough?
|
||||||
|
The Laws need different α types (TrajectoryPoint, KahlerState, MaxwellField, etc.)
|
||||||
|
Can a single GateChain hold gates over different α? If not, how must GateChain change?
|
||||||
|
- The `score` function `1/(1+r)` — is this the right proximity measure for all laws?
|
||||||
|
- FAMM's `expNeg` — if it's a stub, what breaks?
|
||||||
|
- PrimeGearCache's silent cache-miss (returns Q16_16.one with no receipt) — severity?
|
||||||
|
- RecamanFieldStep's untested gate-reject path — what scenario does this cover?
|
||||||
|
- SNRAnomalyDetector's dead `dopplerDrift` branch — is it needed?
|
||||||
|
|
||||||
|
B) CONCRETE MIGRATION PLAN
|
||||||
|
Write the exact 5-step plan to complete the paradigm migration:
|
||||||
|
Step 1: What to add to Semantics.lean (exact import lines)
|
||||||
|
Step 2: What LawRecovery.lean must contain (list each law's G, α, residual formula)
|
||||||
|
Step 3: Which kernels need a new `toEigengate` adapter function and what it looks like
|
||||||
|
Step 4: What new theorems are needed to prove the old Gate and new Eigengate are equivalent
|
||||||
|
Step 5: What the v0.2 build should look like when complete (job count, zero errors)
|
||||||
|
|
||||||
|
C) WHAT NOT TO DO
|
||||||
|
Flag any tempting-but-wrong approaches that the previous agent sessions considered
|
||||||
|
and should be avoided.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Main
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
def main():
|
||||||
|
if not API_KEY:
|
||||||
|
console.print("[red]Set OLLAMA_API_KEY before calling the Ollama Cloud API.[/red]")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
console.rule("[bold green]EigenGate Paradigm Analysis[/bold green]")
|
||||||
|
console.print(f"Model: [bold]{DEFAULT_MODEL}[/bold] Fallbacks: {FALLBACK_CHAIN}\n")
|
||||||
|
|
||||||
|
console.print("[dim]Loading Lean source files and docs...[/dim]")
|
||||||
|
context = gather_context()
|
||||||
|
console.print(f"[dim]Context: {len(context):,} chars[/dim]\n")
|
||||||
|
|
||||||
|
summary = chat(DEFAULT_MODEL, PASS1_SYS,
|
||||||
|
f"Lean source files:\n\n{context}\n\nProduce the paradigm summary.",
|
||||||
|
"Pass 1: Paradigm Summary")
|
||||||
|
|
||||||
|
crosslink = chat(DEFAULT_MODEL, PASS2_SYS,
|
||||||
|
f"Summary from Pass 1:\n{summary}\n\n---\nLean source files:\n\n{context}\n\nDetect eigengate patterns.",
|
||||||
|
"Pass 2: Cross-link Detection")
|
||||||
|
|
||||||
|
critique = chat(DEFAULT_MODEL, PASS3_SYS,
|
||||||
|
f"Summary:\n{summary}\n\nCross-links:\n{crosslink}\n\n---\nLean source files:\n\n{context}\n\nDeliver critique and migration plan.",
|
||||||
|
"Pass 3: Critique + Migration Plan")
|
||||||
|
|
||||||
|
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
|
||||||
|
report = f"""# EigenGate Paradigm Analysis
|
||||||
|
*Generated: {timestamp} | Model: {DEFAULT_MODEL}*
|
||||||
|
|
||||||
|
> **Context:** This analysis re-examines the HCMMR `distilled` branch through the lens
|
||||||
|
> of the incomplete `Eigengate (α : Type)` paradigm migration. The old `Gate` struct
|
||||||
|
> (HCMMR/Core.lean) and the new `Eigengate` (Kernel/EigenGate.lean) coexist but are
|
||||||
|
> disconnected. This report determines what the migration requires and how to complete it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pass 1 — What the EigenGate Paradigm Unifies
|
||||||
|
|
||||||
|
{summary}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pass 2 — Where ∥G·s − s∥ Already Appears in the Codebase
|
||||||
|
|
||||||
|
{crosslink}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pass 3 — Critique & Concrete Migration Plan
|
||||||
|
|
||||||
|
{critique}
|
||||||
|
|
||||||
|
---
|
||||||
|
*Generated by `scripts/eigengate_paradigm_analysis.py`*
|
||||||
|
"""
|
||||||
|
|
||||||
|
date_str = datetime.datetime.now().strftime("%Y-%m-%d")
|
||||||
|
out = RESEARCH_ROOT / "6-Documentation" / "docs" / "reports" / f"eigengate_paradigm_analysis_{date_str}.md"
|
||||||
|
out.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
out.write_text(report)
|
||||||
|
|
||||||
|
console.rule("[bold green]Complete[/bold green]")
|
||||||
|
console.print(f"\nReport: [bold]{out}[/bold]\n")
|
||||||
|
console.print(Markdown(report[:8000] + ("\n\n*[truncated — see file]*" if len(report) > 8000 else "")))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Loading…
Add table
Reference in a new issue