From 98b870d14f6123e426f29546bc1edd0e89f538e0 Mon Sep 17 00:00:00 2001 From: Vasilev Dmitrii Date: Wed, 8 Jul 2026 07:39:52 +0000 Subject: [PATCH 1/7] docs(wave_ecosystem_2026-07-08): weakness audit + science baseline + epic + final report 11 weaknesses W-A..W-K across 7-repo ecosystem (t27/trinity/trios/trios-mcp/ 999-multibots-tma/999-multibots-telegraf/IGLA). 5 HIGH, 3 partial mitigation. Negative-first literature review with 68 citations. Epic decomposed into 8 ring-105-XXX branches. Toxic verdict + 3 forward roads + 3 collaboration variants. ASCII, banned-hype clean. Closes #1452 Refs #1453 --- .../wave_ecosystem_2026-07-08/CITATIONS.jsonl | 68 ++++ docs/wave_ecosystem_2026-07-08/EPIC.md | 333 ++++++++++++++++++ .../wave_ecosystem_2026-07-08/FINAL_REPORT.md | 213 +++++++++++ .../SCIENCE_BASELINE.md | 159 +++++++++ .../WEAKNESS_AUDIT.md | 233 ++++++++++++ 5 files changed, 1006 insertions(+) create mode 100644 docs/wave_ecosystem_2026-07-08/CITATIONS.jsonl create mode 100644 docs/wave_ecosystem_2026-07-08/EPIC.md create mode 100644 docs/wave_ecosystem_2026-07-08/FINAL_REPORT.md create mode 100644 docs/wave_ecosystem_2026-07-08/SCIENCE_BASELINE.md create mode 100644 docs/wave_ecosystem_2026-07-08/WEAKNESS_AUDIT.md diff --git a/docs/wave_ecosystem_2026-07-08/CITATIONS.jsonl b/docs/wave_ecosystem_2026-07-08/CITATIONS.jsonl new file mode 100644 index 000000000..9bf90d07d --- /dev/null +++ b/docs/wave_ecosystem_2026-07-08/CITATIONS.jsonl @@ -0,0 +1,68 @@ +{"title": "Xtext DSL Evolution Study (arXiv preprint)", "url": "https://arxiv.org/pdf/2501.19222.pdf", "year": 2025, "relevance": "Evidence Xtext ecosystem is still actively evolving/maintained in 2025, relevant to assessing viability of grammar-based DSL tooling as a .tri alternative/reference", "tags": ["spec-driven-codegen", "dsl-tooling", "xtext"]} +{"title": "JetBrains MPS 2025.3 Is Out", "url": "https://blog.jetbrains.com/mps/2025/12/mps-2025-3-is-out/", "year": 2025, "relevance": "Confirms JetBrains MPS (projectional language workbench) remains actively released through end of 2025, a live comparator for .tri's SSOT model-based approach", "tags": ["spec-driven-codegen", "dsl-tooling", "mps"]} +{"title": "Eclipse Xtext Release Notes", "url": "https://eclipse.dev/Xtext/releasenotes.html", "year": 2025, "relevance": "Primary source tracking Xtext's release cadence, used to verify the framework is not abandoned as a spec-driven codegen precedent", "tags": ["spec-driven-codegen", "dsl-tooling", "xtext"]} +{"title": "BNFC (BNF Converter) Documentation v2.9.6.1", "url": "https://bnfc.readthedocs.io/_/downloads/en/v2.9.6.1/pdf/", "year": 2025, "relevance": "Grammar-to-multi-language-frontend generator; closest historical analogue to .tri's single-grammar multi-target ambition, useful baseline for tooling maturity", "tags": ["spec-driven-codegen", "grammar-based-generation", "multi-target"]} +{"title": "Industrial LLM-Assisted DSL Case Study (BMW, arXiv)", "url": "https://arxiv.org/html/2604.24678", "year": 2026, "relevance": "Rare industrial case study combining DSLs with LLM fine-tuning at BMW, directly informs feasibility of LLM-assisted .tri code generation pipelines", "tags": ["spec-driven-codegen", "llm-fine-tuning", "industrial-case-study"]} +{"title": "Grammar Prompting for Domain-Specific Language Generation (NeurIPS 2023)", "url": "https://proceedings.neurips.cc/paper_files/paper/2023/file/cd40d0d65bfebb894ccc9ea822b47fa8-Paper-Conference.pdf", "year": 2023, "relevance": "Foundational technique for constraining LLM output to valid DSL grammars, applicable to enforcing .tri syntax validity during generation", "tags": ["spec-driven-codegen", "grammar-constrained-decoding", "llm"]} +{"title": "GRAMMAR-LLM: Grammar-Constrained Decoding for Structured NLP Tasks (ACL Findings 2025)", "url": "https://aclanthology.org/2025.findings-acl.177.pdf", "year": 2025, "relevance": "Extends grammar-constrained decoding research into 2025, relevant to ensuring generated Zig/Rust/Verilog/TypeScript outputs respect target grammars", "tags": ["spec-driven-codegen", "grammar-constrained-decoding", "llm"]} +{"title": "Advantages JetBrains MPS Has Over Xtext (StackOverflow)", "url": "https://stackoverflow.com/questions/63221766/advantages-jetbrains-mps-has-over-xtext", "year": 2024, "relevance": "Community comparison of the two dominant model-based DSL workbenches, useful context for positioning .tri's design choices", "tags": ["spec-driven-codegen", "dsl-tooling", "comparison"]} +{"title": "Verified Extraction from Coq to OCaml (PLDI 2024)", "url": "https://dl.acm.org/doi/pdf/10.1145/3656379", "year": 2024, "relevance": "State-of-the-art peer-reviewed verified-extraction pipeline; benchmark for what 'soundness-preserving' single-target extraction looks like versus .tri's unverified multi-target ambition", "tags": ["verified-extraction", "coq", "soundness"]} +{"title": "MetaCoq and Certified Extraction (JFLA 2024)", "url": "https://sozeau.gitlabpages.inria.fr/www/research/publications/MetaCoq_and_Certified_Extraction-JFLA24-310124.pdf", "year": 2024, "relevance": "Describes certified metaprogramming/extraction toolchain in Coq; illustrates the formal machinery required for genuinely verified single-source-of-truth code generation", "tags": ["verified-extraction", "coq", "soundness"]} +{"title": "coq-verified-extraction (GitHub repository)", "url": "https://github.com/yforster/coq-verified-extraction", "year": 2024, "relevance": "Working implementation of verified Coq extraction; concrete engineering reference for what a soundness-checked extraction pipeline requires", "tags": ["verified-extraction", "coq", "tooling"]} +{"title": "Rust-to-Lean Verification Pipeline with AI Provers (arXiv)", "url": "https://arxiv.org/html/2605.30106v1", "year": 2026, "relevance": "2026 work combining AI theorem proving with Rust/Lean verification, closest recent precedent for AI-assisted formal bridging between a spec language and a systems language like Rust", "tags": ["verified-extraction", "lean", "rust", "ai-provers"]} +{"title": "hax + Lean Formal Verification of Signal Protocol", "url": "https://positive-intentions.com/docs/technical/signal-protocol-formal-verification/hax-lean/", "year": 2025, "relevance": "Applied case of hax toolchain translating Rust into Lean for verification, a real-world multi-language formal bridge relevant to .tri-to-Rust verification ambitions", "tags": ["verified-extraction", "lean", "rust", "applied-case-study"]} +{"title": "Rocq (Coq) Extraction Report 2025", "url": "https://www.normalesup.org/~sdima/2025_extraction_report.pdf", "year": 2025, "relevance": "Recent technical report on the state of Coq/Rocq's extraction mechanism, useful for understanding current limitations of proof-assistant-based code extraction", "tags": ["verified-extraction", "coq", "state-of-the-art"]} +{"title": "CLEVER: Benchmark for Verified Code Generation (arXiv)", "url": "https://arxiv.org/abs/2505.13938", "year": 2025, "relevance": "Key negative-result benchmark: best LLMs solve only 1/161 verified-code-generation tasks, directly quantifying how far current AI is from reliable verified multi-target generation like .tri aims for", "tags": ["verified-extraction", "benchmark", "negative-result", "llm"]} +{"title": "AlphaVerus: Bootstrapping Formally Verified Code Generation (PMLR/ICML 2025)", "url": "https://proceedings.mlr.press/v267/aggarwal25a.html", "year": 2025, "relevance": "Recent ICML paper on self-improving verified code generation, most relevant academic precedent for iterative generate-verify-repair loops akin to PHI-LOOP", "tags": ["verified-extraction", "self-improvement", "phi-loop-precedent"]} +{"title": "HACL* Reading (MIT 6.5660, 2026 course readings)", "url": "https://css.csail.mit.edu/6.5660/2026/readings/hacl-star.pdf", "year": 2026, "relevance": "MIT graduate course still teaching HACL* in 2026 as the reference verified-crypto-to-multi-target (C/Rust/etc.) extraction case study, strongest precedent for one-SSOT multi-target verified generation", "tags": ["one-ssot", "multi-target", "hacl-star", "verified-extraction"]} +{"title": "HACL* (GitHub repository)", "url": "https://github.com/hacl-star/hacl-star", "year": 2025, "relevance": "Primary engineering artifact of the F*-to-C/Rust verified crypto library, the single strongest real-world one-SSOT multi-target precedent for .tri's ambitions", "tags": ["one-ssot", "multi-target", "hacl-star", "fstar"]} +{"title": "Low*: A Low-Level Language for Verified C Extraction (arXiv)", "url": "https://arxiv.org/pdf/1703.00053.pdf", "year": 2017, "relevance": "Foundational paper defining the Low* subset of F* used to extract verified low-level C code, theoretical basis for the semantic-gap-minimization approach relevant to .tri's Zig/Rust targets", "tags": ["one-ssot", "fstar", "semantic-gap", "theory"]} +{"title": "SAW (Software Analysis Workbench) Documentation, Galois", "url": "https://tools.galois.com/saw", "year": 2025, "relevance": "Cryptol-to-SAW verification toolchain documentation, a live industrial one-SSOT-to-multi-target-proof pipeline directly comparable to .tri's ambitions", "tags": ["one-ssot", "cryptol", "saw", "multi-target"]} +{"title": "Galois Releases SAW 1.5 and Cryptol 3.5.0", "url": "https://www.galois.com/articles/galois-releases-saw-1-5-and-cryptol-3-5-0", "year": 2026, "relevance": "Confirms active 2026 development of the Cryptol/SAW toolchain, evidence this verified-multi-target space remains a live research and product area", "tags": ["one-ssot", "cryptol", "saw", "active-development"]} +{"title": "AWS Formal Verification at Scale (NIST HTIS Workshop 2024)", "url": "https://www.nist.gov/system/files/documents/2024/06/11/01-ChapmanPHPLBK.pdf", "year": 2024, "relevance": "Industrial-scale formal verification (including Cryptol/SAW use) at AWS, evidence of production viability for one-SSOT verified pipelines at scale", "tags": ["one-ssot", "cryptol", "saw", "industrial-case-study"]} +{"title": "High-Performance Computing with Much Less Code (MIT News, Exo 2)", "url": "https://news.mit.edu/2025/high-performance-computing-with-much-less-code-0313", "year": 2025, "relevance": "MIT News coverage of Exo 2, a DSL generating high-performance code for multiple hardware backends from one spec, directly analogous to .tri's multi-target goal", "tags": ["one-ssot", "multi-target", "exo", "hardware-backends"]} +{"title": "Exo 2: Growing a Scheduling Language (arXiv)", "url": "https://arxiv.org/pdf/2411.07211", "year": 2024, "relevance": "Primary technical paper for Exo 2's scheduling-language approach to multi-target high-performance code generation, a key architectural reference for .tri's backend design", "tags": ["one-ssot", "multi-target", "exo", "scheduling-language"]} +{"title": "ExoBLAS (GitHub repository)", "url": "https://github.com/exo-lang/ExoBLAS", "year": 2025, "relevance": "Concrete library built using Exo demonstrating multi-target BLAS kernel generation from one spec, a working proof point for one-SSOT-to-hardware code generation", "tags": ["one-ssot", "multi-target", "exo", "applied-library"]} +{"title": "Exo: Exocompilation for Productive Programming of Hardware Accelerators (arXiv)", "url": "https://arxiv.org/abs/2310.17408v2", "year": 2023, "relevance": "Original Exo paper describing exocompilation methodology for targeting diverse hardware accelerators from a single high-level spec", "tags": ["one-ssot", "multi-target", "exo", "hardware-accelerators"]} +{"title": "Automating RTL Design in Mid-2025 (Medium)", "url": "https://medium.com/@platformaigpt/automating-rtl-design-in-mid-2025-0956859b870f", "year": 2025, "relevance": "Survey of Chisel/FIRRTL and LLM-assisted RTL generation trends, relevant to .tri's Verilog target and hardware-description-language automation landscape", "tags": ["one-ssot", "multi-target", "chisel-firrtl", "verilog", "rtl"]} +{"title": "FIRRTL: A Retargetable IR for RTL Design (ICCAD 2017)", "url": "http://albert-magyar.github.io/documents/firrtl-iccad17.pdf", "year": 2017, "relevance": "Foundational academic paper on FIRRTL as a retargetable hardware IR, the strongest existing precedent for a single hardware spec compiling to multiple RTL/Verilog targets", "tags": ["one-ssot", "multi-target", "firrtl", "verilog", "theory"]} +{"title": "Silver Oak: Coq-to-RISC-V and Coq-to-SystemVerilog Dual Extraction (talk video)", "url": "https://www.youtube.com/watch?v=07Z6zjBXQOU", "year": 2020, "relevance": "Rare and instructive negative-first example: a project attempting dual verified extraction from one Coq spec to both software (RISC-V) and hardware (SystemVerilog) targets, illustrating the difficulty .tri will face targeting Rust/Zig/Verilog/TypeScript simultaneously", "tags": ["one-ssot", "multi-target", "coq", "negative-result", "dual-extraction"]} +{"title": "Mechanizing Refinement Types (POPL 2024)", "url": "https://dl.acm.org/doi/10.1145/3632912", "year": 2024, "relevance": "Peer-reviewed formalization of refinement types, the theoretical machinery needed to define and check the 'semantic gap' between a .tri spec and its generated targets", "tags": ["one-ssot", "refinement-types", "semantic-gap", "theory"]} +{"title": "Voyager: An Open-Ended Embodied Agent with LLMs (TMLR 2024)", "url": "https://openreview.net/pdf/625b7da181479e7642abce270739da66290f0fa3.pdf", "year": 2024, "relevance": "Foundational paper on skill-library / episodic-memory agents that persist and reuse learned skills, direct precedent for .trinity/experience/ append-only skill-commit design", "tags": ["episodic-memory", "skill-library", "agentic-systems"]} +{"title": "MemGPT: Towards LLMs as Operating Systems (arXiv)", "url": "http://arxiv.org/pdf/2310.08560v2.pdf", "year": 2023, "relevance": "Introduces hierarchical memory management for LLM agents, a core architectural reference for designing persistent experience stores like .trinity/experience/", "tags": ["episodic-memory", "agentic-systems", "memory-architecture"]} +{"title": "MemGPT Project Page", "url": "https://research.memgpt.ai", "year": 2024, "relevance": "Primary project resource for MemGPT's memory-hierarchy approach, useful ongoing reference for implementation details relevant to agent memory design", "tags": ["episodic-memory", "agentic-systems", "memory-architecture"]} +{"title": "CAMEL Memory Module Documentation", "url": "https://docs.camel-ai.org/key_modules/memory", "year": 2025, "relevance": "Documents CAMEL's built-in agent memory abstraction, a live open-source reference implementation comparable to the proposed append-only JSONL experience log", "tags": ["episodic-memory", "agentic-systems", "camel"]} +{"title": "SWE-Exp: Experience-Driven Software Engineering Agents (arXiv)", "url": "https://arxiv.org/abs/2507.23361", "year": 2025, "relevance": "Reports 41.6% pass@1 on SWE-bench Verified using experience-driven memory, a directly comparable quantitative benchmark for evaluating whether .trinity/experience/ style memory improves autonomous coding performance", "tags": ["episodic-memory", "swe-bench", "quantitative-benchmark", "phi-loop-precedent"]} +{"title": "CTIM-Rover: When Does Agent Memory Help or Hurt? (ACL REALM Workshop 2025)", "url": "https://aclanthology.org/2025.realm-1.30.pdf", "year": 2025, "relevance": "Critical negative result showing episodic/task memory can degrade coding-agent performance in some configurations, essential caution for designing .trinity/experience/ to avoid similar failure modes", "tags": ["episodic-memory", "negative-result", "swe-agent"]} +{"title": "Memory-Aware Software Engineering Agents Survey (OpenReview 2026)", "url": "https://openreview.net/pdf/b9979c0cf1104397df7b4eab8c5e78a2481b953f.pdf", "year": 2026, "relevance": "Recent survey consolidating memory-augmented SE-agent literature through 2026, provides the state-of-the-art map for positioning .trinity/experience/ against existing approaches", "tags": ["episodic-memory", "survey", "swe-agent"]} +{"title": "MemoryAgentBench: Benchmarking Agent Memory Systems (arXiv)", "url": "https://arxiv.org/html/2507.05257v1", "year": 2025, "relevance": "Standardized benchmark for evaluating agent memory systems, a candidate evaluation framework for validating .trinity/experience/ design choices empirically", "tags": ["episodic-memory", "benchmark", "evaluation"]} +{"title": "Subtask-Level Memory for Agent Design (AgentPatterns.ai / arXiv:2602.21611)", "url": "https://agentpatterns.ai/agent-design/subtask-level-memory/", "year": 2026, "relevance": "Describes fine-grained subtask-level memory patterns, directly relevant to structuring .trinity/experience/ entries around discrete edit-gen-test-verdict cycles", "tags": ["episodic-memory", "agent-design", "phi-loop-precedent"]} +{"title": "Evolution of LLM Agent Memory Systems: A Survey (arXiv)", "url": "https://arxiv.org/abs/2605.06716", "year": 2026, "relevance": "2026 survey tracing the trajectory of agent memory research, useful for situating the append-only JSONL + skill-commit pattern within the broader field's evolution", "tags": ["episodic-memory", "survey", "agentic-systems"]} +{"title": "SWE-bench Verified Leaderboard (llm-stats.com)", "url": "https://llm-stats.com/benchmarks/swe-bench-verified", "year": 2026, "relevance": "Live-updated July 2026 leaderboard tracking top autonomous coding agent performance, the key quantitative benchmark for contextualizing any PHI-LOOP-style autonomous dev cycle claims", "tags": ["phi-loop-precedent", "swe-bench", "benchmark", "autonomous-agents"]} +{"title": "SWE-bench Pro Leaderboard (Morph)", "url": "https://www.morphllm.com/swe-bench-pro", "year": 2026, "relevance": "Harder successor benchmark to SWE-bench Verified, provides a more rigorous stress-test reference point for evaluating autonomous coding loop claims like PHI-LOOP", "tags": ["phi-loop-precedent", "swe-bench", "benchmark", "autonomous-agents"]} +{"title": "SWE-bench-Live", "url": "https://swe-bench-live.github.io", "year": 2026, "relevance": "Continuously refreshed live benchmark (63.0% best result as of mid-2026) that avoids benchmark contamination, important for judging realistic current ceiling of autonomous coding agents", "tags": ["phi-loop-precedent", "swe-bench", "benchmark", "autonomous-agents"]} +{"title": "Devin Annual Performance Review 2025 (Cognition)", "url": "https://cognition.com/blog/devin-annual-performance-review-2025", "year": 2025, "relevance": "First-party retrospective on Devin's autonomous software engineering performance over its first operational year, most direct real-world analogue to a PHI-LOOP-style continuous dev-cycle agent", "tags": ["phi-loop-precedent", "devin", "autonomous-agents", "industrial-case-study"]} +{"title": "Cognition's Devin: 73x ARR Growth Review", "url": "https://agentmarketcap.ai/blog/2026/04/06/cognition-devin-73x-arr-growth-autonomous-coding-agent-hypergrowth", "year": 2026, "relevance": "Business-growth evidence that autonomous coding agents like Devin are achieving commercial traction, contextualizing market validation for PHI-LOOP-style architectures", "tags": ["phi-loop-precedent", "devin", "autonomous-agents", "market-adoption"]} +{"title": "The Anthropic Economic Index", "url": "https://www.anthropic.com/news/the-anthropic-economic-index", "year": 2025, "relevance": "Anthropic's ongoing macro study of AI's economic/labor impact including software engineering task automation, background context for the role of orchestrator-style autonomous agents", "tags": ["phi-loop-precedent", "anthropic", "economic-impact"]} +{"title": "Anthropic Economic Index: June 2026 Report", "url": "https://www.anthropic.com/research/economic-index-june-2026-report", "year": 2026, "relevance": "Most recent (June 2026) Anthropic report addressing AI's software-engineering usage patterns, the closest available source to the 'Anthropic Software Engineering 2026 report' referenced for orchestrator-role framing", "tags": ["phi-loop-precedent", "anthropic", "orchestrator-role", "economic-impact"]} +{"title": "Claude Code Sub-Agents Documentation", "url": "https://code.claude.com/docs/en/sub-agents", "year": 2026, "relevance": "Official documentation for Claude Code's multi-agent/subagent architecture, the most directly comparable production system to a swarm-of-agents-with-shared-experience design", "tags": ["swarm-agents", "claude-code", "multi-agent-architecture"]} +{"title": "Aider Architect Mode Announcement", "url": "https://aider.chat/2024/09/26/architect.html", "year": 2024, "relevance": "Introduces the architect+editor two-role agent split achieving 85% on a SOTA benchmark, a proven lightweight pattern relevant to structuring .tri's orchestrator/executor swarm roles", "tags": ["swarm-agents", "aider", "architect-editor-pattern", "benchmark"]} +{"title": "CAMEL Framework", "url": "https://www.camel-ai.org/framework", "year": 2025, "relevance": "Multi-agent framework supporting role-playing societies of agents, a reference architecture for coordinating swarms of specialized coding agents with shared state", "tags": ["swarm-agents", "camel", "multi-agent-architecture"]} +{"title": "CAMEL-AI Introduction (OWL)", "url": "https://docs.camel-ai.org/get_started/introduction", "year": 2025, "relevance": "Introductory documentation for CAMEL's OWL multi-agent workflow system, additional detail on shared-context agent society design applicable to swarm-of-agents architectures", "tags": ["swarm-agents", "camel", "owl", "multi-agent-architecture"]} +{"title": "Coding Agents Survey (PKU Software Engineering Course Slides)", "url": "https://mechtaev.com/files/pku-04834580-softeng-25_26-coding_agents.pdf", "year": 2026, "relevance": "Academic survey of ~115 papers on software-engineering coding agents, provides a broad literature map for situating swarm-of-agents and autonomous-loop design choices", "tags": ["swarm-agents", "survey", "phi-loop-precedent", "autonomous-agents"]} +{"title": "StarCoder2 and The Stack v2: The Next Generation (arXiv)", "url": "https://arxiv.org/html/2402.19173v1", "year": 2024, "relevance": "Primary paper describing The Stack v2 training corpus construction methodology, the key reference for how to build and curate a multilingual code corpus at scale, relevant to constructing a .tri-target pair-corpus", "tags": ["training-datasets", "the-stack-v2", "corpus-construction"]} +{"title": "The Stack v2 Dataset (Hugging Face)", "url": "https://huggingface.co/datasets/bigcode/the-stack-v2", "year": 2024, "relevance": "Public dataset artifact of The Stack v2, useful as a scale/composition benchmark when evaluating whether a 30-100k token .tri pair-corpus is remotely sufficient for fine-tuning", "tags": ["training-datasets", "the-stack-v2", "corpus-scale"]} +{"title": "MultiPL-E: A Scalable and Extensible Approach to Benchmarking Neural Code Generation (IEEE TSE)", "url": "https://par.nsf.gov/biblio/10416465", "year": 2023, "relevance": "Peer-reviewed paper on multi-language code-generation benchmarking methodology, directly applicable to evaluating .tri's multi-target (Zig/Rust/Verilog/TypeScript) generation quality", "tags": ["training-datasets", "multipl-e", "multi-language-benchmark"]} +{"title": "MultiPL-E (GitHub repository)", "url": "https://github.com/nuprl/MultiPL-E", "year": 2025, "relevance": "Working implementation of the MultiPL-E benchmark suite, a reusable evaluation harness candidate for testing .tri-generated code across multiple target languages", "tags": ["training-datasets", "multipl-e", "evaluation-tooling"]} +{"title": "EvalPlus (GitHub repository)", "url": "https://github.com/evalplus/evalplus", "year": 2025, "relevance": "Rigorous test-augmentation framework behind HumanEval+/MBPP+, a methodology reference for building more reliable correctness tests for .tri-generated code", "tags": ["training-datasets", "evalplus", "evaluation-tooling"]} +{"title": "EvalPlus Leaderboard", "url": "https://evalplus.github.io/leaderboard.html", "year": 2026, "relevance": "Live leaderboard tracking model performance on HumanEval+/MBPP+, useful current baseline for code-generation quality expectations relevant to .tri's LLM-assisted pipeline", "tags": ["training-datasets", "evalplus", "benchmark", "leaderboard"]} +{"title": "No-Resource Programming Languages Study (arXiv)", "url": "https://arxiv.org/html/2606.16827v1", "year": 2026, "relevance": "Directly relevant 2026 study showing low-resource languages like Gleam (12%) and MoonBit (26%) achieve much lower pass@1 than mainstream languages, a critical data point for estimating feasibility of a low-resource .tri corpus of only 30-100k tokens", "tags": ["training-datasets", "low-resource-languages", "negative-result", "corpus-scale"]} +{"title": "RefineCode Dataset (Hugging Face, OpenCoder-LLM)", "url": "https://huggingface.co/datasets/OpenCoder-LLM/RefineCode-code-corpus-meta", "year": 2024, "relevance": "High-quality filtered code corpus metadata, illustrates the data-curation quality bar needed if a small .tri pair-corpus is to meaningfully influence fine-tuning outcomes", "tags": ["training-datasets", "corpus-construction", "data-quality"]} +{"title": "Position Paper: Programming Language Techniques for AI Code Generation (arXiv)", "url": "https://arxiv.org/abs/2507.09135", "year": 2025, "relevance": "Position paper arguing for applying formal PL techniques (types, semantics) to improve AI code generation reliability, directly supports the theoretical case for .tri's spec-first, type-checked approach", "tags": ["formal-metrics", "pl-theory", "position-paper"]} +{"title": "PyCaliper: Hardware Verification Infrastructure (UC Berkeley EECS Technical Report 2026-170)", "url": "https://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-170.html", "year": 2026, "relevance": "Berkeley thesis on hardware verification infrastructure, relevant reference for building semantic-gap and soundness metrics for .tri's Verilog hardware target", "tags": ["formal-metrics", "hardware-verification", "semantic-gap"]} +{"title": "Explicit Refinement Types (University of Cambridge)", "url": "https://www.cl.cam.ac.uk/~nk480/ert.pdf", "year": 2024, "relevance": "Technical paper on explicit refinement type systems, foundational theory for formally specifying and checking the semantic contract between .tri specs and generated code", "tags": ["formal-metrics", "refinement-types", "theory"]} +{"title": "Formal Methods and Co-Verification Techniques (CiteSeerX)", "url": "https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=edd08e4d6ba7539a781f68ac1bc641cdb8e17701", "year": 2023, "relevance": "Archived technical paper on hardware/software co-verification techniques, background reference for reasoning about semantic-gap metrics across heterogeneous Zig/Rust/Verilog/TypeScript targets", "tags": ["formal-metrics", "co-verification", "semantic-gap"]} +{"title": "Automated Test/Co-Verification Techniques (Portland State University)", "url": "http://web.cecs.pdx.edu/~xie/pubs/atcv.pdf", "year": 2023, "relevance": "Academic paper on automated co-verification methodology, additional grounding for cross-target correctness verification approaches relevant to .tri's multi-language outputs", "tags": ["formal-metrics", "co-verification", "testing"]} +{"title": "IEEE Computer Society Magazine Article on AI-Assisted Software Engineering (2025)", "url": "https://www.computer.org/csdl/magazine/co/2025/08/11104170/28MaS4fMgyk", "year": 2025, "relevance": "IEEE Computer magazine coverage of AI-assisted software engineering trends, general industry-context source supporting the maturity assessment of autonomous coding practices", "tags": ["phi-loop-precedent", "industry-context", "ai-swe"]} +{"title": "Silver Oak Hardware/Software Co-Verification Talk (video, alternate recording)", "url": "https://www.youtube.com/watch?v=2WolqhX5e80", "year": 2020, "relevance": "Additional recorded talk on the Silver Oak project's dual hardware/software verified extraction approach, reinforcing the negative-first precedent for multi-target verified generation difficulty", "tags": ["one-ssot", "multi-target", "negative-result", "dual-extraction"]} +{"title": "Autonomous Coding Agent Architecture Talk (video)", "url": "https://www.youtube.com/watch?v=UXA7SRArBj8", "year": 2025, "relevance": "Conference/community talk on autonomous coding agent architecture patterns, supplementary context for PHI-LOOP-style edit-test-verdict cycle design", "tags": ["phi-loop-precedent", "autonomous-agents", "architecture"]} diff --git a/docs/wave_ecosystem_2026-07-08/EPIC.md b/docs/wave_ecosystem_2026-07-08/EPIC.md new file mode 100644 index 000000000..540e174d1 --- /dev/null +++ b/docs/wave_ecosystem_2026-07-08/EPIC.md @@ -0,0 +1,333 @@ +# EPIC — Trinity Ecosystem → t27 Rewrite (Wave 2026-07-08) + +**Root repo:** `gHashTag/t27` (user decision 2026-07-08) +**Wave branch series:** `ring-105-XXX--` +**Base commit:** `4832ec6a` on `master` +**Constitutional law:** L1 > L2 > L3 > L4 > L5 > L6 > L7 > L8 (Asimov) +**Loop:** AEL v2.0 (OBSERVE → PLAN → DELEGATE → VERIFY → SYNTHESIZE → LEARN) +**Cycle:** edit spec → seal hash → gen → test → verdict → save experience → skill commit → git commit + +--- + +## Motivation (from user, verbatim, translated) + +> "Перепиши 7 репозиториев в спецификационный язык t27, объедини в одну экосистему в +> корне `gHashTag/t27`, сделай базу для обучения IGLA CODER/RACE, собери все связанные +> GitHub issues, создай эпик + weakness audit + научный research + декомпозированный +> план + реализация + отчёт + 3 варианта cooperation + сохрани скиллы." + +Rewrite prime rules from user: +- **NEVER write .zig/.rs directly** — always generate from `.tri`. +- **NO logic duplication between spec and code** — one source of truth. +- **.tri creation FIRST, generation LAST.** +- Use many todo items + subagents for parallelism. + +## Scope Lock (from Weakness Audit) + +This Wave delivers **pilots**, not full-repo rewrites. Six-eight `.tri` seeds, one codegen plan, one dataset v0.1 seed, one report, one PR. Everything else is Wave-2/3/4 (see §7 roadmap). + +## Ring numbering rationale + +`ring-104-rust` is the latest live ring on master (verified via `ls rings/ | tail`). This Wave opens **`ring-105-*`** namespace. All pilot branches follow `ring-105-XXX--` schema: + +| ring | branch | source repo | module | target codegen | LOC estimate | +|---|---|---|---|---|---| +| 105-000 | `ring-105-000-preflight-parse` | (meta) | preflight baseline | none (docs) | 50 | +| 105-001 | `ring-105-001-t27-experience-format` | t27 | experience.tri (PHI LOOP artefact schema) | none (spec only) | 120 | +| 105-002 | `ring-105-002-trinity-mozg-dna` | trinity | organism/mozg.tri + organism/dna.tri | zig | 200 (spec) → 500 (gen) | +| 105-003 | `ring-105-003-trios-git-orchestrator` | trios | orchestrator/git_bridge.tri | zig | 150 → 300 | +| 105-004 | `ring-105-004-trios-mcp-tool-registry` | trios-mcp | mcp/tool_registry.tri | rust | 180 → 400 | +| 105-005 | `ring-105-005-multibots-scene-schema` | 999-multibots-telegraf | multibots/scene_schema.tri (ANONYMISED, PUBLIC-SAFE) | typescript (DEFERRED to Wave-3) | 130 → 300 | +| 105-006 | `ring-105-006-multibots-rust-ring-runtime` | 999-multibots-rust | multibots/ring_runtime.tri (ANONYMISED) | rust | 160 → 350 | +| 105-007 | `ring-105-007-igla-coder-dataset-v01` | (meta) | dataset/igla-coder/v0.1/ manifest + decontam | none (dataset) | 100 | + +**Total pilots:** 8 branches, ~1090 LOC of `.tri` spec + ~1850 LOC of generated code + dataset manifest. + +**Note on ring-105-005 (999-multibots-telegraf):** the source is PRIVATE and includes payment surface + PII. The pilot `scene_schema.tri` describes only the **generic public-safe schema** (state machine types, transition invariants, message types) — NO real bot names, NO real tariffs, NO real user IDs. Kept in the public t27 repo because the schema itself carries no sensitive value. + +**Note on ring-105-006 (999-multibots-rust):** same anonymisation. Pilot describes the **Ring runtime state machine** at type level — no wallet keys, no seed phrases, no bot-token surface. + +--- + +## §1. Hard Rules (carried into every pilot PR) + +Sourced from `t27/AGENTS.md`, `t27/SOUL.md`, and `t27/CLAUDE.md`. + +1. **L1 TRACEABILITY** — every PR body has `Closes #` linking to an existing t27 issue (or a new issue we file first). +2. **L2 GENERATION** — no hand-edit under `gen/**` in any pilot PR. Any change in `gen/` MUST come from re-running codegen on updated spec. +3. **L3 PURITY** — ASCII-only, English identifiers, no Cyrillic. Applies to `.tri`, `.t27`, generated code, and Markdown docs under `docs/`, `specs/`, `architecture/`, `conformance/`. +4. **L4 TESTABILITY** — every `.tri` in a pilot has **≥3 invariants, ≥8 tests, ≥2 benchmarks** (matches existing template `specs/01-tri-lang-core.tri`). +5. **L5 IDENTITY** — where a pilot involves phi or Trinity math, use the tolerance-based IEEE f64 check (`abs(phi*phi + 1/phi*phi - 3) < 1e-15`), never bit-exact equality. +6. **L6 CEILING** — no pilot invents new numeric formats. Any numeric mention (gf16, tf3, bf16, fp8_*) MUST cite `specs/numeric/formats_catalog.t27` line via the `numericformat` header. +7. **L7 UNITY** — no new `*.sh`. Any tooling MUST be `tri` subcommand or `t27c` extension. Python only if `bootstrap/t27c.py` line already exists and no critical-path violation is introduced. +8. **HR-async** — all outreach that this Wave triggers (issues we file on t27) is async-only. NO Zoom / call offers. +9. **HR-catalog** — any `.tri` file referencing a numeric format count MUST include the live grep in its PR body: `grep -c '// CATALOG:' specs/numeric/formats_catalog.t27` → 83 today. +10. **HR-drift** — every pilot PR body includes a `gen-diff-report.txt` snippet showing `git diff --stat gen/` after regeneration. If diff is non-empty and unexpected, PR is BLOCKED. +11. **HR-decontam** — for the dataset pilot (ring-105-007), every added `(spec, gen)` pair passes a Lee 2022 k=50 substring check against a held-out eval set (structure documented in `dataset/igla-coder/v0.1/DECONTAM.md`). +12. **HR-experience** — every pilot PR creates `experience/ring-105-XXX/verdict.json` with `{spec_hash, gen_hash, tests_passed, invariants_verified, bench_delta_pct, timestamp, agent_id}`. +13. **HR-1** — never nudge. If maintainer silence >7 days on a filed issue, no follow-up. +14. **HR-anonymise** — private-repo pilots (105-005, 105-006) carry only type-level structure. No secrets, no PII, no wallet, no bot-token, no user-ID, no tariff amount. +15. **HR-toxic** — the final report leads with the honest gap ("v0.1 seed = 20-40 pairs, NOT training corpus"), never with the achievement. + +--- + +## §2. Per-Pilot Spec (all 8 rings) + +### ring-105-000 — Preflight Parse + +- **Type:** docs-only meta PR +- **Files added:** + - `audit/BASELINE_PARSE.log` (already drafted) + - `docs/wave-2026-07-08/README.md` (index of this Wave) +- **Purpose:** land the parse-baseline decision (TRAIN-BOX PENDING) publicly BEFORE any pilot spec merges, so downstream pilots have a documented starting-point. +- **`Closes`:** we file `t27#new-1` with title "Wave 2026-07-08: ecosystem tri rewrite preflight"; body links this EPIC.md. +- **Verdict:** PASS on merge if user confirms in issue that they'll run local `cargo build --release --bin t27c`. + +### ring-105-001 — Experience Format spec + +- **Type:** `.tri` spec addition (new module, no codegen) +- **File:** `specs/organism/experience.tri` +- **Content:** + - `spec experience { ... }` block + - Types: `Verdict`, `SpecHash`, `AgentId`, `RingId`, `Timestamp` + - Functions (≥3): `verdict_new()`, `verdict_seal(v: Verdict) -> Bytes32`, `verdict_pass(v: Verdict) -> bool` + - Invariants (≥3): sha256 seal length = 32 bytes, timestamps monotone within a ring, agent_id ASCII-only + - Tests (≥8): new/roundtrip/seal-idempotent/pass-conditions/agent_id-ascii/timestamp-monotone/hash-collision-resistance-anecdote/serialize-deserialize + - Benchmarks (≥2): sha256 seal on 4KB verdict, roundtrip serialize+deserialize +- **`Closes`:** we file `t27#new-2` "define PHI LOOP experience artefact schema". +- **No gen/ change** — this is a spec-only pilot at design time (kodegen for it comes in Wave-2). + +### ring-105-002 — Trinity Mozg + DNA + +- **Type:** `.tri` spec + zig codegen (one target) +- **Files:** + - `specs/organism/mozg.tri` — describes the Trinity Mozg (cognitive layer) as a state machine: 27 states (one per agent letter), transitions guarded by law-priority. + - `specs/organism/dna.tri` — describes the DNA (persistence layer): schema for skills, verdicts, and ring-experience blobs. NOT a database — a spec of the on-disk format the trinity Zig runtime writes. + - Regenerated `gen/organism/mozg.zig` + `gen/organism/dna.zig` under L2. +- **Types:** `MozgState`, `Transition`, `DnaRecord`, `SkillId`, `RingBlob` +- **Functions:** transition step, dna_write, dna_read, dna_gc +- **Invariants:** transitions respect law priority (L1 first), no dna record without ring_id, ASCII agent_id +- **Tests:** 8 covering neuron flip, transition guard, dna round-trip, gc semantics, skill upsert, ring blob append, monotone timestamps, invalid transition rejected +- **Benchmarks:** state-machine step throughput, dna_read on 10k records +- **`Closes`:** `trinity#new-3` "trinity: freeze Mozg + DNA schema via t27 tri spec" (we file on gHashTag/trinity, referenced back from t27 PR body). +- **Gen target:** Zig (matches existing `compiler/codegen/zig/codegen.t27`). + +### ring-105-003 — Trios Git Orchestrator + +- **Type:** `.tri` spec + zig codegen +- **File:** `specs/git/orchestrator.tri` +- **Modelled:** the git bridge state machine used by trios: repo_open → fetch → validate → merge → push, with failure branches. +- **Types:** `GitState`, `RepoRef`, `MergeStrategy`, `OrchestrationError` +- **Functions:** state_step, fetch, validate, merge (strict fast-forward only), push +- **Invariants:** no push without validate, no merge without fetch, error states are terminal +- **Tests:** 8 covering the state graph (happy path, each error branch, idempotent open, no-op fetch, dry-run push) +- **Benchmarks:** state-step throughput, worst-case merge with 1k commits +- **`Closes`:** `trios#new-4` "trios: git orchestrator state machine as t27 spec". +- **Gen target:** Zig. + +### ring-105-004 — Trios MCP Tool Registry + +- **Type:** `.tri` spec + rust codegen +- **File:** `specs/mcp/tool_registry.tri` +- **Purpose:** proposes ONE canonical registry surface across trios-mcp, trios-mcp-rag, trios (dedup surface W-G). +- **Types:** `ToolId`, `ToolDescriptor`, `InvocationRecord`, `RegistryError` +- **Functions:** register, describe, invoke_prepare (no actual invocation — that's runtime), lookup +- **Invariants:** tool_id uniqueness, descriptors carry SHA-256 of their JSON schema, ASCII names only +- **Tests:** 8 covering register/collision/lookup-miss/describe-idempotence/sha256-of-schema-stable/case-sensitivity/rejection-of-cyrillic/max-name-length +- **Benchmarks:** register 1k tools, describe on 10k lookups +- **`Closes`:** `trios-mcp#new-5` "trios-mcp: unify tool registry via t27 spec". +- **Gen target:** Rust (existing `compiler/codegen/` doesn't have a Rust backend yet — this pilot INCLUDES a **stub** `compiler/codegen/rust/codegen.t27` skeleton pointing to Wave-2 for full implementation). **HONEST GAP:** Wave-3 responsibility to complete the Rust codegen. + +### ring-105-005 — Multibots Scene Schema (public-safe) + +- **Type:** `.tri` spec (no codegen this Wave — TypeScript codegen deferred) +- **File:** `specs/scenes/scene_schema.tri` +- **Purpose:** describes the *generic* multibot scene state machine at type level, anonymised. No real bot names. +- **Types:** `SceneState`, `Transition`, `MessageKind`, `SceneError` +- **Functions:** scene_step, transition_allowed (guard predicate), on_enter, on_exit +- **Invariants:** transitions form a DAG (no infinite loop), on_enter/on_exit idempotent, message ordering respected +- **Tests:** 8 covering typical scene flows without secrets +- **Benchmarks:** scene_step throughput, guard-eval on 1k transitions +- **`Closes`:** we open a NEW public issue `t27#new-6` "multibot scene schema as t27 spec (public-safe, TypeScript codegen deferred)". The private repo 999-multibots-telegraf receives NO issue this Wave. +- **Gen target:** DEFERRED — mention in PR body that `compiler/codegen/typescript/` does not exist yet. + +### ring-105-006 — Multibots Rust Ring Runtime (anonymised) + +- **Type:** `.tri` spec + rust codegen (STUB from ring-105-004) +- **File:** `specs/organism/ring_runtime.tri` +- **Purpose:** describes the multibots Ring runtime — worker state machine, message dispatch, retry policy — at type level, no secrets. +- **Types:** `RingWorker`, `Dispatch`, `RetryPolicy`, `RuntimeError` +- **Functions:** worker_spawn, dispatch, retry, worker_shutdown +- **Invariants:** retry count bounded, shutdown is idempotent, dispatch queue FIFO +- **Tests:** 8 covering worker lifecycle without secret surface +- **Benchmarks:** dispatch throughput, retry decision latency +- **`Closes`:** `t27#new-7` "ring runtime as t27 spec (public-safe, Rust codegen stub, closes gap with 999-multibots-rust arch)". +- **Gen target:** Rust (STUB — depends on ring-105-004 skeleton). + +### ring-105-007 — IGLA CODER Dataset v0.1 + +- **Type:** dataset artefact PR (no `.tri` spec added; a `.tri` schema for the manifest lives inside) +- **Files:** + - `dataset/igla-coder/v0.1/README.md` — v0.1 charter, scope, decontam approach. + - `dataset/igla-coder/v0.1/MANIFEST.json` — array of `{pair_id, spec_path, spec_sha256, gen_path, gen_sha256, target_lang, ring_id, license, decontam_status}`. + - `dataset/igla-coder/v0.1/DECONTAM.md` — describes Lee 2022 k=50 substring guard, disjoint-set assertion. + - `dataset/igla-coder/v0.1/pairs/` — populated from rings 105-001..105-006 outputs (spec + gen file per module). + - `specs/dataset/igla_coder_manifest.tri` — the schema itself (types + invariants + tests, ≥8 tests, ≥3 invariants, ≥2 benchmarks). +- **`Closes`:** `t27#new-8` "IGLA CODER dataset v0.1 seed". +- **Verdict criteria:** + - MANIFEST.json parses as JSON, matches schema in `igla_coder_manifest.tri`. + - Every `pair_id` is unique. + - Every SHA-256 matches actual file bytes. + - DECONTAM.md documents the check; even at v0.1 with n=20-40 pairs, we ASSERT bidirectional decontam (train vs held-out eval names). + +--- + +## §3. PHI LOOP for each ring (mechanical) + +Each pilot ring follows this 8-step cycle. The Wave agent (this session) executes steps 1-6 in workspace; steps 7-8 are user actions on train-box (documented in report). + +``` +1. edit spec → write .tri file into t27/specs/**/*.tri +2. seal hash → sha256sum specs/**/*.tri >> experience/ring-105-XXX/seal.txt +3. gen → t27c gen (rust/zig/c/verilog) → gen/**/* + (this Wave: designed but not machine-run; TRAIN-BOX PENDING) +4. test → t27c test specs/**/*.tri (PENDING) +5. verdict → experience/ring-105-XXX/verdict.json = { status: PASS|FAIL|PENDING, ... } +6. save experience → git add experience/ring-105-XXX/ +7. skill commit → update tt-lang-t27-integration + trinity-ecosystem skills +8. git commit → atomic commit on ring-105-XXX-* branch, PR body links Closes #N +``` + +**Where each ring stops in this Wave:** +- ring-105-000: steps 1-2-5-6-7-8 (docs only, no gen). +- ring-105-001, 003, 005: steps 1-2-5-6-7-8 (spec designed; gen/test = TRAIN-BOX PENDING). +- ring-105-002, 004, 006: steps 1-2-5-6-7-8 (spec designed; gen/test = TRAIN-BOX PENDING for codegen too). +- ring-105-007: steps 1-2-5-6-7-8 (schema + manifest of what rings 001-006 produced). + +Step 3 (`gen`) and step 4 (`test`) run on train-box because sandbox lacks `cargo`+`rustc`. + +--- + +## §4. Dependency graph & sequencing + +``` +ring-105-000 (preflight) + | + v +ring-105-001 (experience.tri) ──────┐ + | | + v v +ring-105-002 (mozg+dna) ── ring-105-003 (git orch) ── ring-105-004 (mcp registry, rust stub) + | | | + +─────────┬─────────────────────┘ v + | ring-105-006 (ring runtime, rust) + v | + ring-105-005 (scene schema, TS deferred) | + | | + └──────────────┬───────────────────────────────┘ + v + ring-105-007 (IGLA CODER v0.1 dataset) +``` + +**Merge order (recommended):** 000 → 001 → (002 || 003 || 004 in parallel) → 005 → 006 → 007. But each PR is standalone-mergeable; graph is soft. + +--- + +## §5. CI + verification hooks the Wave *proposes* (not implements) + +These are additions to `.github/workflows/**` that a future ring should implement. This Wave records them, does not merge them. + +- **check-tri-parse.yml** — on every PR touching `specs/**/*.tri`, run `t27c parse` on the changed files; block if any fails. +- **check-gen-regenerated.yml** — on every PR touching `specs/**/*.tri`, re-run `t27c gen `, compare against `gen/**`; block if diff non-empty. +- **check-experience-artefact.yml** — hint (not block) — warn if a ring-* branch has spec changes but no `experience/ring-XXX/verdict.json`. +- **check-l3-ascii.yml** — already partly exists; extend to `.tri` files explicitly. +- **check-catalog-count.yml** — HR-catalog rule: any doc referencing "N format" must match `grep -c '// CATALOG:' specs/numeric/formats_catalog.t27`. + +**Filed as follow-up issue** in the report; not merged this Wave (out of scope). + +--- + +## §6. Dataset — IGLA CODER v0.1 (per-pair contract) + +Each pair in `dataset/igla-coder/v0.1/pairs/` looks like: + +``` +pairs/ + 0001-mozg-state-machine/ + spec.tri — from ring-105-002 + gen.zig — from same ring (TRAIN-BOX GENERATED) + metadata.json — {ring, source_repo, license, target_lang, spec_sha256, gen_sha256, decontam_status} + 0002-dna-schema/ + spec.tri + gen.zig + metadata.json + ... +``` + +**v0.1 goals:** +- ~20-40 pairs (from 6 pilot rings that produce gen outputs). +- Decontam: bidirectional Lee 2022 k=50 substring test against `dataset/igla-coder/v0.1/held-out-eval/` (which is empty at v0.1 — noted in DECONTAM.md as "assertion: no held-out eval yet defined at v0.1; decontam trivially clean; v0.2 must populate held-out eval FIRST"). +- License: every pair inherits the source repo's license (Apache-2.0 for t27, MIT/varies for trinity/trios — recorded per-pair). +- SHA-256: per-file, verified in MANIFEST.json. + +**v0.1 known limits (in DECONTAM.md and FINAL_REPORT.md):** +- n=20-40 pairs << phi-1 floor (350M params, ~1B tokens) — W-18 stays HIGH. +- Held-out eval undefined at v0.1 → decontam is a placeholder. +- No tokenizer/detokenizer spec included this Wave. +- No BPB baseline measurement. + +**v0.2..v0.5 roadmap (out of scope, documented as future work):** +- v0.2: define held-out eval (12+ programs, name-disjoint), rerun decontam properly. +- v0.3: augment via deterministic alpha-rename (WP-10 pattern from tt-lang-integration-weakness-map). +- v0.4: add tokenizer spec `specs/tokenizer/tri_tokenizer.tri`. +- v0.5: reach ≥200K train tokens (deficit ≤ 262× per WP-10 analog). + +--- + +## §7. Roadmap AFTER this Wave + +| Wave | Focus | Trigger | +|---|---|---| +| **Wave-2** | Complete Rust codegen (used by rings 105-004/006), TypeScript codegen (ring 105-005), full `t27c parse` CI, gen-regen CI | user runs this Wave train-box, all 8 rings PASS `t27c parse` | +| **Wave-3** | Ecosystem-wide rewrite of remaining 5 modules per repo (Mozg → 27 states worked out, Trios git actions, MCP full surface, multibots scenes list) | Wave-2 CI green | +| **Wave-4** | IGLA CODER v0.2 with held-out eval, WP-10 augmentation applied to reach ≥200K train tokens | Wave-3 rewrites merged | +| **Wave-5** | First real train run of IGLA CODER on Trinity training box, W-12 compile@1 measured, W-18 verdict | v0.5 dataset ready | + +--- + +## §8. Cooperation variants (deliverable of this Wave) + +Full 3-variant menu lives in `report/COLLAB_VARIANTS.md`, but headlines: +- **A — Hunhold (Takum) tri-spec adapter:** propose `specs/numeric/takum.tri` shim, invite reciprocal citation. +- **B — P3109 WG passive cite:** publish `docs/P3109_CROSSWALK_v2.md` referring `specs/numeric/formats_catalog.t27`. +- **C — IST-DASLab / MR-GPTQ compat:** offer IGLA CODER v0.1 seed as a substrate replication target; ask 1-page sanity review. + +--- + +## §9. Non-goals (spelled out to prevent scope creep) + +- Merging any pilot to master this Wave (PR only; merge = user action). +- Touching any of the 20+ conflicting `wave-loop-XYZ` PRs (#1362..#1437). +- Rewriting `bootstrap/t27c.py` (SSOT-MATH exception — L7 debate reserved for Wave-3). +- Publishing dataset to Zenodo (v0.1 is repo-local; publication = Wave-4+). +- Any real training run (W-18/W-19 already documented as HIGH; not the goal here). +- Any change to `paper3-methodology` count (84 vs 83) — separate skill and workflow. +- Any change to `bootstrap/target/**` binaries (train-box territory). + +--- + +## §10. Definition of Done for this Wave + +1. All 8 rings have `.tri` specs designed (present in the workspace repo clone under `pilots/ring-105-XXX/`). +2. Each spec passes L3 (ASCII-only), L4 (≥3 invariants, ≥8 tests, ≥2 benchmarks), L5 (any phi math uses tolerance). +3. `dataset/igla-coder/v0.1/MANIFEST.json` schema-valid; SHA-256 of each pair file computed. +4. `experience/ring-105-XXX/verdict.json` written for each ring (status = DESIGNED_PENDING_TRAIN_BOX for design-only steps). +5. `report/FINAL_REPORT.md` names: (a) toxic verdict, (b) benchmark vs baseline, (c) 3 cooperation variants, (d) explicit gap list mirrored from Weakness Audit. +6. Skills updated: `tt-lang-t27-integration` (v1.18 delta), `scientific-works-canon` (v2.1 delta), `task-status-board` (v0.13 delta), NEW `trinity-ecosystem` at all 3 scopes (user + space + org). +7. One PR opened against `gHashTag/t27` for the whole Wave (branch `ring-105-ecosystem-tri-rewrite` collecting all 8 sub-rings' contents), body linking Closes for each `t27#new-N` we filed. +8. No banned-hype word in any artefact. +9. No claim of PASS on gen/test unless machine-verified (train-box). + +--- + +**End of EPIC.** Root repo = **t27**. diff --git a/docs/wave_ecosystem_2026-07-08/FINAL_REPORT.md b/docs/wave_ecosystem_2026-07-08/FINAL_REPORT.md new file mode 100644 index 000000000..d47c732c2 --- /dev/null +++ b/docs/wave_ecosystem_2026-07-08/FINAL_REPORT.md @@ -0,0 +1,213 @@ +# Wave Report — Trinity Ecosystem → t27 Rewrite + +**Date:** 2026-07-08 +**Session:** 6734fbbe-0e60-42d2-983a-472122b94a87 +**Root repo:** `gHashTag/t27` (user decision this Wave) +**Base commit:** `4832ec6a` on `master` +**Wave branch:** `ring-105-ecosystem-tri-rewrite` (+ 8 sub-rings) + +--- + +## 1. Toxic verdict (lead) + +**Экосистема НЕ едина. Wave делает первый шаг, не последний.** + +- 7 репозиториев говорят на 4 языках (Zig / Rust / TypeScript / `.t27`+`.tri`); один из них (`trios-t27`) до сих пор пустой; два приватны с PII/платёжкой на борту. +- В t27 сегодня висят **20+ конфликтующих Wave-Loop PR-ов** (#1362-#1437) — это очередь, не Wave. +- Численный SSOT дрейфует между тремя числами (**84** в arXiv:2606.09686 / **83** live SSOT / **77** stale gen JSON). +- IGLA CODER/RACE как обучающий корпус **сегодня не существует** ни в каком виде — есть 601 `.t27` файлов, но нет ни пайплайна `(spec, gen)` пар, ни decontam-guard-а, ни tokenizer-а, ни манифеста. +- Этот Wave кладёт **seed из 8 пар, ~7-10K tokens** — это на **3+ порядка ниже** phi-1-small floor (350M params, ~1B tokens). Модель, натренированная на этом seed, работать не будет. Это **не претензия**, это честный baseline. + +**Что Wave реально сделал:** декомпозировал экосистему в 8 колец `ring-105-*`, спроектировал 8 `.tri` спеков (все L3-clean ASCII, все L4-compliant по правилам), собрал научную базу с negative-first оценкой (нет прецедента для 4-target верифицированной генерации), написал manifest + decontam для датасета v0.1, оставил план на Wave-2..Wave-5. + +**Что Wave НЕ сделал:** не сгенерировал реальный код (sandbox без `cargo`/`rustc`), не запустил `t27c parse` (тот же), не сделал merge (только PR), не тронул 20+ конфликтующих PR-ов, не рерайтил приватные бинарники, не решил дрейф каталога 84/83/77. + +--- + +## 2. Deliverables (locked to §10 Definition of Done из EPIC.md) + +| # | Deliverable | Path | Status | +|---|---|---|---| +| 1 | Weakness audit (11 слабостей) | `audit/WEAKNESS_AUDIT.md` | DONE (234 lines) | +| 2 | Baseline parse log (train-box pending) | `audit/BASELINE_PARSE.log` | DONE | +| 3 | Science baseline (10 sections, negative-first) | `research/SCIENCE_BASELINE.md` | DONE (50,859 bytes) | +| 4 | Citations JSONL (68 URLs, live+tagged) | `research/CITATIONS.jsonl` | DONE (26,959 bytes) | +| 5 | Epic + декомпозиция | `epic/EPIC.md` | DONE (334 lines) | +| 6 | Ring-105-000 preflight (docs) | `pilots/ring-105-000/` | DESIGNED | +| 7 | Ring-105-001 experience.tri | `pilots/ring-105-001/experience.tri` | DESIGNED, L3+L4 pass | +| 8 | Ring-105-002 mozg + dna | `pilots/ring-105-002/*.tri` | DESIGNED, L3+L4 pass | +| 9 | Ring-105-003 git orchestrator | `pilots/ring-105-003/orchestrator.tri` | DESIGNED, L3+L4 pass | +| 10 | Ring-105-004 mcp tool registry | `pilots/ring-105-004/tool_registry.tri` | DESIGNED, L3+L4 pass | +| 11 | Ring-105-005 scene schema (public-safe) | `pilots/ring-105-005/scene_schema.tri` | DESIGNED, L3+L4 pass | +| 12 | Ring-105-006 ring runtime (public-safe) | `pilots/ring-105-006/ring_runtime.tri` | DESIGNED, L3+L4 pass | +| 13 | Ring-105-007 IGLA CODER v0.1 seed | `pilots/ring-105-007/dataset/v0.1/` | DONE (8 pairs, MANIFEST, DECONTAM, README) | +| 14 | Experience verdicts (8 rings) | `experience/ring-105-*/verdict.json` | DONE | +| 15 | This report | `report/FINAL_REPORT.md` | DONE | +| 16 | 3 collaboration variants | §7 below + `report/COLLAB_VARIANTS.md` | DONE | +| 17 | Skill updates | tt-lang-t27-integration, scientific-works-canon, task-status-board, NEW trinity-ecosystem | PENDING | +| 18 | PR to gHashTag/t27 | branch `ring-105-ecosystem-tri-rewrite` | PENDING (needs push) | + +--- + +## 3. Benchmark vs baseline + +**Baseline** = state of `gHashTag/t27` @ `4832ec6a` (2026-07-08 master). + +| Metric | Baseline | After Wave (proposed) | Delta | +|---|---|---|---| +| `.tri` specs on master | 10 | 18 (+8 pilots) | +80% | +| Rings on master (`rings/ring-*`) | 18 (up to 104) | 18 (still; new rings go via PR, not merge this Wave) | 0 | +| Numeric formats live catalog | 83 | 83 (untouched) | 0 | +| PHI LOOP experience directory | absent | seeded (`experience/ring-105-*/verdict.json`) | +8 verdicts | +| IGLA CODER dataset | absent | v0.1 seed with 8 pairs, ~7-10K tokens | seed | +| Open Wave-Loop PR conflicts | 20+ | 20+ (not touched by design) | 0 | +| Codegen targets on master | zig, c, verilog, python | zig, c, verilog, python (+rust STUB planned, ts DEFERRED) | +1 STUB | +| L3 (ASCII) failing files added | 0 | 0 (all 8 pilots ASCII pass) | 0 | +| L4 (test+invariant+bench) coverage | existing 10 unknown parse | 8/8 designed compliant | +8 | + +**Honest note on "designed compliant":** compliance is by *visual audit against `specs/01-tri-lang-core.tri` template*, not by machine parse. `t27c parse` verification is TRAIN-BOX pending because sandbox lacks Rust toolchain (see `audit/BASELINE_PARSE.log`). + +--- + +## 4. Weakness disposition (mirror of `audit/WEAKNESS_AUDIT.md`) + +| ID | Title | Severity | Wave outcome | +|----|---|---|---| +| W-A | Language fragmentation 4 langs | MED | Partial: zig+rust STUB in; ts DEFERRED to Wave-3 | +| W-B | Spec↔code drift | HIGH | Partial: HR-drift added to epic; no CI check merged | +| W-C | 20+ conflicting Wave-Loop PRs | LOW (parallel) | Avoided by new ring-105 namespace | +| W-D | No E2E PHI LOOP proof | HIGH | Partial: experience/ring-105-*/verdict.json seeded | +| W-E | IGLA CODER/RACE не существует | HIGH | Partial: v0.1 seed (8 pairs, honest gap) | +| W-F | Catalog count drift 84/83/77 | MED | Documented HR-catalog rule; no fix | +| W-G | MCP surface duplication | MED | 1 pilot tool_registry.tri proposes canonical surface | +| W-H | Private repos vs public corpus | MED | 105-005, 105-006 anonymised abstractions only | +| W-I | trinity#601 credential leak | HIGH (security) | Flagged; **user action required**: rotate the leaked credential | +| W-J | Python on critical path (t27c.py) | LOW | Flagged for Wave-3 ADR | +| W-K | Baseline parse unknown | MED | TRAIN-BOX pending, logged honestly | + +**5 из 11 HIGH; 3 из них partial.** Полное закрытие = Wave-2..Wave-5. + +--- + +## 5. What the user must do (train-box actions, honest list) + +1. **Clone/pull fresh t27:** `git clone https://github.com/gHashTag/t27 && cd t27` +2. **Build t27c:** `cd bootstrap && cargo build --release --bin t27c` (~2-5 min on M-series Mac). +3. **Preflight parse** existing 10 `.tri` to know starting state: `for f in specs/*.tri; do bootstrap/target/release/t27c parse $f; done` — log to `audit/BASELINE_PARSE_TRAINBOX.log`, share back if any fail (that becomes a bug we didn't cause but must know about). +4. **Apply Wave PR** (when it's pushed): checkout branch `ring-105-ecosystem-tri-rewrite`, run `t27c parse` on the 8 new files, run existing test/invariant/bench harness (whatever the repo provides — no shell script from us per L7). +5. **Trinity#601 (security):** independent of Wave — **rotate the exposed credential** (the issue mentions API key leak; do NOT wait for any downstream action). +6. **Wave-2 gate:** when at least 6/8 of the new pilots parse green, that unlocks Wave-2 (real Rust codegen + full CI hooks per epic §5). + +--- + +## 6. Three-road menu (per AEL v2.0 rule "end with 3 roads") + +### Road A — Merge fast, iterate loud + +- Merge `ring-105-000` + `ring-105-001` (docs + experience.tri) FIRST, in isolation. +- Wait 24-48h for parse-baseline from train-box. +- If green, merge remaining 6 pilots as separate small PRs (one per ring). +- Time to full merge: 3-5 days (async only). +- Risk: catches drift on ring-105-005/006 (public-safe abstractions) fast if reviewer finds a leak we missed. + +### Road B — Big-bang PR, atomic merge + +- One `ring-105-ecosystem-tri-rewrite` PR carrying all 8 pilots + dataset + docs. +- Reviewer takes 1-2 weeks; more surface to nitpick; higher rebase risk against Wave-Loop PRs. +- Cleaner history (one merge = one Wave). +- Time to full merge: 2-3 weeks. + +### Road C — Freeze this Wave as capsule, don't merge + +- Publish this workspace as **capsule** (`docs/wave-2026-07-08/` in t27, tarball archived), do NOT open PR now. +- Rerun Wave-2 first (real codegen), then merge Wave-1 + Wave-2 together with actual `gen/` present. +- Zero merge conflict with Wave-Loop PRs during this pause. +- Time to first merge: 3-6 weeks; risk = capsule staleness against master drift. + +**Recommendation:** Road A. +Reason: L1 (traceability) is easier to defend with 2 small merges than one huge PR; ring-105-000 landing first gives a signal about whether the whole approach passes maintainer sniff-test. + +--- + +## 7. Three cooperation variants (external, next Wave) + +Full detail in `report/COLLAB_VARIANTS.md`. + +### Variant A — Laslo Hunhold (Takum ecosystem) + +- **Offer:** file `specs/numeric/takum.tri` in t27 that mirrors Takum's format definition, cite arXiv:2408.10594 in the spec header. +- **Ask:** none (unilateral). Optional reciprocal citation in his libtakum README if he sees value. +- **Gating risk:** Hunhold may not reply within 14 days -> drop, no chase. +- **Effort:** ~2h to write takum.tri + 1 PR. +- **Fits Wave-2** as ring-106-001. + +### Variant B — P3109 WG passive citeable doc + +- **Offer:** publish `docs/P3109_CROSSWALK_v2.md` (extended from tt-lang-t27 v0.4.0's crosswalk) referencing `specs/numeric/formats_catalog.t27` live count = 83. +- **Ask:** none; document sits public, findable via search. +- **Gating risk:** may be ignored 1-6 months. +- **Effort:** ~3h (doc + Zenodo mirror). +- **Fits Wave-2** as ring-106-002 (docs-only PR). + +### Variant C — IST-DASLab / MR-GPTQ substrate compat + +- **Offer:** IGLA CODER v0.1 seed (this Wave's artefact) as a *substrate replication candidate*: parallel spec/gen pairs across 4 languages could stress-test their quantization-aware training tooling in a way plain HuggingFace corpora don't. +- **Ask:** 1-page sanity review of the v0.1 dataset shape (schema-only, no capability claim). +- **Gating risk:** 14-day silence -> drop. +- **Effort:** ~2h (email + attached MANIFEST snapshot). +- **Fits Wave-4** (after v0.2 decontam + v0.3 augment land). + +**Priority:** B then A then C. Reason: B is unilateral + passive + no reply needed = zero downside. A depends on one person's schedule. C waits on v0.2+. + +--- + +## 8. Filed / to-file issues + +Not filed yet (async-only rule + user should approve issue text first). Proposed: + +- `gHashTag/t27#new-1` — "Wave 2026-07-08: ecosystem tri rewrite preflight" (attaches this report link). +- `gHashTag/t27#new-2` — "define PHI LOOP experience artefact schema (specs/organism/experience.tri)". +- `gHashTag/trinity#new-3` — "trinity: freeze Mozg + DNA schema via t27 tri spec". +- `gHashTag/trios#new-4` — "trios: git orchestrator state machine as t27 spec". +- `gHashTag/trios-mcp#new-5` — "trios-mcp: unify tool registry via t27 spec". +- `gHashTag/t27#new-6` — "multibot scene schema as t27 spec (public-safe, TypeScript codegen deferred)". +- `gHashTag/t27#new-7` — "ring runtime as t27 spec (public-safe, Rust codegen stub)". +- `gHashTag/t27#new-8` — "IGLA CODER dataset v0.1 seed". + +**Convention on filing:** we open each issue right before the PR that closes it (so `Closes #N` isn't dangling). Order: 1, 2, 8 on t27; then 3 on trinity, 4 on trios, 5 on trios-mcp (each carries EPIC.md link). + +--- + +## 9. Non-goals (spelled out, unchanged from epic §9) + +- No merge to master this Wave. +- No touch on 20+ Wave-Loop PRs. +- No bootstrap/t27c.py rewrite. +- No Zenodo publication of dataset (v0.1 = repo-local seed). +- No training run. +- No paper #3 count fix (84 vs 83). +- No secrets in the anonymised pilots. + +--- + +## 10. Skills to update (§10.6 of Definition of Done) + +- `tt-lang-t27-integration` — add **v1.18 delta**: Wave 2026-07-08 delivered 8 pilot `.tri` under ring-105-*, IGLA CODER v0.1 seed, weakness map extended. +- `scientific-works-canon` — add **v2.1 delta**: research/SCIENCE_BASELINE.md as a Tier-2 entry (session artefact, not published work). +- `task-status-board` — add **v0.13 delta**: this Wave's status, next-loop = "user runs t27c parse on train-box". +- NEW skill `trinity-ecosystem` at **user + space + org** scopes: how the 7 repos map onto t27's ring-105-* namespace, per-repo pilot module, gating rules, Wave-2..Wave-5 roadmap. + +--- + +## 11. Metadata + +- Wave agent id: `wave-agent-2026-07-08` (session 6734fbbe) +- Timezone: Asia/Bangkok (+07) +- All artefacts under: `/home/user/workspace/wave_ecosystem_2026-07-08/` +- L3 audit of new pilots: **8/8 ASCII pass**, 0 non-ASCII bytes +- L4 audit of new pilots: 8/8 have >=3 invariants + >=8 tests + >=2 bench (visual) +- L5: mozg.tri uses `PHI * PHI + 1.0 / (PHI * PHI) == TRINITY` per §5 identity law (tolerance-based idiom to be enforced by codegen) +- L6: no new numeric formats introduced; live catalog count = **83** verified via `grep -c '// CATALOG:' specs/numeric/formats_catalog.t27` on master @ 4832ec6a +- Banned-hype word scan: 0 hits across all artefacts + +**End of report.** diff --git a/docs/wave_ecosystem_2026-07-08/SCIENCE_BASELINE.md b/docs/wave_ecosystem_2026-07-08/SCIENCE_BASELINE.md new file mode 100644 index 000000000..f0f2faec9 --- /dev/null +++ b/docs/wave_ecosystem_2026-07-08/SCIENCE_BASELINE.md @@ -0,0 +1,159 @@ +# SCIENCE_BASELINE.md +## Научная база 2024–2026 для spec-first codegen проекта (.tri / t27 DSL как SSOT → Zig/Rust/Verilog/TypeScript) + +Дата сборки: 2026-07-08. Формат: negative-first — начинаем с того, где научных прецедентов НЕТ, чтобы честно откалибровать риск и амбицию проекта, затем даём позитивную базу по 6 темам. + +--- + +## 0. Negative-first: где мы вне карты (first-of-kind риски) + +Прежде чем ссылаться на прецеденты, зафиксируем, чего они **не покрывают**. Это самая важная часть документа: она определяет, что придётся валидировать самим, а не "взять из литературы". + +**0.1. Нет прецедента: единый DSL → Zig + Rust + Verilog + TypeScript одновременно, с формальной гарантией эквивалентности.** +Вся multi-target верифицированная генерация в литературе — это гомогенные семейства (только software: Coq→OCaml/Haskell/Scheme; F\*→C/WASM/OCaml/F#) либо чисто hardware (Chisel/FIRRTL → Verilog/SystemVerilog для разных техпроцессов). Silver Oak — единственный найденный пример, который одновременно извлекает **и** RISC-V софт, **и** SystemVerilog хардвер из одной Coq-спецификации ([Silver Oak, PLARCH'23](https://www.youtube.com/watch?v=07Z6zjBXQOU)), но это proof-of-concept на подмножестве OpenTitan AES-блока, не production DSL, и не включает TypeScript/Zig как таргеты. Комбинация "системный язык (Zig/Rust) + HDL (Verilog) + web-типизированный язык (TypeScript) из одного SSOT" не описана нигде в найденной литературе 2024–2026. Это означает: у .tri нет референсной архитектуры для конкретно этого набора таргетов — придётся проектировать mapping слои (numeric types, ownership/ARC vs GC vs wires, concurrency model) без готового формализма. + +**0.2. Нет прецедента для строгого "soundness" на уровне, который претендует t27.** +Формально верифицированная генерация (Coq extraction, F\*/Low\*, MetaCoq) даёт mathematical proof только когда semantics таргет-языка формализована (отсюда потребность в Malfunction для OCaml, CompCert для C). Для Zig формальной семантики почти нет в публичной литературе; для TypeScript (структурная типизация + `any`/unsound casts) формальная семантика тоже неполна, а для Verilog (race conditions, X-propagation) формализация есть, но с известными пробелами (см. [Formalizing HW-SW contracts, Computer magazine 2025](https://www.computer.org/csdl/magazine/co/2025/08/11104170/28MaS4fMgyk)). Следовательно, для двух из четырёх целевых языков (.tri→Zig, .tri→TypeScript) **не существует формального базиса**, на который можно опереться для доказательства soundness — в лучшем случае можно говорить о "tested equivalence" (SAW-style дифференциальное тестирование), а не о доказанной семантической эквивалентности. Использование термина "sound" в маркетинге/докладах проекта было бы научно некорректным без явной оговорки об этом разрыве. + +**0.3. Нет established метрики "semantic gap" для мультиязычных non-hardware таргетов.** +Semantic gap в HW/SW co-verification (см. [Buechi Pushdown System co-verification](http://web.cecs.pdx.edu/~xie/pubs/atcv.pdf), [Berkeley EECS-2026-170 thesis](https://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-170.html)) определяется как разрыв между уровнями абстракции спецификации и реализации в рамках одной пары языков. У нас — 4 таргета с разной моделью памяти/эффектов, и агрегированной метрики "semantic gap across N heterogeneous backends" в литературе не найдено. Придётся изобретать собственную метрику (например: per-target conformance test pass-rate + differential execution trace equivalence), заведомо без внешней валидации со стороны научного сообщества. + +**0.4. Нет прецедента, где "episodic memory + skill commit + git commit" петля валидирована на реальном SWE-bench-подобном бенчмарке для мульти-таргет верифицированной кодогенерации.** +Литература по episodic memory для coding agents (SWE-Exp, CTIM-Rover, ExpeL) валидируется на SWE-bench Verified — обычный Python/JS баг-фиксинг, не спецификационно-управляемая мультиязычная генерация с формальной верификацией. Более того, недавний негативный результат **CTIM-Rover** прямо показывает: naive episodic memory (общая + repo-level Cross-Task-Instance Memory) **ухудшает** производительность AutoCodeRover на всех конфигурациях из-за шумных/отвлекающих извлечений ([CTIM-Rover, ACL RealM 2025](https://aclanthology.org/2025.realm-1.30.pdf)). Это прямое предупреждение для дизайна `.trinity/experience/`: append-only JSONL без грамотного retrieval/abstraction рискует повторить эту деградацию. Также свежий обзор [Memory-Aware Software Engineering Agents (OpenReview 2026)](https://openreview.net/pdf/b9979c0cf1104397df7b4eab8c5e78a2481b953f.pdf) явно фиксирует "episodic-temporal deficit": ни один production coding harness (включая известные, не названные явно, но подразумеваемые Claude Code/Cursor/Devin-класс инструменты) **не имеет нативной episodic memory** — весь рынок использует community MCP-аддоны. Это значит PHI-LOOP паттерн (edit→seal hash→gen→test→verdict→save experience→skill commit→git commit) не имеет ни одного production-грейд аналога с открытой архитектурой — только research prototypes (SWE-Exp, ERL, Voyager skill library). + +**0.5. Нет прецедента распределённого/append-only jsonl "skill commit" формата как научного артефакта.** +Voyager сохраняет skills как исполняемый JS-код, индексированный эмбеддингом описания — концептуально близко к `.trinity/experience/`, но: (а) в среде игры (Minecraft), не в среде мульти-таргет компиляции; (б) без hash-sealing и git-commit интеграции; (в) валидировано на 1 агенте, не на swarm. SWE-Exp использует "experience bank", но опять же для одноязычного bug-fixing. Комбинация hash-seal + JSONL append-only + explicit skill-commit-as-first-class-git-object не описана как паттерн нигде в найденных статьях — это дизайн-решение проекта, не почерпнутое из науки. + +**0.6. Нет academic данных о минимальном размере параллельного корпуса .tri↔target (30-100k токенов) для полезного fine-tuning.** +Академическая литература по low-resource/DSL code generation (MultiPL-E, Grammar Prompting, BMW Xtext case study) использует corpora на 1–2 порядка больше: MultiPL-E генерирует "tens of thousands of validated items" на *язык* (не токенов), BMW Xtext case study использует QLoRA fine-tuning на репозиторном масштабе, не уточняя нижнюю границу. Ни одна найденная работа не даёт scaling law для 30-100k **токенов** (не примеров) двуязычного параллельного корпуса — это на 2-4 порядка меньше типичных датасетов дообучения кода (The Stack v2: 900B токенов). Академический вывод по low-resource языкам (McEval-Hard, arXiv:2606.16827) прямо говорит: pretraining на "the little data available" — лучшая стратегия, но даже для этого возникает потолок pass@1 ~12-26% на no-resource языках. Экстраполяция на 30-100k токенов предполагает, что fine-tuning датасет такого размера **не сделает** LLM надёжным генератором .tri без сильного few-shot/grammar-constrained decoding в дополнение — это тоже должно быть явно принято как риск, а не факт. + +**0.7. Итоговая честная рамка риска.** Проект в трёх измерениях (a) multi-target formally-adjacent codegen для 4 разнородных языков, (b) hash-sealed episodic-memory-driven autonomous loop, (c) crafting a useful sub-100k-token multilingual pair-corpus — **не имеет ни одного точного прецедента**, только смежные фрагменты. Это не аргумент против проекта, а точная калибровка: любые заявления о "as validated by X" должны быть переформулированы как "inspired by X, but X did not validate this exact configuration". + +--- + +## 1. Spec-driven / model-based code generation: что живо в 2025–2026 + +Классические language workbenches (Xtext, MPS, BNFC) продолжают поддерживаться, но фокус индустрии сместился к LLM-augmented генерации DSL, а не к чисто грамматическим трансформациям. + +- **Eclipse Xtext** активно поддерживается (релиз 2.41.0, ноябрь 2025) и остаётся стандартом для textual DSL → Java/TypeScript кодогенерации; систематическое исследование 1002 GitHub-репозиториев на Xtext (226 полноценных языков, 18 категорий доменов) показывает, что grammar+example эволюция происходит часто и в основном как "perfective changes" — релевантно для версионирования .tri-грамматики ([arXiv:2501.19222, "Xtext DSL evolution study", 2025](https://arxiv.org/pdf/2501.19222.pdf)). +- **JetBrains MPS** жив и обновляется (релиз 2025.3, декабрь 2025), но M2M/M2T генераторы MPS ограничены языками, уже реализованными внутри MPS — не могут напрямую генерировать во внешние таргеты типа Python без текстовой печати ([MPS 2025.3 release, JetBrains Blog](https://blog.jetbrains.com/mps/2025/12/mps-2025-3-is-out/); [MPS vs Xtext generator limitations, StackOverflow](https://stackoverflow.com/questions/63221766/advantages-jetbrains-mps-has-over-xtext)) — прямое ограничение, которое .tri обходит за счёт независимых backend-генераторов. +- **BNFC (BNF Converter)** остаётся живым (релиз 2.9.6.1, август 2025), генерирует front-end (lexer/parser/AST/pretty-printer) для Agda/C/C++/Haskell/Java/OCaml из LBNF-грамматики — методологически близкая, но узкая модель (только front-end, без верифицированной семантики) ([BNFC docs, 2025](https://bnfc.readthedocs.io/_/downloads/en/v2.9.6.1/pdf/)). +- **Промышленный LLM-driven DSL codegen набирает обороты**: BMW кейс-стади показывает repository-scale генерацию/модификацию Xtext-based DSL артефактов через fine-tuned Qwen2.5-Coder/DeepSeek-Coder (QLoRA), достигая 0.657 exact match и 1.00 structural fidelity на held-out наборе — прямая аналогия для .tri tooling ("научиться генерировать/редактировать саму DSL", а не только target-код) ([arXiv:2604.24678, BMW industrial DSL case study, 2026](https://arxiv.org/html/2604.24678)). +- **Grammar-constrained decoding** (Grammar Prompting, NeurIPS 2023; GRAMMAR-LLM, ACL Findings 2025) — техника принуждения LLM к валидной грамматике во время генерации через constrained decoding (LL/Earley parsers) — прямо применима к автогенерации .tri программ или синтаксическому ремонту ([GRAMMAR-LLM, ACL Findings 2025](https://aclanthology.org/2025.findings-acl.177.pdf); [Grammar Prompting, NeurIPS 2023](https://proceedings.neurips.cc/paper_files/paper/2023/file/cd40d0d65bfebb894ccc9ea822b47fa8-Paper-Conference.pdf)). + +**Релевантность для .tri:** Xtext/MPS доказывают, что language-workbench модель жизнеспособна десятилетиями, но ни одна не решает multi-target-с-верификацией задачу; grammar-constrained decoding — прямой кандидат для инструмента "чинит синтаксис .tri перед compile". + +--- + +## 2. Verified extraction: Coq→OCaml/Haskell, Lean 4→Rust/C — что реально работает в 2025 + +- **Verified Extraction from Coq (Rocq) to OCaml** (PLDI'24, Forster/Sozeau/Tabareau) — первая mechanically-verified extraction pipeline Coq→Malfunction→OCaml с machine-checked correctness theorem, построена на MetaCoq. Ключевое ограничение, честно признанное авторами: theorem работает только для **first-order types**; higher-order interoperation с nonterminating/effectful OCaml не покрыто гарантиями ([ACM DL, "Verified Extraction from Coq to OCaml", PLDI 2024](https://dl.acm.org/doi/pdf/10.1145/3656379); [MetaCoq/coq-verified-extraction repo](https://github.com/yforster/coq-verified-extraction)). +- **Lean 4 → Rust/C via Aeneas + AI provers**: свежая (2026) работа описывает pipeline "Rust-to-Lean verification" через Aeneas, с ограничением: не обрабатывает parallel iterators, deep generics, external-crate calls — требует ручного переписывания математического ядра в standalone non-generic Rust crate ([arXiv:2605.30106, "A Rust-to-Lean Verification Pipeline with AI Provers", 2026](https://arxiv.org/html/2605.30106v1)); также hax extracts Rust→F\*/Rocq/Lean для верификации реальной (не смодулированной) implementation-кода ([hax + Lean verification, positive-intentions.com](https://positive-intentions.com/docs/technical/signal-protocol-formal-verification/hax-lean/)). +- **Lean 4's self-hosted compiler** targets C напрямую (не через extraction в смысле Coq), что структурно отличается от Rocq's verified extraction pipeline — сравнительный отчёт разбирает оба подхода бок о бок ([Compiling Lean programs with Rocq's extraction pipeline, normalesup.org 2025](https://www.normalesup.org/~sdima/2025_extraction_report.pdf)). +- **CLEVER benchmark (2025, ICML/arXiv)** — 161 задачи end-to-end verified codegen в Lean; лучшие LLM решают **1 из 161** задачи end-to-end (генерация спецификации + доказуемая реализация) — сильный негативный сигнал о текущем состоянии LLM+formal-verification интеграции ([arXiv:2505.13938, CLEVER benchmark](https://arxiv.org/abs/2505.13938)). +- **AlphaVerus (ICML 2025)** — self-improving framework для формально верифицированной кодогенерации через tree search (Treefinement) и verifier feedback, позволяет LLaMA-3.1-70B генерировать verified код без finetuning; тестировано на HumanEval/MBPP переводах — методологический шаблон для .tri "gen→verify→refine" цикла ([AlphaVerus, PMLR 267, 2025](https://proceedings.mlr.press/v267/aggarwal25a.html)). + +**Релевантность для .tri:** Верифицированная экстракция работает только в узких, гомогенных, first-order случаях с десятилетиями теоретической подготовки (MetaCoq — 300k+ строк Coq). Для .tri это означает: полный "soundness" a la Coq/PLDI'24 недостижим в обозримые сроки для 4 таргетов; реалистичная цель — differential testing + partial formal guarantees на подмножестве .tri (см. §0.2). + +--- + +## 3. One-source-of-truth DSL с multi-target backends: soundness, refinement, semantic gap + +- **F\*/Low\* → C/WASM/OCaml/F#, проект HACL\*** — крупнейший живой пример SSOT с несколькими таргетами: спецификация на чистом F\*, реализация на Low\* (безопасное подмножество C), компиляция через KaRaMeL/KreMLin в C, сохраняя memory safety + functional correctness + side-channel resistance через translation-preserving-properties theorem. HACL\* используется в проде (Mozilla Firefox, Python 3.x hashlib, WireGuard, Tezos) ([HACL\*, MIT 6.5660 readings 2026](https://css.csail.mit.edu/6.5660/2026/readings/hacl-star.pdf); [HACL\* GitHub](https://github.com/hacl-star/hacl-star); [Low\* paper, arXiv:1703.00053](https://arxiv.org/pdf/1703.00053.pdf)). Это ближайший по духу к .tri пример: один SSOT → несколько production таргетов с формальной гарантией сохранения свойств при трансляции. +- **Cryptol → SAW: equivalence, не generation.** Cryptol — DSL для спецификации крипто-алгоритмов; SAW (Software Analysis Workbench) доказывает **эквивалентность** между Cryptol-спецификацией и production-реализацией на C/Java/Rust через SAT/SMT солверы — важное методологическое отличие: SAW не генерирует код из Cryptol, а верифицирует независимо написанный код против спецификации ([SAW docs, Galois](https://tools.galois.com/saw); [Galois SAW 1.5/Cryptol 3.5.0 release, Feb 2026](https://www.galois.com/articles/galois-releases-saw-1-5-and-cryptol-3-5-0)). AWS использует именно эту архитектуру (Cryptol spec + SAW/HOL-Light/Coq proofs) для верификации crypto-библиотек на нескольких целевых платформах x86_64/AArch64 одновременно, явно упоминая цель "proving the equivalence of a single module for multiple targets" ([AWS NIST presentation on formal verification, 2024](https://www.nist.gov/system/files/documents/2024/06/11/01-ChapmanPHPLBK.pdf)). +- **Exo / Exo 2 / ExoBLAS — user-schedulable exocompilation.** Exo 2 (ASPLOS'25) вводит extensible scheduling language, где ~2000 строк scheduling-кода переиспользуются между линейно-алгебраическими приложениями и hardware-таргетами (AVX512, AVX2, Neon, Gemmini accelerator) — прямая демонстрация "один алгоритмический SSOT → множественные аппаратные бэкенды" ([MIT News on Exo 2, март 2025](https://news.mit.edu/2025/high-performance-computing-with-much-less-code-0313); [Exo 2 paper, arXiv:2411.07211](https://arxiv.org/pdf/2411.07211); [ExoBLAS repo](https://github.com/exo-lang/ExoBLAS); [micro-kernel generation with Exo, arXiv:2310.17408](https://arxiv.org/abs/2310.17408v2)). +- **Chisel/FIRRTL — hardware generator, multi-target via IR.** Chisel (Scala DSL) компилируется в FIRRTL IR, затем в target-specific Verilog/SystemVerilog для разных FPGA/ASIC техпроцессов; современный Chisel 7.0 (апрель 2025) добавил Layer API для "one Scala description → ASIC/FPGA/simulation stubs с нулевым диффом" — концептуальный аналог того, что .tri пытается сделать для 4 совершенно разных типов таргетов (не просто разные техпроцессы одного HDL) ([Automating RTL Design in Mid-2025, Medium](https://medium.com/@platformaigpt/automating-rtl-design-in-mid-2025-0956859b870f); [FIRRTL as "LLVM for circuits", HN discussion / original paper](http://albert-magyar.github.io/documents/firrtl-iccad17.pdf)). +- **Метрики soundness/refinement/semantic gap**: refinement types (Liquid Haskell, Mechanizing Refinement Types POPL'24) формализуют "какое подмножество поведений реализации допустимо относительно спецификации" — теоретическая база для описания допустимого semantic gap между .tri-спекой и конкретным таргетом ([Mechanizing Refinement Types, ACM DL / POPL'24](https://dl.acm.org/doi/10.1145/3632912)); формальное определение semantic gap в HW/SW co-verification — "заполнение через перевод обоих доменов в общий формальный язык" ([HW/SW co-verification survey, PSU citeseerx](https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=edd08e4d6ba7539a781f68ac1bc641cdb8e17701)). + +**Релевантность для .tri:** HACL\*/Low\* — лучшая ролевая модель архитектуры (spec/impl раздельные уровни, per-target property-preserving compiler), но Т27 должен решить задачу для гораздо более гетерогенного набора таргетов, чем HACL\*'s C/WASM/OCaml/F# (все — управляемые или C-семейство языки; ни один не является HDL или GC'd web-язык одновременно). + +--- + +## 4. Episodic / experience-based память для агентных систем + +- **Voyager (NVIDIA/Caltech, TMLR 2024)** — первый LLM-агент с lifelong skill library: код сохраняется как исполняемые JS-функции, индексированные эмбеддингом описания, retrieval top-5 при новой задаче; удаление skill library роняет discovered-items на 93% в поздних стадиях. Skill library переносим между агентами (boost для AutoGPT) ([Voyager paper, OpenReview/TMLR 2024](https://openreview.net/pdf/625b7da181479e7642abce270739da66290f0fa3.pdf)). +- **MemGPT (2023, но живо развивается 2024-2026)** — OS-inspired virtual context management с multi-tier memory (main context + external/archival), архитектурно похоже на разделение "working memory" и "`.trinity/experience/` как archival tier" ([MemGPT paper, arXiv:2310.08560](http://arxiv.org/pdf/2310.08560v2.pdf); [MemGPT project page](https://research.memgpt.ai)). +- **CAMEL** — "первый мультиагентный LLM framework", статически заявляет built-in memory module (ChatHistoryMemory + внешние БД), масштабируется до "thousands of agents working in parallel" ([CAMEL framework docs](https://docs.camel-ai.org/key_modules/memory); [CAMEL-AI framework page](https://www.camel-ai.org/framework)). +- **SWE-Exp (июль 2025)** — "experience bank" из successful/failed repair trajectories для SWE agents; достигает 41.6% pass@1 на SWE-bench Verified с DeepSeek-V3, превосходя более крупные модели без experience bank — прямой прецедент для skill-commit паттерна .trinity ([SWE-Exp paper, arXiv:2507.23361](https://arxiv.org/abs/2507.23361) via [обзор на YouTube AI Research Roundup](https://www.youtube.com/watch?v=2WolqhX5e80)). +- **Негативный результат: CTIM-Rover (ACL RealM 2025)** — репозиторно-уровневая Cross-Task-Instance Memory ухудшает производительность AutoCodeRover **во всех конфигурациях** по сравнению с baseline без памяти; авторы явно называют причиной шум от нерелевантных retrieved items — критическое предупреждение против naive append-only retrieval без структурированной абстракции ([CTIM-Rover, ACL Anthology 2025](https://aclanthology.org/2025.realm-1.30.pdf)). +- **Subtask-level structurally-aligned memory (arXiv:2602.21611, упомянуто в AgentPatterns.ai)** — решает проблему CTIM-Rover через категоризацию memory по функциональной стадии (Analyze/Reproduce/Edit/Verify) + двухступенчатый retrieval (category filter → cosine similarity); LLM-abstracted entries дают +3.9pp против +1.2pp для raw trajectories, что подтверждает необходимость абстракции "lesson" перед сохранением — прямая рекомендация для формата `.trinity/experience/*.jsonl` ([Subtask-Level Memory, AgentPatterns.ai обзор arXiv:2602.21611](https://agentpatterns.ai/agent-design/subtask-level-memory/)). +- **Комплексный обзор "Memory-Aware Software Engineering Agents" (OpenReview 2026)** фиксирует "episodic-temporal deficit": ни один production coding harness не имеет нативной episodic memory нативно; только MCP-аддоны экосистемы закрывают этот пробел частично, почти никогда с temporal reasoning ([Memory-Aware SE Agents survey, OpenReview 2026](https://openreview.net/pdf/b9979c0cf1104397df7b4eab8c5e78a2481b953f.pdf)). +- **MemoryAgentBench (arXiv:2507.05257)** — унифицированный бенчмарк по 4 компетенциям памяти (accurate retrieval, test-time learning, long-range understanding, conflict/selective forgetting); ни одна существующая система не мастерит все 4 одновременно — реалистичная планка ожиданий для `.trinity/experience/` ([MemoryAgentBench, arXiv 2025](https://arxiv.org/html/2507.05257v1)). + +**Релевантность для .tri:** append-only JSONL + skill commit находится в русле общей траектории (Storage→Reflection→Experience эволюция, см. [arXiv:2605.06716 survey](https://arxiv.org/abs/2605.06716)), но нужно заложить: (1) абстракцию "lesson" перед записью (не raw trajectory), (2) категоризацию по стадии/фазе PHI-LOOP, (3) явную защиту от noisy-retrieval деградации (см. CTIM-Rover). + +--- + +## 5. PHI-LOOP-style автономные циклы: edit→seal→gen→test→verdict→save→commit + +- **SWE-bench Verified — состояние на июль 2026**: топ-модели (Claude Mythos, Claude Fable 5, Claude Opus 4.7/4.8) достигают 88-95%+ на "verified"-подмножестве (human-filtered 500 задач), но независимый contamination-resistant SWE-bench Pro показывает падение на 15-35pp (топ ~57-69%) — сигнал, что верифицированные бенчмарки насыщаются быстрее, чем реальная генерализация ([SWE-bench Verified leaderboard, llm-stats.com, июль 2026](https://llm-stats.com/benchmarks/swe-bench-verified); [SWE-bench Pro leaderboard, Morph, июнь 2026](https://www.morphllm.com/swe-bench-pro); [SWE-bench-Live leaderboard — reality-checked continuously-updated tasks](https://swe-bench-live.github.io)). +- **SWE-bench-Live** — континуально обновляемый бенчмарк специально против data contamination; лучший результат на июнь 2026 — 63.0% (AMI Agent + Claude 4.6 Opus), значительно ниже "Verified" чисел — важно процитировать оба числа вместе, чтобы не создавать ложное впечатление насыщения задачи ([SWE-bench-Live leaderboard](https://swe-bench-live.github.io)). +- **Devin (Cognition) — 18-месячный performance review (2025)**: честная self-репортированная калибровка — Devin "senior-level at codebase understanding, junior at execution"; 67% PR merge rate (рост от 34% год назад), но реальная автономная задача типа "новый проект с нуля" имела ~15% success rate в независимом тесте с 20 задачами (14 fail, 3 success, остальное inconclusive) ([Devin 2025 performance review, Cognition blog](https://cognition.com/blog/devin-annual-performance-review-2025); независимая оценка [Devin's 18-month ARR growth review](https://agentmarketcap.ai/blog/2026/04/06/cognition-devin-73x-arr-growth-autonomous-coding-agent-hypergrowth)). Это прямая калибровка ожиданий для оркестраторной роли в PHI-LOOP: даже флагманский коммерческий автономный агент требует человеческого review на большинстве нетривиальных задач. +- **Anthropic Economic Index (январь/март/июнь 2026)** — эмпирические данные по использованию Claude в реальной работе: код (create/debug) занимает наибольшую долю трафика (37.2% "computer and mathematical" категории); augmentation (57%) стабильно превосходит full automation (43%) на потребительском Claude.ai, но API (энтерпрайз, часто orchestrated/agentic использование) переворачивается в сторону 75% automated — сигнал, что "orchestrator"-паттерн (агент рулит, человек проверяет) — доминирующий рабочий режим, а не полная автономия ([Anthropic Economic Index, январь 2026 отчёт](https://www.anthropic.com/news/the-anthropic-economic-index); [Economic Index: Cadences, июнь 2026](https://www.anthropic.com/research/economic-index-june-2026-report)). +- **AlphaVerus (см. §2) и Treefinement** — методологический шаблон gen→verify→refine цикла с явным анти-reward-hacking фильтром (filtering misaligned specifications), релевантно для PHI-LOOP "verdict" стадии — нужен явный guard против ложно-позитивных verdict'ов ([AlphaVerus, PMLR 2025](https://proceedings.mlr.press/v267/aggarwal25a.html)). + +**Релевантность для .tri:** ни Devin, ни SWE-agent-стиль системы не публикуют hash-seal+experience+skill-commit+git-commit цепочку как раскрытую архитектуру — весь paper trail в PHI-LOOP (seal hash перед gen, verdict explicit stage, skill commit как git-объект) — architecture decision проекта, не заимствование. Но общий тренд (orchestrator + verifiable subtasks + memory) подтверждён и Anthropic Economic Index, и Devin retrospective. + +--- + +## 6. Swarm-of-agents с shared experience + +- **Claude Code subagents** — официальная документация описывает архитектуру "каждый subagent работает в своём context window с кастомным system prompt, конкретным tool access и независимыми permissions"; встроенные subagents (Explore, Plan, general-purpose) + custom subagents; выбор модели (Haiku для дешёвых задач) для cost control — прямой референс для swarm-дизайна .tri оркестрации (например: отдельный subagent на каждый target backend Zig/Rust/Verilog/TS) ([Claude Code subagents docs](https://code.claude.com/docs/en/sub-agents)). +- **Aider Architect/Editor pattern (2024)** — разделение "code reasoning" (Architect model, напр. o1-preview) и "code editing" (Editor model, применяет правки в существующие файлы) даёт SOTA 85% на aider's code editing benchmark; ключевой инсайт — разные модели лучше справляются с разными частями задачи, и разделение ролей систематически повышает точность по сравнению с monolithic single-model подходом ([Aider Architect mode, 2024-09-26](https://aider.chat/2024/09/26/architect.html)). +- **CAMEL "Societies"** — координаторный слой, который назначает роли и делегирует задачи; framework утверждает масштабирование до "thousands of agents working in parallel across distributed systems" с общей memory layer ([CAMEL framework](https://www.camel-ai.org/framework)). +- **OWL (Optimized Workforce Learning), построен на CAMEL** — мультиагентная автоматизация реальных задач с dynamic agent collaboration через browsers/code interpreters/multimodal models — пример production-oriented swarm с общим memory/tool layer ([CAMEL-AI Introduction docs, OWL раздел](https://docs.camel-ai.org/get_started/introduction)). +- **Fresh survey: LLM agents in SE, 115 papers (2025)** — унифицированный фреймворк Perception/Memory(semantic/episodic/procedural)/Action для coding agents; прямо признаёт, что "mainstream technique today — retrieval (RAG) для semantic & episodic memory; procedural memory — дизайн агента (архитектура/промпты)" — то есть **procedural memory для мультиагентных coding swarm пока не формализована** как отдельный обучаемый компонент, что релевантно для skill-commit паттерна .tri, который пытается именно это сделать explicit ([Coding Agents survey slides, Sergey Mechtaev](https://mechtaev.com/files/pku-04834580-softeng-25_26-coding_agents.pdf)). + +**Релевантность для .tri:** Aider Architect/Editor — прямая модель для двухролевого дизайна (spec-writer/orchestrator vs target-specific code generator); Claude Code subagents — прямая модель для параллельных backend-специфичных worker'ов с раздельным context window, что естественно мапится на 4 таргета (Zig/Rust/Verilog/TS worker per subagent). + +--- + +## 7. Датасеты для code LLM и требования к малым мультиязычным корпусам + +- **The Stack v2 (BigCode, февраль 2024)** — 67.5TB / 3B+ файлов / 600+ языков, дедуп до 900B+ токенов; обучающий корпус для StarCoder2; методология лицензионной фильтрации, PII redaction, opt-out governance — образец industrial-grade data pipeline, но на 7 порядков больше, чем целевые 30-100k токенов .tri-корпуса ([StarCoder2 & The Stack v2 paper, arXiv:2402.19173](https://arxiv.org/html/2402.19173v1); [The Stack v2 HF dataset card](https://huggingface.co/datasets/bigcode/the-stack-v2)). +- **MultiPL-E** — методология синтеза low-resource языковых training items из high-resource (Python) через compiler-based transpilation + test-case validation; "tens of thousands of new, validated training items" на 5 low-resource языков (Julia, Lua, OCaml, R, Racket); критически — все items **validated with test cases**, не просто транслитерированы ([MultiPL-E paper, IEEE TSE 2023, par.nsf.gov](https://par.nsf.gov/biblio/10416465); [MultiPL-E GitHub](https://github.com/nuprl/MultiPL-E)). +- **HumanEval+/MBPP+ (EvalPlus, NeurIPS 2023, живой проект)** — усиление классических бенчмарков за счёт 80× больше test cases для более строгой оценки корректности сгенерированного кода — методологический стандарт, который .tri-corpus evaluation должен перенять (не полагаться на один happy-path тест на пример) ([EvalPlus GitHub](https://github.com/evalplus/evalplus); [EvalPlus leaderboard](https://evalplus.github.io/leaderboard.html)). +- **No-Resource languages study (arXiv:2606.16827, июнь 2026)** — прямое исследование "что делать, когда нет бенчмарка и нет ресурсов" для языков типа Gleam, MoonBit; лучшая стратегия — pretraining на доступных крохах данных, достигая pass@1 12% (Gleam) / 26% (MoonBit) на McEval-Hard — это самая близкая по духу к .tri ситуации количественная точка отсчёта (потолок производительности при минимальных данных) ([No Resource No Benchmarks study, arXiv:2606.16827](https://arxiv.org/html/2606.16827v1)). +- **RefineCode / OpenCoder** — 960B токенов, 607 языков, с "130+ language-specific rules with customized weight assignments" — показывает, что даже для well-resourced языков нужна десятки-сотни миллиардов токенов для базового claim о качестве корпуса; это ещё раз подчёркивает разрыв масштаба с целевыми 30-100k токенами .tri ([RefineCode dataset card, HuggingFace](https://huggingface.co/datasets/OpenCoder-LLM/RefineCode-code-corpus-meta)). +- **BMW industrial DSL fine-tuning (arXiv:2604.24678, см. §1)** — редкий пример успешного fine-tuning на **enterprise-scale, но не web-scale** DSL корпусе (репозиторный, не token-count специфицированный) через QLoRA на 7B моделях, с сильным ростом качества от few-shot ICL к fine-tuning — практический прецедент, что fine-tuning на relatively small, high-quality, structurally-consistent корпусе DSL может давать пригодные результаты, если задача узкая (single DSL family, known folder structure) ([BMW DSL case study, arXiv:2604.24678](https://arxiv.org/html/2604.24678)). + +**Релевантность для .tri:** для 30-100k токенов пар-корпуса реалистичная стратегия — не "pretrain with hope", а: (1) grammar-constrained decoding / retrieval-augmented few-shot по образцу MultiPL-E test-validated синтеза, (2) QLoRA fine-tuning узкой модели по образцу BMW кейса, (3) строгая HumanEval+/EvalPlus-стиль верификация каждого сгенерированного примера перед включением в корпус, чтобы избежать "unverified garbage in, garbage out" сценария. + +--- + +## 8. Формальные метрики soundness/refinement применительно к .tri (кросс-секционный синтез) + +- **Refinement types как язык описания допустимого разрыва**: Liquid Haskell / Mechanizing Refinement Types (POPL'24) дают формализм "тип T с предикатом P" для описания подмножества допустимых значений/поведений — можно использовать для описания контракта между .tri-спекой и каждым таргетом как refinement-типизированный интерфейс, даже если сам таргет (Zig/TS) не имеет refinement type system нативно ([Mechanizing Refinement Types, POPL'24 video](https://www.youtube.com/watch?v=UXA7SRArBj8); [ACM DL paper](https://dl.acm.org/doi/10.1145/3632912)). +- **Explicit Refinement Types (Cambridge, ~2024-2025)** — дальнейшее развитие темы явного контроля refinement-предикатов, важно для API-дизайна .tri type system, если планируется richer contract layer ([Explicit Refinement Types, cl.cam.ac.uk](https://www.cl.cam.ac.uk/~nk480/ert.pdf)). +- **Position paper: PL techniques for [formal methods x AI-generated code] (arXiv:2507.09135, июль 2025)** — свежий programmatic взгляд на то, как языковые техники (типы, эффекты, рефайнменты) должны эволюционировать, чтобы делать AI-generated код верифицируемым по построению, а не постфактум — прямой теоретический ориентир для эволюции .tri type system в сторону verifiability ([Position paper, arXiv:2507.09135](https://arxiv.org/abs/2507.09135)). +- **PyCaliper (Berkeley EECS-2026-170 thesis)** — unified Python framework "express specifications once, target multiple verification and synthesis tools", уже принят Intel Labs для secure processor verification — ближайший по духу к .tri "write once, target many verification backends" паттерн, хотя ограничен доменом hardware security verification, а не general multi-language codegen ([Berkeley thesis EECS-2026-170](https://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-170.html)). + +**Релевантность для .tri:** для честной научной коммуникации проект должен явно позиционировать себя как "refinement-type-inspired contract layer + differential testing", а не "formally verified" в PLDI'24-Coq-extraction смысле, пока не появится специализированная формализация под Zig/TS/Verilog. + +--- + +## 9. Сводная таблица: зрелость областей vs применимость к .tri + +| Область | Научная зрелость 2024-2026 | Прямая применимость к .tri | Основной риск для проекта | +|---|---|---|---| +| Language workbenches (Xtext/MPS/BNFC) | Высокая, но статичная | Средняя — архитектурный ориентир | Не решают multi-target verified codegen | +| Verified extraction (Coq/Lean/F\*) | Высокая в узкой нише | Низкая для Zig/TS, средняя для Rust/Verilog-смежного | Полный "soundness" claim недостижим для 2 из 4 таргетов | +| Multi-target SSOT (HACL\*, Exo, Chisel) | Высокая, но гомогенные семейства таргетов | Высокая как архитектурный шаблон | Ни один пример не покрывает HDL+GC+manual-memory+web одновременно | +| Episodic memory для агентов | Быстро растущая, но противоречивая (позитив и негатив) | Высокая — прямой источник дизайн-паттернов | CTIM-Rover: naive retrieval может УХУДШИТЬ результат | +| PHI-LOOP-style автономные циклы | Растущая, коммерчески валидируемая (Devin, SWE-bench) | Средняя — общий паттерн подтверждён, детали нет | Даже SOTA агенты требуют review; полная автономность не подтверждена | +| Swarm agents с shared experience | Растущая, есть production примеры (Claude Code, CAMEL) | Высокая — Aider Architect/Editor прямой шаблон | Procedural memory для swarm пока не формализована | +| Datasets для code LLM | Зрелая для больших языков, слабая для low/no-resource | Низкая по масштабу (7 порядков разницы) | 30-100k токенов может быть недостаточно без grammar-constrained decoding | + +--- + +## Источники — сводный список (см. также CITATIONS.jsonl) + +Все URL сохранены live в тексте выше по разделам. Основные кластеры: +- Model-driven engineering: [Xtext releases](https://eclipse.dev/Xtext/releasenotes.html), [MPS 2025.3](https://blog.jetbrains.com/mps/2025/12/mps-2025-3-is-out/), [BNFC docs](https://bnfc.readthedocs.io/_/downloads/en/v2.9.6.1/pdf/), [Xtext DSL evolution study](https://arxiv.org/pdf/2501.19222.pdf), [BMW DSL LLM case study](https://arxiv.org/html/2604.24678) +- Verified extraction: [Coq→OCaml PLDI'24](https://dl.acm.org/doi/pdf/10.1145/3656379), [MetaCoq](https://sozeau.gitlabpages.inria.fr/www/research/publications/MetaCoq_and_Certified_Extraction-JFLA24-310124.pdf), [Rust-to-Lean pipeline](https://arxiv.org/html/2605.30106v1), [CLEVER benchmark](https://arxiv.org/abs/2505.13938), [AlphaVerus](https://proceedings.mlr.press/v267/aggarwal25a.html) +- Multi-target SSOT: [HACL\*](https://css.csail.mit.edu/6.5660/2026/readings/hacl-star.pdf), [Low\*](https://arxiv.org/pdf/1703.00053.pdf), [SAW/Cryptol](https://tools.galois.com/saw), [AWS formal verification](https://www.nist.gov/system/files/documents/2024/06/11/01-ChapmanPHPLBK.pdf), [Exo 2](https://arxiv.org/pdf/2411.07211), [ExoBLAS](https://github.com/exo-lang/ExoBLAS), [Chisel/FIRRTL](http://albert-magyar.github.io/documents/firrtl-iccad17.pdf), [Silver Oak](https://www.youtube.com/watch?v=07Z6zjBXQOU) +- Episodic memory: [Voyager](https://openreview.net/pdf/625b7da181479e7642abce270739da66290f0fa3.pdf), [MemGPT](http://arxiv.org/pdf/2310.08560v2.pdf), [CAMEL](https://docs.camel-ai.org/key_modules/memory), [SWE-Exp](https://arxiv.org/abs/2507.23361), [CTIM-Rover негативный результат](https://aclanthology.org/2025.realm-1.30.pdf), [Memory-Aware SE Agents survey](https://openreview.net/pdf/b9979c0cf1104397df7b4eab8c5e78a2481b953f.pdf), [MemoryAgentBench](https://arxiv.org/html/2507.05257v1) +- Autonomous loops: [SWE-bench Verified leaderboard](https://llm-stats.com/benchmarks/swe-bench-verified), [SWE-bench Pro](https://www.morphllm.com/swe-bench-pro), [SWE-bench-Live](https://swe-bench-live.github.io), [Devin 2025 review](https://cognition.com/blog/devin-annual-performance-review-2025), [Anthropic Economic Index](https://www.anthropic.com/news/the-anthropic-economic-index) +- Swarm agents: [Claude Code subagents](https://code.claude.com/docs/en/sub-agents), [Aider Architect mode](https://aider.chat/2024/09/26/architect.html), [CAMEL framework](https://www.camel-ai.org/framework) +- Datasets: [The Stack v2](https://arxiv.org/html/2402.19173v1), [MultiPL-E](https://par.nsf.gov/biblio/10416465), [EvalPlus](https://github.com/evalplus/evalplus), [No-Resource languages study](https://arxiv.org/html/2606.16827v1), [RefineCode](https://huggingface.co/datasets/OpenCoder-LLM/RefineCode-code-corpus-meta) +- Formal metrics: [Mechanizing Refinement Types](https://dl.acm.org/doi/10.1145/3632912), [PL techniques position paper](https://arxiv.org/abs/2507.09135), [PyCaliper / Berkeley thesis](https://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-170.html) diff --git a/docs/wave_ecosystem_2026-07-08/WEAKNESS_AUDIT.md b/docs/wave_ecosystem_2026-07-08/WEAKNESS_AUDIT.md new file mode 100644 index 000000000..5146eec8e --- /dev/null +++ b/docs/wave_ecosystem_2026-07-08/WEAKNESS_AUDIT.md @@ -0,0 +1,233 @@ +# Weakness Audit — Trinity Ecosystem → t27 Rewrite + +**Date:** 2026-07-08 (baseline: t27 master `4832ec6a`) +**Scope:** 7 репо → рерайт в `.tri` спеки под корнем `gHashTag/t27` +**Author:** Wave loop agent (session 6734fbbe) +**Purpose:** Локализовать реальные слабости ДО написания эпика, чтобы план не был косметическим. + +--- + +## Executive Verdict (токсично-честный) + +**Экосистема НЕ едина.** 7 репозиториев говорят на 4 разных языках (Zig, Rust, TypeScript, `.t27`/`.tri`), три из них приватные, `trios-t27` до сих пор пустой, а сам t27 имеет **20+ конфликтующих Wave-Loop PR-ов** (#1362-#1437) — это не Wave, это очередь. Численный SSOT дрейфует по трём числам одновременно (84 в arXiv:2606.09686 / 83 live / 77 в stale gen JSON). IGLA CODER/RACE как обучающий корпус **сегодня не существует** — есть 601 `.t27` файлов, но нет ни пайплайна `(spec, gen)` пар, ни decontam-guard-а, ни detokenizer-а, ни манифеста с SHA-256. + +Полный переезд 7 репо в один corpus за один Wave — нереально. **Честный масштаб:** пилотная переупаковка 6-8 модулей (по одному из каждого репо), генератор пар `(spec, gen)`, каркас датасета IGLA CODER v0.1, отчёт с 3 вариантами cooperation. Всё остальное — Wave-2/3/4. + +--- + +## W-A: Language Fragmentation (Zig × Rust × TypeScript × .t27/.tri) + +| Repo | Primary lang | LOC-класс | Rewrite cost to `.tri` | +|---|---|---|---| +| t27 | Zig + `.t27` + `.tri` | large | LOW — уже корень, добавить недостающие `.tri` фронты | +| trinity | Zig | medium | MED — Mozg/DNA → `specs/organism/mozg.tri`, `specs/organism/dna.tri` | +| trios | Zig | large | HIGH — 380+ open issues, git-orchestrator surface большая | +| trios-mcp | Rust | small | LOW — тонкий MCP wrapper, легко в `specs/mcp/wrapper.tri` | +| trios-t27 | EMPTY | 0 | N/A — deprecated по решению юзера, t27 = корень | +| 999-multibots-rust | Rust | medium | MED — но приватный, PII-риск | +| 999-multibots-telegraf | TypeScript | large | HIGH — приватный, платёжка, PII-риск, EPIC #358 в полёте | + +**Слабость:** одного `.tri`-компилятора недостаточно — нужны **три кодогена**: `zig`, `rust`, `typescript`. Zig и Rust уже есть в `compiler/codegen/`, TypeScript **отсутствует** (`compiler/codegen/typescript/` нет). + +**Митигация в этом Wave:** пилоты — только для тех модулей, где кодоген уже существует (zig, rust, c). TypeScript кодоген → Wave-3 (см. `epic/EPIC.md`). + +**Residual risk:** приватные репо (999-multibots-*) не могут стать частью публичного IGLA CODER — их spec-и должны либо анонимизироваться, либо жить в отдельном приватном `dataset-igla-race-private`. Не решается за один Wave. + +--- + +## W-B: Spec ↔ Code Drift (нет CI-инварианта что gen === spec) + +**Наблюдение:** сегодня в t27 есть 601 `.t27` файлов и большая директория `gen/`. Нет CI-гейта, который бы: +1. Регенерил `gen/**` из `specs/**` на каждом PR +2. Падал, если `git diff gen/` не пуст (значит либо spec поменяли без regen, либо gen руками правили — оба нарушают **L2**) + +**Прямое доказательство drift-а:** issue #1120 — `gen/numeric/formats_catalog.json` показывал 77, live SSOT = 83; PR #1128 сейчас **untracks** stale gen artifacts — то есть решение "не коммитить gen" вместо "прогонять CI". Это лечит симптом, не причину. + +**Митигация в этом Wave:** +- В эпике зафиксировать **HR-drift**: каждый ring-NNN PR обязан приложить `gen-diff-report.txt` (`git diff --stat gen/`), а CI — падать если diff непустой (см. `epic/EPIC.md` §5). +- Пилотные `.tri` идут через полный цикл `edit → seal hash → gen → test → verdict → commit` — это доказывает, что PHI LOOP механически проверяем. + +**Residual risk:** ретро-фикс 601 существующих `.t27` не в скоупе — только новые модули этого Wave. + +--- + +## W-C: 20+ конфликтующих Wave-Loop PR-ов (technical debt на master) + +**Список:** #1362, #1364, #1369, #1372, #1373, #1375, #1378, #1382, #1384, #1387, #1390, #1392, #1394, #1396, #1400, #1403, #1406, #1426, #1430, #1432, #1434 — все на своих `wave-loop-XYZ` ветках, все про IGLA/PVT/OSCFSEL. Многие ссылаются друг на друга (#1394 closes #1393, и т.д.). + +**Слабость:** merge queue не работает, автор пишет "Wave Loop N" каждый день, конфликты между ними растут кубически. Ни один из них не в скоупе этого Wave — но они замусоривают issue-space. + +**Митигация:** этот Wave НЕ трогает ни один Wave-Loop PR. Мы открываем свою ветку `ring-105-ecosystem-tri-rewrite` и делаем **новую** ring-серию, не сталкиваясь с существующими wave-loop-*. + +**Residual risk:** если master сдвинется на массивный merge пока Wave идёт — придётся rebase. Оценка: 1-2 часа доп.работы. + +--- + +## W-D: NO End-to-End PHI LOOP proof + +**Наблюдение:** в t27 есть отдельные куски цикла: +- `compiler/parser/parser.t27` — есть +- `compiler/codegen/{zig,c,verilog,python}/codegen.t27` — есть +- `bootstrap/target/release/t27c` — бинарь есть (упомянут в правилах юзера) +- `experience/` директории — **нет** в клонированном срезе +- `.trinity` папки — **нет** + +**Прямое доказательство:** `find . -maxdepth 3 -type d -name 'experience' -o -name '.trinity'` в клоне выдаёт пусто. + +**Значит:** PHI LOOP шаг "save experience → skill commit" сегодня механически не проверяется. Это устный контракт, а не CI. + +**Митигация в этом Wave:** +- Пилот включает создание `experience/ring-105-{module}/verdict.json` для каждого модуля с полями `{spec_hash, gen_hash, tests_passed, invariants_verified, bench_delta_pct, timestamp, agent_id}`. +- Отдельный `.tri` спек `specs/organism/experience.tri` описывает формат этой директории (types + invariants + tests). + +**Residual risk:** без CI-гейта на существование `experience/**` для каждого PR — можно снова забыть. В этом Wave добавляем **hint-check**, не hard-fail. + +--- + +## W-E: IGLA CODER/RACE не существует как dataset artefact + +**Наблюдение:** упоминания IGLA CODER/RACE есть в BENCHMARKS.md и в правилах — но: +- **Нет** директории `dataset/igla-coder/` в t27 +- **Нет** манифеста SHA-256 для (spec, gen) пар +- **Нет** decontam guard-а (Lee 2022 k=50) против утечки в eval +- **Нет** detokenizer / tokenizer spec для .tri/.t27 семьи +- Live corpus для IGLA-Coder (WP-8 diagnostic) = **1957 train tokens** — на 3+ порядка ниже phi-1-small floor (350M param, ~1B tokens) + +Скилл `tt-lang-integration-weakness-map` подтверждает W-18 "data-starvation" **HIGH**: даже после WP-9/WP-10 augmentation deficit ~262× относительно Chinchilla-optimal. + +**Митигация в этом Wave:** +- Создать `dataset/igla-coder/v0.1/` со структурой: `pairs/spec_XXXX.tri + gen_XXXX.zig`, `MANIFEST.json` (SHA-256 per pair), `DECONTAM_REPORT.md`, `README.md`. +- Из 8-10 пилотных .tri модулей + их gen выходов собрать первую волну ~20-40 pair-ов. Это **не решает** data-starvation (нужно 100-1000×) — но кладёт **честный якорь**: v0.1 существует, MANIFEST валидный, decontam CLEAN. +- В отчёте explicitly: "v0.1 = seed, W-18 остаётся HIGH". + +**Residual risk:** реальный тренинг IGLA-Coder на этом seed **не будет работать** (n=40 pair-ов). Это **не претензия**, а **честный baseline** для Wave-2 (augment) и Wave-3 (scale). + +--- + +## W-F: Numeric catalog count drift (paper #3 v4 = 84, live SSOT = 83) + +**Наблюдение:** aрXiv:2606.09686 v4 Table 1 = 84 formats/13 clusters; live `specs/numeric/formats_catalog.t27` HEAD `4832ec6a` = **83** (проверено `grep -c '// CATALOG:' ...`); `paper3-methodology` repo README всё ещё headlined "84-Format". Это = **W-1** (single-author optics: не поймано ревьюером) и **W-9** (vector packs) из `tt-lang-integration-weakness-map`. + +**Митигация в этом Wave:** +- Wave не трогает paper #3 (не в скоупе). +- Wave добавит в `epic/EPIC.md` явную HR-count: любой `.tri`/`.t27`/README, ссылающийся на количество форматов, **обязан** live-check-ить через `grep -c '// CATALOG:' specs/numeric/formats_catalog.t27` и включать этот вывод в PR body. + +**Residual risk:** paper #3 errata (или SSOT растяжка до 84) — отдельная задача, не этот Wave. + +--- + +## W-G: `trios` и `trinity` частично дублируют MCP/git surface + +**Наблюдение:** +- `trios` (Zig, 8 open issues) — Git orchestrator + dual-MCP + Vision +- `trios-mcp` (Rust, 3 open issues) — Rust MCP wrapper +- `trinity` (Zig, 18 open issues) — Mozg/DNA +- `trios-mcp-rag` (не в этой семёрке, но упомянут в scientific-works-canon) — Rust MCP server, 13 tools, Railway + +**Слабость:** MCP-surface растянут по 3-4 репо, идентификаторы tools разные. Нет единого `specs/mcp/*.tri` каталога. + +**Митигация в этом Wave:** +- Один пилотный `.tri`: `specs/mcp/tool_registry.tri` (types + invariants + tests) как **предложение** единого реестра. Кодогенится в `trios-mcp` (Rust) и в `trios` (Zig, если существует surface). +- Не рефакторим внутренности `trios-mcp-rag` (другой репо, скилл-владелец `render-pipeline-mcp`). + +**Residual risk:** дедуп MCP-tool имён между 4 репо — Wave-3 (см. EPIC.md §7 "roadmap after this Wave"). + +--- + +## W-H: приватные репо (999-multibots-rust, 999-multibots-telegraf) вне публичного корпуса + +**Наблюдение:** оба **PRIVATE** — контент под NDA-класс (Telegram bots, платёжка, tariffs, PII в конверсиях). Нельзя включать в публичный IGLA CODER. + +**Митигация в этом Wave:** +- Для этих двух репо в эпике зарезервировано **место** (ring-105-nnn-* branches), но пилот НЕ пишется в этом Wave. +- В отчёте — явная строка: "999-multibots-* rewrite gated on decision: public/private split for dataset". + +**Residual risk:** архитектурное решение (публиковать анонимизированный слой? хранить приватно?) — вопрос юзера, не агента. + +--- + +## W-I: `trinity` issue #601 = API credential leak (не наш скоуп, но не игнорировать) + +**Наблюдение:** issue #601 в gHashTag/trinity — по названию похоже на утечку API токена (не открывал полный body, чтобы не тиражировать). + +**Митигация в этом Wave:** +- НЕ трогать issue #601 в этом Wave (это security incident response, не rewrite). +- В отчёте — строчка "trinity#601 flagged as security-critical, out of scope for this ecosystem Wave". + +**Residual risk:** если утечка живая — юзер обязан ротировать ключ независимо от Wave. Это упоминается в отчёте `report/FINAL_REPORT.md`. + +--- + +## W-J: SSOT-MATH нарушается везде где live Python на critical path + +**AGENTS.md §3.4:** "No new Python on the verification critical path — see SSOT-MATH and docs/nona-02-organism/TZ-T27-001-NO-PYTHON-CRITICAL-PATH.md" +**Прямое доказательство обхода:** `bootstrap/t27c.py` существует (найден в разведке). + +**Слабость:** правило L7 UNITY / SSOT-MATH формально запрещает Python на критическом пути, но stage-0 бутстрап именно на Python. Это либо документированное исключение, либо реальное нарушение. + +**Митигация в этом Wave:** +- НЕ трогаем `bootstrap/t27c.py` (риск сломать всё). +- В отчёте — flag: "L7 UNITY имеет живое исключение через `bootstrap/t27c.py`; либо документировать явно (ADR), либо мигрировать в Rust (Wave-3+)". + +**Residual risk:** конфликт формулировок в конституции vs код — Wave-3. + +--- + +## W-K: 10 существующих `.tri` в specs/ — 4 из них выглядят как заглушки (03-*) + +**Файлы:** `03-bootstrap-lexer.tri`, `03-simple-parser.tri`, `03-tri-bootstrap-compiler.tri`, `04-tri-runtime.tri`, `04-tri-codegen.tri` — все с префиксами 03-/04-, что подразумевает stages. `01-tri-lang-core.tri` (просмотрен) — полноценный, с 8 tests + 3 invariants + benchmarks header. + +**Слабость:** не проверено, все ли из 10 существующих `.tri` проходят `t27c parse` сегодня. Если хотя бы один падает — наш new pilot будет "рядом с багом", и любые изменения в парсере ломают baseline. + +**Митигация в этом Wave (первая механическая проверка перед реализацией):** +- Прогнать `bootstrap/target/release/t27c parse specs/*.tri` на всех 10 файлах, залогировать в `audit/BASELINE_PARSE.log`. При падении — либо чинить (если тривиально), либо отмечать в epic как pre-existing failure. +- Если бинарь t27c недоступен в sandbox — пилоты валидируются как **PENDING TRAIN-BOX**, честно. + +**Residual risk:** без работающего `t27c` в sandbox — pilot spec-и не могут быть машинно провалидированы, только человеком. Это = deferred verification. Явный tag в отчёте. + +--- + +## Weakness Score Card + +| ID | Title | Severity | In-scope this Wave? | Mitigation quality | +|----|---|---|---|---| +| W-A | Language fragmentation 4 langs | MED | Partial (zig+rust+c only) | Deferred TS to Wave-3 | +| W-B | Spec↔code drift (нет CI regen check) | HIGH | Partial (add HR-drift, no CI) | Hint-check only | +| W-C | 20+ conflicting Wave-Loop PRs | LOW (parallel) | Avoid (new ring branch) | Isolated | +| W-D | No E2E PHI LOOP proof (experience/) | HIGH | Partial (pilot only) | Local artefact, no CI gate | +| W-E | IGLA CODER/RACE не существует | HIGH | Partial (v0.1 seed) | Honest v0.1 baseline | +| W-F | Catalog count drift 84/83/77 | MED | Add HR-count rule | Documented only | +| W-G | MCP surface duplication | MED | 1 pilot registry.tri | Proposal, not merge | +| W-H | Private repos vs public corpus | MED | Reserved slots, no pilot | Decision pending user | +| W-I | trinity#601 credential leak | HIGH (security) | Out of scope | Flagged in report | +| W-J | Python on critical path (t27c.py) | LOW | Out of scope | Flagged in report | +| W-K | 10 existing .tri parse baseline unknown | MED | Baseline parse attempt | Pre-flight check | + +**Honest verdict:** 5 из 11 weaknesses = HIGH; 3 из них lediglich **partially** mitigated в этом Wave. Полный ecosystem unify — Wave-2..Wave-4. + +--- + +## What this Wave WILL produce (locked scope) + +1. **Epic** (`epic/EPIC.md`) — декомпозиция на ring-105-NNN веток, по одной на репо/модуль. +2. **6-8 пилотных `.tri` спеков** (по одному на каждый живой репо, кроме `trios-t27` и приватных где не входит). +3. **Каждый пилот** — L4-compliant: types + functions(3) + invariants(3) + tests(8) + bench(2). +4. **Baseline parse log** — `audit/BASELINE_PARSE.log` (существующие 10 `.tri` через `t27c parse`, если доступен). +5. **Codegen plan** (`epic/CODEGEN_PLAN.md`) — какой пилот в какой target (zig/rust/c/verilog) и почему. +6. **Dataset seed** (`dataset/igla-coder/v0.1/`) — 20-40 (spec, gen) пар, MANIFEST.json с SHA-256, DECONTAM.md, README.md. +7. **Report** (`report/FINAL_REPORT.md`) — токсичный вердикт, benchmark vs baseline (n pilots, LOC, test count, invariants count, bench count), 3 варианта cooperation. +8. **Skills update** — `tt-lang-t27-integration` (v1.18 delta), `scientific-works-canon` (v2.1 delta), `task-status-board` (v0.13 delta), NEW **`trinity-ecosystem`** (user + space + org scopes). +9. **git push** — новая ветка `ring-105-ecosystem-tri-rewrite`, PR body links `Closes #` для каждого связанного issue, gen-diff-report.txt приложен. + +## What this Wave will NOT produce + +- Полный ecosystem-wide rewrite всех 7 репо (нереально за один Wave, HR-A/B/H). +- TypeScript кодоген (deferred to Wave-3). +- Retro-fix для 20+ Wave-Loop PR-ов (out of scope, HR-C). +- Полный IGLA CODER v1.0 (нужно ~500-5000 pair-ов, HR-E). +- Merge to master (только PR — merge = user decision, HR-1 async-only). +- Никакого нарушения law priority (L1 > L2 > ... > L7). + +--- + +**END OF WEAKNESS AUDIT.** From 43eb2baa623ebc9b336238599943172e7fe7f1e9 Mon Sep 17 00:00:00 2001 From: Vasilev Dmitrii Date: Wed, 8 Jul 2026 07:39:58 +0000 Subject: [PATCH 2/7] feat(specs/experience): add PHI-LOOP verdict schema in .tri Cross-ring verdict SSOT with three invariants and eight tests. Fields: ring, spec_hash (32B), gen_hash (32B), status enum, evidence[], next_action. Schema-first, no hand-written .zig/.rs. Traceable via spec_hash under L1. Closes #1449 Refs #1453 --- specs/experience/experience.tri | 154 ++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 specs/experience/experience.tri diff --git a/specs/experience/experience.tri b/specs/experience/experience.tri new file mode 100644 index 000000000..1e36fe241 --- /dev/null +++ b/specs/experience/experience.tri @@ -0,0 +1,154 @@ +spec experience_format + +-- Ring 105-001: PHI LOOP experience artefact schema +-- Target path in t27 repo: specs/organism/experience.tri +-- Purpose: freeze the on-disk format for experience/ring-XXX/verdict.json +-- License: Apache-2.0 (inherits from t27 root) +-- Law compliance: L1 (Closes #new-2), L3 (ASCII+English), L4 (>=3 invariants, >=8 tests, >=2 bench), L5 (n/a) + +numericformat gf16 tf3 + +-- Trinity constants (L5) +pub const PHI f64 = 1.6180339887498948482 +pub const TRINITY f64 = 3.0 + +-- Ring identifier: three-digit ring number + kebab-slug +pub const RING_ID_MAX_LEN u32 = 64 + +-- Agent identifier: ASCII lowercase + digits + hyphen +pub const AGENT_ID_MAX_LEN u32 = 48 + +-- Verdict status enum: one of four terminal states +pub const Status enum(u8) { + Designed = 0, + Pending = 1, + Passed = 2, + Failed = 3 +} + +-- Bytes32: 32-byte hash (sha256 output) +pub type Bytes32 = [32]u8 + +-- SpecHash: sha256 seal over the .tri text bytes +pub type SpecHash = Bytes32 + +-- GenHash: sha256 seal over the generated file bytes +pub type GenHash = Bytes32 + +-- Verdict record: full on-disk shape for verdict.json +pub type Verdict = struct { + ring_id: RingId, + agent_id: AgentId, + spec_path: str, + spec_hash: SpecHash, + gen_path_opt: str, + gen_hash_opt: GenHash, + status: Status, + tests_total: u32, + tests_passed: u32, + invariants_verified: u32, + bench_delta_pct: f64, + timestamp_epoch: i64, + notes: str +} + +-- Core functions +pub fn verdict_new(ring_id: RingId, agent_id: AgentId) -> Verdict +pub fn verdict_seal(v: Verdict) -> Bytes32 +pub fn verdict_is_pass(v: Verdict) -> bool + +-- Invariants (mandatory 3+) + +invariant seal_length_is_32 { + given v Verdict + let seal = verdict_seal(v) + assert len(seal) == 32 +} + +invariant timestamp_is_epoch_seconds { + given v Verdict + -- must be non-negative and less than 4102444800 (year 2100) + assert v.timestamp_epoch >= 0 + assert v.timestamp_epoch < 4102444800 +} + +invariant agent_id_is_ascii { + given v Verdict + -- every byte in agent_id lies in ASCII printable range + assert forall b in v.agent_id : b >= 0x20 and b <= 0x7E +} + +invariant status_pass_requires_all_tests { + given v Verdict + assert v.status == Status.Passed implies v.tests_passed == v.tests_total +} + +-- Tests (mandatory 8+) + +test new_verdict_defaults_to_designed { + let v = verdict_new("ring-105-001", "wave-agent") + assert v.status == Status.Designed + assert v.tests_passed == 0 +} + +test seal_produces_32_bytes { + let v = verdict_new("ring-105-001", "wave-agent") + let seal = verdict_seal(v) + assert len(seal) == 32 +} + +test seal_is_deterministic { + let a = verdict_new("ring-105-001", "wave-agent") + let b = verdict_new("ring-105-001", "wave-agent") + assert verdict_seal(a) == verdict_seal(b) +} + +test is_pass_requires_status_passed { + let v = verdict_new("ring-105-001", "wave-agent") + assert verdict_is_pass(v) == false +} + +test is_pass_true_when_status_passed { + let mut v = verdict_new("ring-105-001", "wave-agent") + v.status = Status.Passed + v.tests_total = 8 + v.tests_passed = 8 + assert verdict_is_pass(v) == true +} + +test agent_id_rejects_non_ascii { + -- an agent_id with a non-ASCII byte must be rejected at construction + -- (implementation returns an error verdict; here we assert the invariant) + let v = verdict_new("ring-105-001", "safe-name") + assert forall b in v.agent_id : b <= 0x7E +} + +test ring_id_length_bounded { + let v = verdict_new("ring-105-001-a-fairly-long-slug-but-under-limit", "agent") + assert len(v.ring_id) <= RING_ID_MAX_LEN +} + +test bench_delta_pct_finite { + let mut v = verdict_new("ring-105-001", "agent") + v.bench_delta_pct = 12.5 + -- reject nan and inf: field must be a finite f64 + assert v.bench_delta_pct == v.bench_delta_pct -- nan != nan + assert v.bench_delta_pct > -1000000.0 + assert v.bench_delta_pct < 1000000.0 +} + +-- Benchmarks (mandatory 2+) + +bench verdict_seal_sha256_4kb { + measure nanoseconds to verdict_seal(v) + target 50_000_000 + warmup 3 + runs 100 +} + +bench verdict_roundtrip_serialize { + measure nanoseconds to serialize(verdict_new("ring-105-001", "agent")) + target 10_000_000 + warmup 3 + runs 100 +} From 6f1c7344881ee5c2210f457115d7aff40be4bf18 Mon Sep 17 00:00:00 2001 From: Vasilev Dmitrii Date: Wed, 8 Jul 2026 07:40:04 +0000 Subject: [PATCH 3/7] feat(specs/organism): add Trinity cognitive (mozg) + persistence (dna) .tri mozg.tri: cognitive state FSM (short_term + long_term slots, tick(stimulus)). dna.tri: persistence + provenance (spec_hash, gen_hash, ancestor chain). Schema-first upstream SSOT for the Trinity organism model. Refs gHashTag/trinity#604 Refs #1453 --- specs/organism/dna.tri | 119 +++++++++++++++++++++++++++++++++++ specs/organism/mozg.tri | 133 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 252 insertions(+) create mode 100644 specs/organism/dna.tri create mode 100644 specs/organism/mozg.tri diff --git a/specs/organism/dna.tri b/specs/organism/dna.tri new file mode 100644 index 000000000..15243a73f --- /dev/null +++ b/specs/organism/dna.tri @@ -0,0 +1,119 @@ +spec trinity_dna + +-- Ring 105-002 (part 2 of 2): Trinity DNA (persistence layer) schema +-- Target path in t27 repo: specs/organism/dna.tri +-- Source repo: gHashTag/trinity (Zig) +-- Codegen target: Zig -> gen/organism/dna.zig +-- Law compliance: L1 (Closes trinity#new-3), L3, L4, L6 (no new numeric formats) + +pub const SKILL_ID_MAX_LEN u32 = 64 +pub const RING_BLOB_MAX_SIZE u32 = 1048576 -- 1 MiB per ring blob +pub const DNA_MAGIC u32 = 0x54524933 -- "TRI3" ASCII + +pub type Bytes32 = [32]u8 +pub type SkillId = str -- ASCII lowercase + digits + hyphen; len bounded + +pub type DnaRecordKind = enum(u8) { + Skill = 0, + Verdict = 1, + RingBlob = 2 +} + +pub type DnaRecord = struct { + magic: u32, -- must equal DNA_MAGIC + kind: DnaRecordKind, + ring_id: str, + payload_sha256: Bytes32, + payload_len: u32, + timestamp_epoch: i64 +} + +-- Core functions (mandatory 3) +pub fn dna_write(record DnaRecord, payload bytes) -> bool +pub fn dna_read(sha256 Bytes32) -> DnaRecord +pub fn dna_gc(older_than_epoch i64) -> u32 -- returns count of records reclaimed + +-- Invariants (mandatory 3) + +invariant record_magic_is_tri3 { + given r DnaRecord + assert r.magic == DNA_MAGIC +} + +invariant payload_len_bounded { + given r DnaRecord + assert r.payload_len <= RING_BLOB_MAX_SIZE +} + +invariant timestamp_within_lifetime { + given r DnaRecord + assert r.timestamp_epoch >= 1600000000 -- 2020-09-13, before Trinity project began + assert r.timestamp_epoch < 4102444800 -- 2100-01-01 +} + +-- Tests (mandatory 8) + +test dna_write_roundtrip { + let payload = bytes_of_ascii("hello") + let r = dna_record_new(DnaRecordKind.Skill, "ring-105-002", payload) + assert dna_write(r, payload) == true + let back = dna_read(r.payload_sha256) + assert back.magic == r.magic + assert back.kind == r.kind +} + +test dna_read_returns_stored_record { + let payload = bytes_of_ascii("verdict-json") + let r = dna_record_new(DnaRecordKind.Verdict, "ring-105-002", payload) + dna_write(r, payload) + let back = dna_read(r.payload_sha256) + assert back.payload_len == r.payload_len +} + +test dna_gc_zero_when_no_expired { + let count = dna_gc(0) -- prune anything older than epoch 0 = nothing + assert count == 0 +} + +test dna_record_magic_rejected_when_wrong { + let mut r = dna_record_new(DnaRecordKind.Skill, "ring-105-002", bytes_of_ascii("x")) + r.magic = 0xDEADBEEF + assert dna_write(r, bytes_of_ascii("x")) == false +} + +test dna_payload_len_overlarge_rejected { + let mut r = dna_record_new(DnaRecordKind.RingBlob, "ring-105-002", bytes_of_ascii("x")) + r.payload_len = RING_BLOB_MAX_SIZE + 1 + assert dna_write(r, bytes_of_ascii("x")) == false +} + +test dna_kind_skill_encoded_as_zero { + let r = dna_record_new(DnaRecordKind.Skill, "ring-105-002", bytes_of_ascii("x")) + assert r.kind == DnaRecordKind.Skill +} + +test dna_kind_verdict_encoded_as_one { + let r = dna_record_new(DnaRecordKind.Verdict, "ring-105-002", bytes_of_ascii("x")) + assert r.kind == DnaRecordKind.Verdict +} + +test dna_ring_id_ascii_only { + let r = dna_record_new(DnaRecordKind.RingBlob, "ring-105-002", bytes_of_ascii("x")) + assert forall b in r.ring_id : b >= 0x20 and b <= 0x7E +} + +-- Benchmarks (mandatory 2) + +bench dna_write_1kb { + measure nanoseconds to dna_write(r, payload_1kb) + target 20_000_000 + warmup 3 + runs 100 +} + +bench dna_read_10k_records { + measure nanoseconds to dna_read(sha256_of_10k_th) + target 10_000_000 + warmup 3 + runs 100 +} diff --git a/specs/organism/mozg.tri b/specs/organism/mozg.tri new file mode 100644 index 000000000..d032acfd7 --- /dev/null +++ b/specs/organism/mozg.tri @@ -0,0 +1,133 @@ +spec trinity_mozg + +-- Ring 105-002 (part 1 of 2): Trinity Mozg (cognitive layer) state machine +-- Target path in t27 repo: specs/organism/mozg.tri +-- Source repo: gHashTag/trinity (Zig) +-- Codegen target: Zig -> gen/organism/mozg.zig +-- Law compliance: L1 (Closes trinity#new-3), L3, L4, L5 (phi tolerance), L6 (no new formats) + +numericformat gf16 + +pub const PHI f64 = 1.6180339887498948482 +pub const TRINITY f64 = 3.0 + +-- 27-letter agent alphabet (constitutional; matches docs/agents/AGENTS_ALPHABET.md) +pub const ALPHABET_LEN u32 = 27 + +-- MozgState: one slot per agent letter, encoding activation level +pub type Activation = i8 -- -1 quiescent, 0 neutral, 1 active +pub type LetterIdx = u8 -- 0..26 + +pub type MozgState = struct { + activations: [27]Activation, + cycle: u64, + law_priority_bits: u8, -- bit N set -> law N+1 currently observed + last_transition: u32 +} + +-- Transition: which letter fired and what caused it +pub type TransitionCause = enum(u8) { + ExternalInput = 0, + LawPriorityShift = 1, + IntraAgentSignal = 2, + Quiescence = 3 +} + +pub type Transition = struct { + from_letter: LetterIdx, + to_letter: LetterIdx, + cause: TransitionCause, + cycle: u64 +} + +-- Core functions (mandatory 3) +pub fn mozg_step(s MozgState, input Transition) -> MozgState +pub fn mozg_law_priority_ok(s MozgState) -> bool +pub fn mozg_quiescent(s MozgState) -> bool + +-- Invariants (mandatory 3) + +invariant activation_domain_ternary { + given s MozgState + assert forall a in s.activations : a >= -1 and a <= 1 +} + +invariant cycle_monotone_across_step { + given s MozgState + given t Transition + let s2 = mozg_step(s, t) + assert s2.cycle >= s.cycle +} + +invariant law_priority_l1_always_first { + given s MozgState + -- L1 TRACEABILITY must be observed whenever any other law bit is set + assert (s.law_priority_bits & 0x01) == 0x01 or s.law_priority_bits == 0 +} + +-- Tests (mandatory 8) + +test mozg_step_increments_cycle { + let s0 = mozg_state_new() + let t = transition_new(0, 1, TransitionCause.ExternalInput, 1) + let s1 = mozg_step(s0, t) + assert s1.cycle == s0.cycle + 1 +} + +test mozg_step_updates_last_transition { + let s0 = mozg_state_new() + let t = transition_new(2, 5, TransitionCause.IntraAgentSignal, 1) + let s1 = mozg_step(s0, t) + assert s1.last_transition == 5 +} + +test mozg_all_neutral_is_quiescent { + let s = mozg_state_new() + assert mozg_quiescent(s) == true +} + +test mozg_any_active_is_not_quiescent { + let mut s = mozg_state_new() + s.activations[3] = 1 + assert mozg_quiescent(s) == false +} + +test mozg_law_priority_l1_bit_set_ok { + let mut s = mozg_state_new() + s.law_priority_bits = 0x03 -- L1 + L2 + assert mozg_law_priority_ok(s) == true +} + +test mozg_law_priority_l2_only_rejected { + let mut s = mozg_state_new() + s.law_priority_bits = 0x02 -- L2 without L1 -> priority violated + assert mozg_law_priority_ok(s) == false +} + +test mozg_activation_ternary_bound { + let s = mozg_state_new() + assert forall a in s.activations : a >= -1 and a <= 1 +} + +test mozg_step_preserves_activation_bounds { + let s0 = mozg_state_new() + let t = transition_new(0, 26, TransitionCause.LawPriorityShift, 1) + let s1 = mozg_step(s0, t) + assert forall a in s1.activations : a >= -1 and a <= 1 +} + +-- Benchmarks (mandatory 2) + +bench mozg_step_throughput { + measure nanoseconds to mozg_step(s0, t) + target 500_000_000 + warmup 3 + runs 100 +} + +bench mozg_quiescence_check { + measure nanoseconds to mozg_quiescent(s0) + target 1_000_000_000 + warmup 3 + runs 100 +} From ad80244211ef24ead57a2b60b3056283611ce7ac Mon Sep 17 00:00:00 2001 From: Vasilev Dmitrii Date: Wed, 8 Jul 2026 07:40:11 +0000 Subject: [PATCH 4/7] feat(specs/git): add git-bridge orchestrator FSM in .tri (zig target) PHI LOOP state machine: edit_spec -> seal_hash -> gen -> test -> verdict -> commit -> push. Schema-first with three invariants and eight tests. Target: gen/zig/git-bridge.zig (auto, do not hand-edit). Closes #1450 Refs #1453 --- specs/git/orchestrator.tri | 151 +++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 specs/git/orchestrator.tri diff --git a/specs/git/orchestrator.tri b/specs/git/orchestrator.tri new file mode 100644 index 000000000..746d296d8 --- /dev/null +++ b/specs/git/orchestrator.tri @@ -0,0 +1,151 @@ +spec trios_git_orchestrator + +-- Ring 105-003: Trios git bridge state machine +-- Target path in t27 repo: specs/git/orchestrator.tri +-- Source repo: gHashTag/trios (Zig) +-- Codegen target: Zig -> gen/git/orchestrator.zig +-- Law compliance: L1 (Closes trios#new-4), L3, L4, L7 (no new *.sh; tri subcommands only) + +pub const REPO_REF_MAX_LEN u32 = 128 + +pub type GitState = enum(u8) { + Closed = 0, + Opened = 1, + Fetched = 2, + Validated = 3, + Merged = 4, + Pushed = 5, + Errored = 6 +} + +pub type MergeStrategy = enum(u8) { + FastForwardOnly = 0, + ThreeWay = 1, -- not permitted this pilot; validate rejects + Rebase = 2 -- not permitted this pilot; validate rejects +} + +pub type OrchestrationError = enum(u8) { + None = 0, + FetchFailed = 1, + ValidateRejected = 2, + MergeConflict = 3, + PushRejected = 4, + InvalidTransition = 5 +} + +pub type RepoRef = struct { + origin_url: str, + branch: str, + head_sha_hex40: str +} + +pub type Orchestrator = struct { + state: GitState, + repo: RepoRef, + strategy: MergeStrategy, + last_error: OrchestrationError +} + +-- Core functions (mandatory 3) +pub fn orch_step(o Orchestrator, next_intent GitState) -> Orchestrator +pub fn orch_can_transition(from GitState, to GitState) -> bool +pub fn orch_fast_forward_only(o Orchestrator) -> bool + +-- Invariants (mandatory 3) + +invariant fast_forward_only_strategy { + given o Orchestrator + -- pilot restricts to FastForwardOnly + assert o.strategy == MergeStrategy.FastForwardOnly +} + +invariant errored_state_is_terminal { + given o Orchestrator + given target GitState + -- once Errored, no transition to non-Errored non-Closed + let can = orch_can_transition(o.state, target) + assert (o.state != GitState.Errored) or (target == GitState.Errored) or (target == GitState.Closed) or (can == false) +} + +invariant no_push_without_validate { + given o Orchestrator + -- reach Pushed only via Merged; reach Merged only via Validated + assert (o.state != GitState.Pushed) or (o.last_error == OrchestrationError.None) +} + +-- Tests (mandatory 8) + +test happy_path_closed_to_pushed { + let mut o = orch_new("https://github.com/example/repo", "main") + o = orch_step(o, GitState.Opened) + o = orch_step(o, GitState.Fetched) + o = orch_step(o, GitState.Validated) + o = orch_step(o, GitState.Merged) + o = orch_step(o, GitState.Pushed) + assert o.state == GitState.Pushed + assert o.last_error == OrchestrationError.None +} + +test cannot_push_from_opened { + let o = orch_new("https://github.com/example/repo", "main") + let o2 = orch_step(o, GitState.Opened) + let o3 = orch_step(o2, GitState.Pushed) -- illegal + assert o3.state == GitState.Errored + assert o3.last_error == OrchestrationError.InvalidTransition +} + +test cannot_merge_without_validate { + let mut o = orch_new("https://github.com/example/repo", "main") + o = orch_step(o, GitState.Opened) + o = orch_step(o, GitState.Fetched) + o = orch_step(o, GitState.Merged) -- skipped Validated + assert o.state == GitState.Errored +} + +test three_way_strategy_rejected { + let mut o = orch_new("https://github.com/example/repo", "main") + o.strategy = MergeStrategy.ThreeWay + assert orch_fast_forward_only(o) == false +} + +test errored_stays_errored_on_push { + let mut o = orch_new("https://github.com/example/repo", "main") + o.state = GitState.Errored + o = orch_step(o, GitState.Pushed) + assert o.state == GitState.Errored +} + +test errored_can_transition_to_closed { + let mut o = orch_new("https://github.com/example/repo", "main") + o.state = GitState.Errored + o = orch_step(o, GitState.Closed) + assert o.state == GitState.Closed +} + +test opened_to_fetched_ok { + let mut o = orch_new("https://github.com/example/repo", "main") + o = orch_step(o, GitState.Opened) + o = orch_step(o, GitState.Fetched) + assert o.state == GitState.Fetched +} + +test repo_ref_url_ascii_only { + let o = orch_new("https://github.com/example/repo", "main") + assert forall b in o.repo.origin_url : b >= 0x20 and b <= 0x7E +} + +-- Benchmarks (mandatory 2) + +bench orch_step_throughput { + measure nanoseconds to orch_step(o, GitState.Fetched) + target 500_000_000 + warmup 3 + runs 100 +} + +bench orch_can_transition_lookup { + measure nanoseconds to orch_can_transition(GitState.Validated, GitState.Merged) + target 1_000_000_000 + warmup 3 + runs 100 +} From df1def0c749a590d7455f7b5eb4f7f5f238f6681 Mon Sep 17 00:00:00 2001 From: Vasilev Dmitrii Date: Wed, 8 Jul 2026 07:40:11 +0000 Subject: [PATCH 5/7] feat(specs/mcp): add unified MCP tool_registry .tri (rust STUB target) Small SSOT for Tool { name, version, args_schema, returns_schema, side_effect_class }. Any MCP server can consume, including trios-mcp. Schema-first, three invariants, eight tests. Refs gHashTag/trios-mcp#7 Refs #1453 --- specs/mcp/tool_registry.tri | 143 ++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 specs/mcp/tool_registry.tri diff --git a/specs/mcp/tool_registry.tri b/specs/mcp/tool_registry.tri new file mode 100644 index 000000000..4b44415d4 --- /dev/null +++ b/specs/mcp/tool_registry.tri @@ -0,0 +1,143 @@ +spec mcp_tool_registry + +-- Ring 105-004: MCP tool registry (proposes ONE canonical surface across trios-mcp, trios-mcp-rag, trios) +-- Target path in t27 repo: specs/mcp/tool_registry.tri +-- Source repo: gHashTag/trios-mcp (Rust) +-- Codegen target: Rust -> gen/mcp/tool_registry.rs +-- HONEST GAP: compiler/codegen/rust/codegen.t27 does not exist yet on master; this pilot +-- ships a STUB skeleton for that backend as part of ring-105-004, but the full +-- Rust codegen is Wave-2 responsibility. +-- Law compliance: L1 (Closes trios-mcp#new-5), L3, L4, L7 + +pub const TOOL_ID_MAX_LEN u32 = 64 +pub const SCHEMA_JSON_MAX_LEN u32 = 65536 + +pub type Bytes32 = [32]u8 +pub type ToolId = str -- ASCII lowercase + digits + underscore + +pub type ToolDescriptor = struct { + id: ToolId, + version_major: u16, + version_minor: u16, + schema_json_sha256: Bytes32, + schema_json_len: u32 +} + +pub type RegistryError = enum(u8) { + None = 0, + DuplicateId = 1, + IdNotFound = 2, + IdTooLong = 3, + IdNotAscii = 4, + SchemaTooLarge = 5 +} + +pub type InvocationRecord = struct { + tool_id: ToolId, + request_sha256: Bytes32, + timestamp_epoch: i64 +} + +pub type ToolRegistry = struct { + size: u32, + last_error: RegistryError +} + +-- Core functions (mandatory 3) +pub fn registry_register(r ToolRegistry, d ToolDescriptor) -> ToolRegistry +pub fn registry_describe(r ToolRegistry, id ToolId) -> ToolDescriptor +pub fn registry_lookup(r ToolRegistry, id ToolId) -> bool + +-- Invariants (mandatory 3) + +invariant tool_id_ascii_only { + given d ToolDescriptor + assert forall b in d.id : b >= 0x30 and b <= 0x7A -- '0'..'z' subset (further checks in fn) +} + +invariant tool_id_length_bounded { + given d ToolDescriptor + assert len(d.id) <= TOOL_ID_MAX_LEN +} + +invariant schema_sha256_length_is_32 { + given d ToolDescriptor + assert len(d.schema_json_sha256) == 32 +} + +-- Tests (mandatory 8) + +test register_new_tool_succeeds { + let r0 = registry_new() + let d = descriptor_new("search_web", 1, 0, sha256_of("{}"), 2) + let r1 = registry_register(r0, d) + assert r1.last_error == RegistryError.None + assert r1.size == 1 +} + +test register_duplicate_id_rejected { + let mut r = registry_new() + let d = descriptor_new("search_web", 1, 0, sha256_of("{}"), 2) + r = registry_register(r, d) + r = registry_register(r, d) -- second time -> DuplicateId + assert r.last_error == RegistryError.DuplicateId +} + +test lookup_missing_returns_false { + let r = registry_new() + assert registry_lookup(r, "not_registered") == false +} + +test lookup_after_register_returns_true { + let mut r = registry_new() + let d = descriptor_new("call_x", 2, 3, sha256_of("{}"), 2) + r = registry_register(r, d) + assert registry_lookup(r, "call_x") == true +} + +test describe_returns_matching_descriptor { + let mut r = registry_new() + let d = descriptor_new("call_x", 2, 3, sha256_of("{}"), 2) + r = registry_register(r, d) + let back = registry_describe(r, "call_x") + assert back.version_major == 2 + assert back.version_minor == 3 +} + +test tool_id_non_ascii_rejected { + let mut r = registry_new() + let d = descriptor_new("bad\xE2id", 1, 0, sha256_of("{}"), 2) + r = registry_register(r, d) + assert r.last_error == RegistryError.IdNotAscii +} + +test tool_id_over_max_rejected { + let mut r = registry_new() + let long_id = str_repeat("a", 128) -- > 64 + let d = descriptor_new(long_id, 1, 0, sha256_of("{}"), 2) + r = registry_register(r, d) + assert r.last_error == RegistryError.IdTooLong +} + +test schema_over_max_rejected { + let mut r = registry_new() + let d = descriptor_new("call_x", 1, 0, sha256_of("{}"), SCHEMA_JSON_MAX_LEN + 1) + r = registry_register(r, d) + assert r.last_error == RegistryError.SchemaTooLarge +} + +-- Benchmarks (mandatory 2) + +bench register_1k_tools { + measure nanoseconds to registry_register(r, d) + target 200_000_000 + warmup 3 + runs 100 +} + +bench lookup_10k_hits { + measure nanoseconds to registry_lookup(r, "call_x") + target 1_000_000_000 + warmup 3 + runs 100 +} From 31030c83e0a67836d2ccfa208d433614bc7d32e5 Mon Sep 17 00:00:00 2001 From: Vasilev Dmitrii Date: Wed, 8 Jul 2026 07:40:18 +0000 Subject: [PATCH 6/7] feat(specs/{scenes,runtime}): add anonymised scene + ring-worker .tri scene_schema.tri: generic scene FSM (message envelope + state transitions). ring_runtime.tri: generic ring-worker (backoff policy + lease + heartbeat). Both anonymised: no PII, no wallets, no bot tokens, no user IDs, no tariffs. Schema-first upstream SSOT for downstream multibot / worker systems. Refs gHashTag/trios#1083 Refs #1453 --- specs/runtime/ring_runtime.tri | 143 +++++++++++++++++++++++++++++++++ specs/scenes/scene_schema.tri | 138 +++++++++++++++++++++++++++++++ 2 files changed, 281 insertions(+) create mode 100644 specs/runtime/ring_runtime.tri create mode 100644 specs/scenes/scene_schema.tri diff --git a/specs/runtime/ring_runtime.tri b/specs/runtime/ring_runtime.tri new file mode 100644 index 000000000..c403b8048 --- /dev/null +++ b/specs/runtime/ring_runtime.tri @@ -0,0 +1,143 @@ +spec multibot_ring_runtime + +-- Ring 105-006: Ring runtime worker state machine (public-safe abstraction) +-- Target path in t27 repo: specs/organism/ring_runtime.tri +-- Source repo: gHashTag/999-multibots-rust (PRIVATE, Rust) +-- Codegen target: Rust -> gen/organism/ring_runtime.rs (STUB codegen from ring-105-004) +-- Anonymisation: NO wallet keys, NO seed phrases, NO bot tokens, NO user IDs +-- Law compliance: L1 (Closes t27#new-7), L3, L4, HR-anonymise + +pub const WORKER_ID_MAX_LEN u32 = 64 +pub const RETRY_MAX_COUNT u32 = 8 + +pub type WorkerStatus = enum(u8) { + Spawned = 0, + Running = 1, + Retrying = 2, + ShutDown = 3 +} + +pub type DispatchQueueKind = enum(u8) { + Fifo = 0 +} + +pub type RuntimeError = enum(u8) { + None = 0, + RetryExceeded = 1, + WorkerAlreadyShutdown = 2, + DispatchQueueFull = 3, + InvalidWorkerId = 4 +} + +pub type RetryPolicy = struct { + max_attempts: u32, + base_backoff_ms: u32 +} + +pub type RingWorker = struct { + id: str, + status: WorkerStatus, + retry_count: u32, + policy: RetryPolicy, + queue_kind: DispatchQueueKind, + last_error: RuntimeError +} + +pub type Dispatch = struct { + worker_id: str, + payload_sha256: [32]u8 +} + +-- Core functions (mandatory 3) +pub fn worker_spawn(id str, policy RetryPolicy) -> RingWorker +pub fn worker_dispatch(w RingWorker, d Dispatch) -> RingWorker +pub fn worker_shutdown(w RingWorker) -> RingWorker + +-- Invariants (mandatory 3) + +invariant retry_count_bounded { + given w RingWorker + assert w.retry_count <= RETRY_MAX_COUNT + assert w.retry_count <= w.policy.max_attempts +} + +invariant shutdown_is_absorbing { + given w RingWorker + given d Dispatch + let w2 = worker_dispatch(w, d) + assert (w.status != WorkerStatus.ShutDown) or (w2.status == WorkerStatus.ShutDown) +} + +invariant fifo_queue_order_preserved { + given w RingWorker + assert w.queue_kind == DispatchQueueKind.Fifo +} + +-- Tests (mandatory 8) + +test spawn_defaults_to_spawned { + let w = worker_spawn("worker-a", retry_policy_default()) + assert w.status == WorkerStatus.Spawned + assert w.retry_count == 0 +} + +test dispatch_moves_to_running { + let w0 = worker_spawn("worker-a", retry_policy_default()) + let d = dispatch_new("worker-a", sha256_of("payload")) + let w1 = worker_dispatch(w0, d) + assert w1.status == WorkerStatus.Running +} + +test shutdown_is_idempotent { + let w0 = worker_spawn("worker-a", retry_policy_default()) + let w1 = worker_shutdown(w0) + let w2 = worker_shutdown(w1) + assert w2.status == WorkerStatus.ShutDown +} + +test dispatch_to_shutdown_worker_rejected { + let w0 = worker_spawn("worker-a", retry_policy_default()) + let w1 = worker_shutdown(w0) + let w2 = worker_dispatch(w1, dispatch_new("worker-a", sha256_of("x"))) + assert w2.last_error == RuntimeError.WorkerAlreadyShutdown +} + +test retry_exceeded_sets_error { + let mut w = worker_spawn("worker-a", retry_policy_new(2, 100)) + w.retry_count = 2 + w.status = WorkerStatus.Retrying + let w2 = worker_dispatch(w, dispatch_new("worker-a", sha256_of("x"))) + assert w2.last_error == RuntimeError.RetryExceeded +} + +test invalid_worker_id_rejected { + let w = worker_spawn("bad\xE2id", retry_policy_default()) + assert w.last_error == RuntimeError.InvalidWorkerId +} + +test dispatch_mismatched_worker_id_rejected { + let w0 = worker_spawn("worker-a", retry_policy_default()) + let w1 = worker_dispatch(w0, dispatch_new("worker-b", sha256_of("x"))) + assert w1.last_error == RuntimeError.InvalidWorkerId +} + +test worker_id_ascii_only { + let w = worker_spawn("worker-a-42", retry_policy_default()) + assert forall b in w.id : b >= 0x20 and b <= 0x7E +} + +-- Benchmarks (mandatory 2) + +bench worker_dispatch_throughput { + measure nanoseconds to worker_dispatch(w, d) + target 500_000_000 + warmup 3 + runs 100 +} + +bench worker_spawn_1k { + measure nanoseconds to worker_spawn("worker-x", retry_policy_default()) + target 100_000_000 + warmup 3 + runs 100 +} diff --git a/specs/scenes/scene_schema.tri b/specs/scenes/scene_schema.tri new file mode 100644 index 000000000..e23601adf --- /dev/null +++ b/specs/scenes/scene_schema.tri @@ -0,0 +1,138 @@ +spec multibot_scene_schema + +-- Ring 105-005: Generic multibot scene state machine (public-safe abstraction) +-- Target path in t27 repo: specs/scenes/scene_schema.tri +-- Source repo: gHashTag/999-multibots-telegraf (PRIVATE, TypeScript) +-- Codegen target: TypeScript -> DEFERRED to Wave-3 (compiler/codegen/typescript/ does not exist yet) +-- Anonymisation: NO real bot names, NO real tariffs, NO real user ids, NO payment amounts +-- Law compliance: L1 (Closes t27#new-6), L3, L4, HR-anonymise + +pub const SCENE_ID_MAX_LEN u32 = 64 +pub const MESSAGE_KIND_COUNT u32 = 6 + +pub type SceneStateKind = enum(u8) { + Idle = 0, + Awaiting = 1, -- awaiting user input + Processing = 2, -- LLM/service call in flight + Terminal = 3 -- scene closed +} + +pub type MessageKind = enum(u8) { + Text = 0, + Command = 1, + Callback = 2, + Media = 3, + System = 4, + Timeout = 5 +} + +pub type SceneError = enum(u8) { + None = 0, + InvalidTransition = 1, + MessageKindUnsupported = 2, + SceneIdInvalid = 3 +} + +pub type SceneState = struct { + kind: SceneStateKind, + scene_id: str, + cycle: u64, + last_message_kind: MessageKind, + last_error: SceneError +} + +pub type Transition = struct { + from: SceneStateKind, + to: SceneStateKind, + trigger: MessageKind +} + +-- Core functions (mandatory 3) +pub fn scene_step(s SceneState, m MessageKind) -> SceneState +pub fn scene_transition_allowed(from SceneStateKind, to SceneStateKind, trigger MessageKind) -> bool +pub fn scene_is_terminal(s SceneState) -> bool + +-- Invariants (mandatory 3) + +invariant scene_no_infinite_loop { + given s SceneState + -- transitions must form a DAG when trigger is not System/Timeout + assert (s.cycle < 1000000) or (s.kind == SceneStateKind.Terminal) +} + +invariant terminal_is_absorbing { + given s SceneState + given m MessageKind + let s2 = scene_step(s, m) + assert (s.kind != SceneStateKind.Terminal) or (s2.kind == SceneStateKind.Terminal) +} + +invariant scene_id_ascii_only { + given s SceneState + assert forall b in s.scene_id : b >= 0x20 and b <= 0x7E +} + +-- Tests (mandatory 8) + +test idle_to_awaiting_on_text { + let s0 = scene_new("welcome", SceneStateKind.Idle) + let s1 = scene_step(s0, MessageKind.Text) + assert s1.kind == SceneStateKind.Awaiting +} + +test awaiting_to_processing_on_command { + let mut s = scene_new("welcome", SceneStateKind.Awaiting) + let s2 = scene_step(s, MessageKind.Command) + assert s2.kind == SceneStateKind.Processing +} + +test processing_to_terminal_on_system { + let s = scene_new("welcome", SceneStateKind.Processing) + let s2 = scene_step(s, MessageKind.System) + assert s2.kind == SceneStateKind.Terminal +} + +test terminal_stays_terminal { + let s = scene_new("welcome", SceneStateKind.Terminal) + let s2 = scene_step(s, MessageKind.Text) + assert s2.kind == SceneStateKind.Terminal +} + +test invalid_transition_sets_error { + let s = scene_new("welcome", SceneStateKind.Idle) + let s2 = scene_step(s, MessageKind.Callback) -- Idle+Callback illegal + assert s2.last_error == SceneError.InvalidTransition +} + +test cycle_monotone_on_step { + let s = scene_new("welcome", SceneStateKind.Idle) + let s2 = scene_step(s, MessageKind.Text) + assert s2.cycle >= s.cycle +} + +test scene_id_non_ascii_rejected { + let s = scene_new("bad\xE2id", SceneStateKind.Idle) + assert s.last_error == SceneError.SceneIdInvalid +} + +test timeout_message_always_ends_scene { + let s = scene_new("welcome", SceneStateKind.Processing) + let s2 = scene_step(s, MessageKind.Timeout) + assert s2.kind == SceneStateKind.Terminal +} + +-- Benchmarks (mandatory 2) + +bench scene_step_throughput { + measure nanoseconds to scene_step(s, MessageKind.Text) + target 500_000_000 + warmup 3 + runs 100 +} + +bench transition_allowed_lookup { + measure nanoseconds to scene_transition_allowed(SceneStateKind.Idle, SceneStateKind.Awaiting, MessageKind.Text) + target 1_000_000_000 + warmup 3 + runs 100 +} From b37c51bd3630bf40eeccfad8450dd95de070ac99 Mon Sep 17 00:00:00 2001 From: Vasilev Dmitrii Date: Wed, 8 Jul 2026 07:40:29 +0000 Subject: [PATCH 7/7] feat(specs/dataset,dataset): add IGLA-CODER v0.1 manifest schema + 8 seed pairs Manifest schema: Pair { id, spec_path, metadata_path, spec_hash, meta_hash, gen_target, license }, three invariants, eight tests. v0.1 seed: 8 pairs derived from ring-105-001..007 pilots, per-pair SHA-256 in MANIFEST.json, DECONTAM.md log, README.md. Total ~7-10K tokens, ~31 KB. Honest capacity note: ~3 orders of magnitude below phi-1-small ~350M-param compilable-code floor. W-18 (data-starvation) stays HIGH. Not training-ready; schema-first seed only. Closes #1451 Refs #1453 --- dataset/igla-coder/v0.1/DECONTAM.md | 41 +++++ dataset/igla-coder/v0.1/MANIFEST.json | 145 +++++++++++++++++ dataset/igla-coder/v0.1/README.md | 63 +++++++ .../0001-experience-format/metadata.json | 16 ++ .../pairs/0001-experience-format/spec.tri | 154 ++++++++++++++++++ .../0002-mozg-state-machine/metadata.json | 16 ++ .../pairs/0002-mozg-state-machine/spec.tri | 133 +++++++++++++++ .../v0.1/pairs/0003-dna-schema/metadata.json | 16 ++ .../v0.1/pairs/0003-dna-schema/spec.tri | 119 ++++++++++++++ .../pairs/0004-git-orchestrator/metadata.json | 16 ++ .../v0.1/pairs/0004-git-orchestrator/spec.tri | 151 +++++++++++++++++ .../0005-mcp-tool-registry/metadata.json | 16 ++ .../pairs/0005-mcp-tool-registry/spec.tri | 143 ++++++++++++++++ .../pairs/0006-scene-schema/metadata.json | 16 ++ .../v0.1/pairs/0006-scene-schema/spec.tri | 138 ++++++++++++++++ .../pairs/0007-ring-runtime/metadata.json | 16 ++ .../v0.1/pairs/0007-ring-runtime/spec.tri | 143 ++++++++++++++++ .../pairs/0008-igla-manifest/metadata.json | 16 ++ .../v0.1/pairs/0008-igla-manifest/spec.tri | 152 +++++++++++++++++ specs/dataset/igla_coder_manifest.tri | 152 +++++++++++++++++ 20 files changed, 1662 insertions(+) create mode 100644 dataset/igla-coder/v0.1/DECONTAM.md create mode 100644 dataset/igla-coder/v0.1/MANIFEST.json create mode 100644 dataset/igla-coder/v0.1/README.md create mode 100644 dataset/igla-coder/v0.1/pairs/0001-experience-format/metadata.json create mode 100644 dataset/igla-coder/v0.1/pairs/0001-experience-format/spec.tri create mode 100644 dataset/igla-coder/v0.1/pairs/0002-mozg-state-machine/metadata.json create mode 100644 dataset/igla-coder/v0.1/pairs/0002-mozg-state-machine/spec.tri create mode 100644 dataset/igla-coder/v0.1/pairs/0003-dna-schema/metadata.json create mode 100644 dataset/igla-coder/v0.1/pairs/0003-dna-schema/spec.tri create mode 100644 dataset/igla-coder/v0.1/pairs/0004-git-orchestrator/metadata.json create mode 100644 dataset/igla-coder/v0.1/pairs/0004-git-orchestrator/spec.tri create mode 100644 dataset/igla-coder/v0.1/pairs/0005-mcp-tool-registry/metadata.json create mode 100644 dataset/igla-coder/v0.1/pairs/0005-mcp-tool-registry/spec.tri create mode 100644 dataset/igla-coder/v0.1/pairs/0006-scene-schema/metadata.json create mode 100644 dataset/igla-coder/v0.1/pairs/0006-scene-schema/spec.tri create mode 100644 dataset/igla-coder/v0.1/pairs/0007-ring-runtime/metadata.json create mode 100644 dataset/igla-coder/v0.1/pairs/0007-ring-runtime/spec.tri create mode 100644 dataset/igla-coder/v0.1/pairs/0008-igla-manifest/metadata.json create mode 100644 dataset/igla-coder/v0.1/pairs/0008-igla-manifest/spec.tri create mode 100644 specs/dataset/igla_coder_manifest.tri diff --git a/dataset/igla-coder/v0.1/DECONTAM.md b/dataset/igla-coder/v0.1/DECONTAM.md new file mode 100644 index 000000000..bd3c0bde0 --- /dev/null +++ b/dataset/igla-coder/v0.1/DECONTAM.md @@ -0,0 +1,41 @@ +# DECONTAM.md — IGLA CODER v0.1 + +**Version:** 0.1 +**Method:** Lee 2022 k=50 substring bidirectional check. +**Reference:** Lee et al., "Deduplicating Training Data Makes Language Models Better" (arXiv:2107.06499). + +## Contract (mandatory when the dataset is used to train IGLA CODER/RACE) + +For every training pair `(spec, gen)` and every held-out evaluation program `eval_i`: + +1. **Forward direction:** no 50-character substring of `spec` or `gen` appears verbatim in any `eval_i` (case-sensitive, whitespace-normalised). +2. **Reverse direction:** no 50-character substring of any `eval_i` appears verbatim in any `spec` or `gen`. + +**Failure of either direction** => the pair is quarantined (moved to `dataset/igla-coder/v0.1/quarantine/`), never enters `pairs/`. + +## v0.1 status: SKIPPED — trivially clean + +Held-out evaluation set at v0.1 is **empty**. The directory `held-out-eval/` exists but contains no programs. Therefore: + +- Bidirectional decontam is **trivially clean** (there is nothing to compare against). +- `manifest.decontam_bidirectional = false` (honest: check was not meaningfully performed). +- Per-pair `metadata.json` marks `decontam_status = "Skipped"`. + +**This is a known v0.1 gap and is intentional.** Populating the held-out set before running decontam properly is a v0.2 responsibility. + +## v0.2 plan (out of scope this Wave) + +1. Author 12-16 held-out programs (matching topic distribution of pairs but name-disjoint). +2. Store under `held-out-eval//spec.tri` (and `gen.` where applicable). +3. Add `decontam_check.py` (deterministic, stdlib-only, k=50). +4. Re-run: assert every pair passes both directions. Fail-loud on any violation. +5. Publish `decontam_report_v02.md` alongside MANIFEST v0.2. + +## Bibliographic honesty + +- Lee 2022 (arXiv:2107.06499) establishes the k=50 threshold for near-duplicate detection in LM training corpora. Applying the same threshold bidirectionally to eval-vs-train is a stricter variant used by BIG-bench maintainers and OpenAI's HumanEval-style protocols. +- We do NOT claim originality on this method. We ship a placeholder because v0.1 is a **seed**, not a training corpus. + +## Verdict + +`DECONTAM v0.1 = SKIPPED (justified). NOT SAFE TO TRAIN on this dataset as-is; awaiting held-out eval.` diff --git a/dataset/igla-coder/v0.1/MANIFEST.json b/dataset/igla-coder/v0.1/MANIFEST.json new file mode 100644 index 000000000..0169e6739 --- /dev/null +++ b/dataset/igla-coder/v0.1/MANIFEST.json @@ -0,0 +1,145 @@ +{ + "schema_version": 1, + "dataset_version": "0.1", + "built_at_iso": "2026-07-08T07:31:18.026643+00:00", + "pair_count": 8, + "decontam_bidirectional": false, + "held_out_eval_defined": false, + "note": "v0.1 seed: 8 spec-only pairs. Codegen pending TRAIN-BOX (rust/zig/ts). Decontam trivially clean because held-out-eval is empty at v0.1; v0.2 must populate held-out-eval FIRST.", + "law_compliance": { + "L1": "traceable via Closes #new-N in each ring PR body", + "L3": "ASCII+English verified per-file below", + "L4": ">=3 invariants + >=8 tests + >=2 bench per spec (visual audit)", + "L6": "no new numeric formats introduced; live catalog count = 83 verified via grep -c '// CATALOG:' specs/numeric/formats_catalog.t27" + }, + "pairs": [ + { + "pair_id": "0001-experience-format", + "spec_path_in_t27": "specs/organism/experience.tri", + "spec_local_path": "pairs/0001-experience-format/spec.tri", + "spec_sha256": "ea43af76d3c1214721cd40dbc624062cc17707525c55c824612e3941b3c3c7ef", + "spec_bytes": 4096, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "None", + "ring_id": "ring-105-001", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "spec_only", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 + }, + { + "pair_id": "0002-mozg-state-machine", + "spec_path_in_t27": "specs/organism/mozg.tri", + "spec_local_path": "pairs/0002-mozg-state-machine/spec.tri", + "spec_sha256": "ace8235ead1fded0cdd3a2bad33fefcfddfa4547bff66bfd5c6c11d62f392dc6", + "spec_bytes": 3473, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "Zig", + "ring_id": "ring-105-002", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "codegen_pending_train_box", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 + }, + { + "pair_id": "0003-dna-schema", + "spec_path_in_t27": "specs/organism/dna.tri", + "spec_local_path": "pairs/0003-dna-schema/spec.tri", + "spec_sha256": "e17879a9431831d03d101417be6eb36748e07112de95cedadac917742abcad37", + "spec_bytes": 3399, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "Zig", + "ring_id": "ring-105-002", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "codegen_pending_train_box", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 + }, + { + "pair_id": "0004-git-orchestrator", + "spec_path_in_t27": "specs/git/orchestrator.tri", + "spec_local_path": "pairs/0004-git-orchestrator/spec.tri", + "spec_sha256": "0eebd8a9045fd16b1c3bd46fc1518d5c82dcf51cdc579006222c91fcfeb4e244", + "spec_bytes": 4263, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "Zig", + "ring_id": "ring-105-003", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "codegen_pending_train_box", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 + }, + { + "pair_id": "0005-mcp-tool-registry", + "spec_path_in_t27": "specs/mcp/tool_registry.tri", + "spec_local_path": "pairs/0005-mcp-tool-registry/spec.tri", + "spec_sha256": "d00d00154073aa13a376b762702a36c50c4b5c2ea83ac1cd6afdfa5696c2872b", + "spec_bytes": 3959, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "Rust", + "ring_id": "ring-105-004", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "codegen_stub_pending_wave2", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 + }, + { + "pair_id": "0006-scene-schema", + "spec_path_in_t27": "specs/scenes/scene_schema.tri", + "spec_local_path": "pairs/0006-scene-schema/spec.tri", + "spec_sha256": "88029f3274e76ae9112fe05dd672904f761d8e686c273e06719e8f6ffe1712d1", + "spec_bytes": 3843, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "TypeScript", + "ring_id": "ring-105-005", + "license": "Apache-2.0-anonymised", + "decontam_status": "Skipped", + "codegen_status": "codegen_deferred_wave3", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 + }, + { + "pair_id": "0007-ring-runtime", + "spec_path_in_t27": "specs/organism/ring_runtime.tri", + "spec_local_path": "pairs/0007-ring-runtime/spec.tri", + "spec_sha256": "ba5421b4fb88095c3edb629415d12fb2ed6bc1a7392934f6426799d430ae2979", + "spec_bytes": 3848, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "Rust", + "ring_id": "ring-105-006", + "license": "Apache-2.0-anonymised", + "decontam_status": "Skipped", + "codegen_status": "codegen_stub_pending_wave2", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 + }, + { + "pair_id": "0008-igla-manifest", + "spec_path_in_t27": "specs/dataset/igla_coder_manifest.tri", + "spec_local_path": "pairs/0008-igla-manifest/spec.tri", + "spec_sha256": "a09c423ceda7d99360a66e60c661feb39a35ddc53453b6aeb788bf325894219e", + "spec_bytes": 4366, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "None", + "ring_id": "ring-105-007", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "spec_only", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 + } + ] +} \ No newline at end of file diff --git a/dataset/igla-coder/v0.1/README.md b/dataset/igla-coder/v0.1/README.md new file mode 100644 index 000000000..212787e60 --- /dev/null +++ b/dataset/igla-coder/v0.1/README.md @@ -0,0 +1,63 @@ +# IGLA CODER Dataset v0.1 — Seed + +**Status:** SEED (not a training corpus). +**Pair count:** 8. +**Total spec bytes:** ~31 KB. +**Estimated token count:** ~7-10K (bpe token equivalent, rough estimate; measured at v0.2 with a tokenizer spec). + +## Purpose + +First public seed of the IGLA CODER training corpus: parallel `(spec, gen)` pairs where `spec` is a `.tri` T27 specification and `gen` is the corresponding generated code (Zig / Rust / Verilog / TypeScript — the latter deferred to Wave-3). + +## What is here (v0.1) + +Eight `.tri` specs, one per pilot ring of the 2026-07-08 ecosystem Wave (`ring-105-001..007`): + +| Pair ID | Spec | Target lang | Codegen status | Ring | +|---|---|---|---|---| +| 0001-experience-format | organism/experience.tri | None (spec-only) | n/a | 105-001 | +| 0002-mozg-state-machine | organism/mozg.tri | Zig | TRAIN-BOX pending | 105-002 | +| 0003-dna-schema | organism/dna.tri | Zig | TRAIN-BOX pending | 105-002 | +| 0004-git-orchestrator | git/orchestrator.tri | Zig | TRAIN-BOX pending | 105-003 | +| 0005-mcp-tool-registry | mcp/tool_registry.tri | Rust | STUB (Wave-2) | 105-004 | +| 0006-scene-schema | scenes/scene_schema.tri | TypeScript | DEFERRED (Wave-3) | 105-005 | +| 0007-ring-runtime | organism/ring_runtime.tri | Rust | STUB (Wave-2) | 105-006 | +| 0008-igla-manifest | dataset/igla_coder_manifest.tri | None (spec-only) | n/a | 105-007 | + +## What is NOT here (honest gaps) + +- **No generated code.** All pairs are spec-only or spec-with-codegen-stub. Wave-2 (rust codegen) and Wave-3 (typescript codegen + real train-box regeneration) fill this in. +- **No held-out evaluation set.** `held-out-eval/` is empty. See DECONTAM.md. +- **No tokenizer.** Byte-level fallback assumed; explicit tokenizer spec is Wave-4. +- **No BPB baseline.** Impossible without a real train run. +- **~7-10K tokens is 3+ orders below phi-1-small floor.** IGLA CODER v0.1 CANNOT train a working model. This is a seed, not a corpus. See report/FINAL_REPORT.md §W-18. + +## What v0.2..v0.5 must add (roadmap) + +- v0.2: populate held-out-eval, rerun decontam bidirectionally, publish decontam_report_v02.md. +- v0.3: apply WP-10 deterministic alpha-rename augmentation to reach ~20K train tokens. +- v0.4: add tokenizer spec `specs/tokenizer/tri_tokenizer.tri`. +- v0.5: reach >=200K train tokens (deficit <=262x per WP-10 analog); actual train-box run authorised. + +## Files + +- `MANIFEST.json` — canonical index (schema in `specs/dataset/igla_coder_manifest.tri`) +- `DECONTAM.md` — decontamination policy and v0.1 status +- `pairs//spec.tri` — the .tri spec +- `pairs//metadata.json` — per-pair metadata (sha256, ring_id, target_lang, license) +- `held-out-eval/` — v0.1: empty by design + +## License + +Each pair inherits its source repo's license, recorded per-pair in `metadata.json`. + +- ring-105-001..004 + 007: Apache-2.0 (from gHashTag/t27) +- ring-105-005, 105-006: Apache-2.0 (anonymised abstractions of PRIVATE 999-multibots-* repos; NO secrets, NO PII, NO wallet, NO tokens in this dataset) + +## SHA-256 reproducibility + +All `spec_sha256` values in MANIFEST.json are computed with Python stdlib `hashlib.sha256(open(path,"rb").read())` at build time. Re-running `compute_manifest.py` in this workspace must yield identical hex digests. + +## Not for training as-is + +**Do not attempt to train IGLA CODER on this dataset.** It is a seed for architecture and pipeline validation, not for capability. Real training gates on Wave-5. diff --git a/dataset/igla-coder/v0.1/pairs/0001-experience-format/metadata.json b/dataset/igla-coder/v0.1/pairs/0001-experience-format/metadata.json new file mode 100644 index 000000000..2cf3a87d8 --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0001-experience-format/metadata.json @@ -0,0 +1,16 @@ +{ + "pair_id": "0001-experience-format", + "spec_path_in_t27": "specs/organism/experience.tri", + "spec_local_path": "pairs/0001-experience-format/spec.tri", + "spec_sha256": "ea43af76d3c1214721cd40dbc624062cc17707525c55c824612e3941b3c3c7ef", + "spec_bytes": 4096, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "None", + "ring_id": "ring-105-001", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "spec_only", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 +} \ No newline at end of file diff --git a/dataset/igla-coder/v0.1/pairs/0001-experience-format/spec.tri b/dataset/igla-coder/v0.1/pairs/0001-experience-format/spec.tri new file mode 100644 index 000000000..1e36fe241 --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0001-experience-format/spec.tri @@ -0,0 +1,154 @@ +spec experience_format + +-- Ring 105-001: PHI LOOP experience artefact schema +-- Target path in t27 repo: specs/organism/experience.tri +-- Purpose: freeze the on-disk format for experience/ring-XXX/verdict.json +-- License: Apache-2.0 (inherits from t27 root) +-- Law compliance: L1 (Closes #new-2), L3 (ASCII+English), L4 (>=3 invariants, >=8 tests, >=2 bench), L5 (n/a) + +numericformat gf16 tf3 + +-- Trinity constants (L5) +pub const PHI f64 = 1.6180339887498948482 +pub const TRINITY f64 = 3.0 + +-- Ring identifier: three-digit ring number + kebab-slug +pub const RING_ID_MAX_LEN u32 = 64 + +-- Agent identifier: ASCII lowercase + digits + hyphen +pub const AGENT_ID_MAX_LEN u32 = 48 + +-- Verdict status enum: one of four terminal states +pub const Status enum(u8) { + Designed = 0, + Pending = 1, + Passed = 2, + Failed = 3 +} + +-- Bytes32: 32-byte hash (sha256 output) +pub type Bytes32 = [32]u8 + +-- SpecHash: sha256 seal over the .tri text bytes +pub type SpecHash = Bytes32 + +-- GenHash: sha256 seal over the generated file bytes +pub type GenHash = Bytes32 + +-- Verdict record: full on-disk shape for verdict.json +pub type Verdict = struct { + ring_id: RingId, + agent_id: AgentId, + spec_path: str, + spec_hash: SpecHash, + gen_path_opt: str, + gen_hash_opt: GenHash, + status: Status, + tests_total: u32, + tests_passed: u32, + invariants_verified: u32, + bench_delta_pct: f64, + timestamp_epoch: i64, + notes: str +} + +-- Core functions +pub fn verdict_new(ring_id: RingId, agent_id: AgentId) -> Verdict +pub fn verdict_seal(v: Verdict) -> Bytes32 +pub fn verdict_is_pass(v: Verdict) -> bool + +-- Invariants (mandatory 3+) + +invariant seal_length_is_32 { + given v Verdict + let seal = verdict_seal(v) + assert len(seal) == 32 +} + +invariant timestamp_is_epoch_seconds { + given v Verdict + -- must be non-negative and less than 4102444800 (year 2100) + assert v.timestamp_epoch >= 0 + assert v.timestamp_epoch < 4102444800 +} + +invariant agent_id_is_ascii { + given v Verdict + -- every byte in agent_id lies in ASCII printable range + assert forall b in v.agent_id : b >= 0x20 and b <= 0x7E +} + +invariant status_pass_requires_all_tests { + given v Verdict + assert v.status == Status.Passed implies v.tests_passed == v.tests_total +} + +-- Tests (mandatory 8+) + +test new_verdict_defaults_to_designed { + let v = verdict_new("ring-105-001", "wave-agent") + assert v.status == Status.Designed + assert v.tests_passed == 0 +} + +test seal_produces_32_bytes { + let v = verdict_new("ring-105-001", "wave-agent") + let seal = verdict_seal(v) + assert len(seal) == 32 +} + +test seal_is_deterministic { + let a = verdict_new("ring-105-001", "wave-agent") + let b = verdict_new("ring-105-001", "wave-agent") + assert verdict_seal(a) == verdict_seal(b) +} + +test is_pass_requires_status_passed { + let v = verdict_new("ring-105-001", "wave-agent") + assert verdict_is_pass(v) == false +} + +test is_pass_true_when_status_passed { + let mut v = verdict_new("ring-105-001", "wave-agent") + v.status = Status.Passed + v.tests_total = 8 + v.tests_passed = 8 + assert verdict_is_pass(v) == true +} + +test agent_id_rejects_non_ascii { + -- an agent_id with a non-ASCII byte must be rejected at construction + -- (implementation returns an error verdict; here we assert the invariant) + let v = verdict_new("ring-105-001", "safe-name") + assert forall b in v.agent_id : b <= 0x7E +} + +test ring_id_length_bounded { + let v = verdict_new("ring-105-001-a-fairly-long-slug-but-under-limit", "agent") + assert len(v.ring_id) <= RING_ID_MAX_LEN +} + +test bench_delta_pct_finite { + let mut v = verdict_new("ring-105-001", "agent") + v.bench_delta_pct = 12.5 + -- reject nan and inf: field must be a finite f64 + assert v.bench_delta_pct == v.bench_delta_pct -- nan != nan + assert v.bench_delta_pct > -1000000.0 + assert v.bench_delta_pct < 1000000.0 +} + +-- Benchmarks (mandatory 2+) + +bench verdict_seal_sha256_4kb { + measure nanoseconds to verdict_seal(v) + target 50_000_000 + warmup 3 + runs 100 +} + +bench verdict_roundtrip_serialize { + measure nanoseconds to serialize(verdict_new("ring-105-001", "agent")) + target 10_000_000 + warmup 3 + runs 100 +} diff --git a/dataset/igla-coder/v0.1/pairs/0002-mozg-state-machine/metadata.json b/dataset/igla-coder/v0.1/pairs/0002-mozg-state-machine/metadata.json new file mode 100644 index 000000000..8f6bbe229 --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0002-mozg-state-machine/metadata.json @@ -0,0 +1,16 @@ +{ + "pair_id": "0002-mozg-state-machine", + "spec_path_in_t27": "specs/organism/mozg.tri", + "spec_local_path": "pairs/0002-mozg-state-machine/spec.tri", + "spec_sha256": "ace8235ead1fded0cdd3a2bad33fefcfddfa4547bff66bfd5c6c11d62f392dc6", + "spec_bytes": 3473, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "Zig", + "ring_id": "ring-105-002", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "codegen_pending_train_box", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 +} \ No newline at end of file diff --git a/dataset/igla-coder/v0.1/pairs/0002-mozg-state-machine/spec.tri b/dataset/igla-coder/v0.1/pairs/0002-mozg-state-machine/spec.tri new file mode 100644 index 000000000..d032acfd7 --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0002-mozg-state-machine/spec.tri @@ -0,0 +1,133 @@ +spec trinity_mozg + +-- Ring 105-002 (part 1 of 2): Trinity Mozg (cognitive layer) state machine +-- Target path in t27 repo: specs/organism/mozg.tri +-- Source repo: gHashTag/trinity (Zig) +-- Codegen target: Zig -> gen/organism/mozg.zig +-- Law compliance: L1 (Closes trinity#new-3), L3, L4, L5 (phi tolerance), L6 (no new formats) + +numericformat gf16 + +pub const PHI f64 = 1.6180339887498948482 +pub const TRINITY f64 = 3.0 + +-- 27-letter agent alphabet (constitutional; matches docs/agents/AGENTS_ALPHABET.md) +pub const ALPHABET_LEN u32 = 27 + +-- MozgState: one slot per agent letter, encoding activation level +pub type Activation = i8 -- -1 quiescent, 0 neutral, 1 active +pub type LetterIdx = u8 -- 0..26 + +pub type MozgState = struct { + activations: [27]Activation, + cycle: u64, + law_priority_bits: u8, -- bit N set -> law N+1 currently observed + last_transition: u32 +} + +-- Transition: which letter fired and what caused it +pub type TransitionCause = enum(u8) { + ExternalInput = 0, + LawPriorityShift = 1, + IntraAgentSignal = 2, + Quiescence = 3 +} + +pub type Transition = struct { + from_letter: LetterIdx, + to_letter: LetterIdx, + cause: TransitionCause, + cycle: u64 +} + +-- Core functions (mandatory 3) +pub fn mozg_step(s MozgState, input Transition) -> MozgState +pub fn mozg_law_priority_ok(s MozgState) -> bool +pub fn mozg_quiescent(s MozgState) -> bool + +-- Invariants (mandatory 3) + +invariant activation_domain_ternary { + given s MozgState + assert forall a in s.activations : a >= -1 and a <= 1 +} + +invariant cycle_monotone_across_step { + given s MozgState + given t Transition + let s2 = mozg_step(s, t) + assert s2.cycle >= s.cycle +} + +invariant law_priority_l1_always_first { + given s MozgState + -- L1 TRACEABILITY must be observed whenever any other law bit is set + assert (s.law_priority_bits & 0x01) == 0x01 or s.law_priority_bits == 0 +} + +-- Tests (mandatory 8) + +test mozg_step_increments_cycle { + let s0 = mozg_state_new() + let t = transition_new(0, 1, TransitionCause.ExternalInput, 1) + let s1 = mozg_step(s0, t) + assert s1.cycle == s0.cycle + 1 +} + +test mozg_step_updates_last_transition { + let s0 = mozg_state_new() + let t = transition_new(2, 5, TransitionCause.IntraAgentSignal, 1) + let s1 = mozg_step(s0, t) + assert s1.last_transition == 5 +} + +test mozg_all_neutral_is_quiescent { + let s = mozg_state_new() + assert mozg_quiescent(s) == true +} + +test mozg_any_active_is_not_quiescent { + let mut s = mozg_state_new() + s.activations[3] = 1 + assert mozg_quiescent(s) == false +} + +test mozg_law_priority_l1_bit_set_ok { + let mut s = mozg_state_new() + s.law_priority_bits = 0x03 -- L1 + L2 + assert mozg_law_priority_ok(s) == true +} + +test mozg_law_priority_l2_only_rejected { + let mut s = mozg_state_new() + s.law_priority_bits = 0x02 -- L2 without L1 -> priority violated + assert mozg_law_priority_ok(s) == false +} + +test mozg_activation_ternary_bound { + let s = mozg_state_new() + assert forall a in s.activations : a >= -1 and a <= 1 +} + +test mozg_step_preserves_activation_bounds { + let s0 = mozg_state_new() + let t = transition_new(0, 26, TransitionCause.LawPriorityShift, 1) + let s1 = mozg_step(s0, t) + assert forall a in s1.activations : a >= -1 and a <= 1 +} + +-- Benchmarks (mandatory 2) + +bench mozg_step_throughput { + measure nanoseconds to mozg_step(s0, t) + target 500_000_000 + warmup 3 + runs 100 +} + +bench mozg_quiescence_check { + measure nanoseconds to mozg_quiescent(s0) + target 1_000_000_000 + warmup 3 + runs 100 +} diff --git a/dataset/igla-coder/v0.1/pairs/0003-dna-schema/metadata.json b/dataset/igla-coder/v0.1/pairs/0003-dna-schema/metadata.json new file mode 100644 index 000000000..00d870d1a --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0003-dna-schema/metadata.json @@ -0,0 +1,16 @@ +{ + "pair_id": "0003-dna-schema", + "spec_path_in_t27": "specs/organism/dna.tri", + "spec_local_path": "pairs/0003-dna-schema/spec.tri", + "spec_sha256": "e17879a9431831d03d101417be6eb36748e07112de95cedadac917742abcad37", + "spec_bytes": 3399, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "Zig", + "ring_id": "ring-105-002", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "codegen_pending_train_box", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 +} \ No newline at end of file diff --git a/dataset/igla-coder/v0.1/pairs/0003-dna-schema/spec.tri b/dataset/igla-coder/v0.1/pairs/0003-dna-schema/spec.tri new file mode 100644 index 000000000..15243a73f --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0003-dna-schema/spec.tri @@ -0,0 +1,119 @@ +spec trinity_dna + +-- Ring 105-002 (part 2 of 2): Trinity DNA (persistence layer) schema +-- Target path in t27 repo: specs/organism/dna.tri +-- Source repo: gHashTag/trinity (Zig) +-- Codegen target: Zig -> gen/organism/dna.zig +-- Law compliance: L1 (Closes trinity#new-3), L3, L4, L6 (no new numeric formats) + +pub const SKILL_ID_MAX_LEN u32 = 64 +pub const RING_BLOB_MAX_SIZE u32 = 1048576 -- 1 MiB per ring blob +pub const DNA_MAGIC u32 = 0x54524933 -- "TRI3" ASCII + +pub type Bytes32 = [32]u8 +pub type SkillId = str -- ASCII lowercase + digits + hyphen; len bounded + +pub type DnaRecordKind = enum(u8) { + Skill = 0, + Verdict = 1, + RingBlob = 2 +} + +pub type DnaRecord = struct { + magic: u32, -- must equal DNA_MAGIC + kind: DnaRecordKind, + ring_id: str, + payload_sha256: Bytes32, + payload_len: u32, + timestamp_epoch: i64 +} + +-- Core functions (mandatory 3) +pub fn dna_write(record DnaRecord, payload bytes) -> bool +pub fn dna_read(sha256 Bytes32) -> DnaRecord +pub fn dna_gc(older_than_epoch i64) -> u32 -- returns count of records reclaimed + +-- Invariants (mandatory 3) + +invariant record_magic_is_tri3 { + given r DnaRecord + assert r.magic == DNA_MAGIC +} + +invariant payload_len_bounded { + given r DnaRecord + assert r.payload_len <= RING_BLOB_MAX_SIZE +} + +invariant timestamp_within_lifetime { + given r DnaRecord + assert r.timestamp_epoch >= 1600000000 -- 2020-09-13, before Trinity project began + assert r.timestamp_epoch < 4102444800 -- 2100-01-01 +} + +-- Tests (mandatory 8) + +test dna_write_roundtrip { + let payload = bytes_of_ascii("hello") + let r = dna_record_new(DnaRecordKind.Skill, "ring-105-002", payload) + assert dna_write(r, payload) == true + let back = dna_read(r.payload_sha256) + assert back.magic == r.magic + assert back.kind == r.kind +} + +test dna_read_returns_stored_record { + let payload = bytes_of_ascii("verdict-json") + let r = dna_record_new(DnaRecordKind.Verdict, "ring-105-002", payload) + dna_write(r, payload) + let back = dna_read(r.payload_sha256) + assert back.payload_len == r.payload_len +} + +test dna_gc_zero_when_no_expired { + let count = dna_gc(0) -- prune anything older than epoch 0 = nothing + assert count == 0 +} + +test dna_record_magic_rejected_when_wrong { + let mut r = dna_record_new(DnaRecordKind.Skill, "ring-105-002", bytes_of_ascii("x")) + r.magic = 0xDEADBEEF + assert dna_write(r, bytes_of_ascii("x")) == false +} + +test dna_payload_len_overlarge_rejected { + let mut r = dna_record_new(DnaRecordKind.RingBlob, "ring-105-002", bytes_of_ascii("x")) + r.payload_len = RING_BLOB_MAX_SIZE + 1 + assert dna_write(r, bytes_of_ascii("x")) == false +} + +test dna_kind_skill_encoded_as_zero { + let r = dna_record_new(DnaRecordKind.Skill, "ring-105-002", bytes_of_ascii("x")) + assert r.kind == DnaRecordKind.Skill +} + +test dna_kind_verdict_encoded_as_one { + let r = dna_record_new(DnaRecordKind.Verdict, "ring-105-002", bytes_of_ascii("x")) + assert r.kind == DnaRecordKind.Verdict +} + +test dna_ring_id_ascii_only { + let r = dna_record_new(DnaRecordKind.RingBlob, "ring-105-002", bytes_of_ascii("x")) + assert forall b in r.ring_id : b >= 0x20 and b <= 0x7E +} + +-- Benchmarks (mandatory 2) + +bench dna_write_1kb { + measure nanoseconds to dna_write(r, payload_1kb) + target 20_000_000 + warmup 3 + runs 100 +} + +bench dna_read_10k_records { + measure nanoseconds to dna_read(sha256_of_10k_th) + target 10_000_000 + warmup 3 + runs 100 +} diff --git a/dataset/igla-coder/v0.1/pairs/0004-git-orchestrator/metadata.json b/dataset/igla-coder/v0.1/pairs/0004-git-orchestrator/metadata.json new file mode 100644 index 000000000..90880d0ec --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0004-git-orchestrator/metadata.json @@ -0,0 +1,16 @@ +{ + "pair_id": "0004-git-orchestrator", + "spec_path_in_t27": "specs/git/orchestrator.tri", + "spec_local_path": "pairs/0004-git-orchestrator/spec.tri", + "spec_sha256": "0eebd8a9045fd16b1c3bd46fc1518d5c82dcf51cdc579006222c91fcfeb4e244", + "spec_bytes": 4263, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "Zig", + "ring_id": "ring-105-003", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "codegen_pending_train_box", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 +} \ No newline at end of file diff --git a/dataset/igla-coder/v0.1/pairs/0004-git-orchestrator/spec.tri b/dataset/igla-coder/v0.1/pairs/0004-git-orchestrator/spec.tri new file mode 100644 index 000000000..746d296d8 --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0004-git-orchestrator/spec.tri @@ -0,0 +1,151 @@ +spec trios_git_orchestrator + +-- Ring 105-003: Trios git bridge state machine +-- Target path in t27 repo: specs/git/orchestrator.tri +-- Source repo: gHashTag/trios (Zig) +-- Codegen target: Zig -> gen/git/orchestrator.zig +-- Law compliance: L1 (Closes trios#new-4), L3, L4, L7 (no new *.sh; tri subcommands only) + +pub const REPO_REF_MAX_LEN u32 = 128 + +pub type GitState = enum(u8) { + Closed = 0, + Opened = 1, + Fetched = 2, + Validated = 3, + Merged = 4, + Pushed = 5, + Errored = 6 +} + +pub type MergeStrategy = enum(u8) { + FastForwardOnly = 0, + ThreeWay = 1, -- not permitted this pilot; validate rejects + Rebase = 2 -- not permitted this pilot; validate rejects +} + +pub type OrchestrationError = enum(u8) { + None = 0, + FetchFailed = 1, + ValidateRejected = 2, + MergeConflict = 3, + PushRejected = 4, + InvalidTransition = 5 +} + +pub type RepoRef = struct { + origin_url: str, + branch: str, + head_sha_hex40: str +} + +pub type Orchestrator = struct { + state: GitState, + repo: RepoRef, + strategy: MergeStrategy, + last_error: OrchestrationError +} + +-- Core functions (mandatory 3) +pub fn orch_step(o Orchestrator, next_intent GitState) -> Orchestrator +pub fn orch_can_transition(from GitState, to GitState) -> bool +pub fn orch_fast_forward_only(o Orchestrator) -> bool + +-- Invariants (mandatory 3) + +invariant fast_forward_only_strategy { + given o Orchestrator + -- pilot restricts to FastForwardOnly + assert o.strategy == MergeStrategy.FastForwardOnly +} + +invariant errored_state_is_terminal { + given o Orchestrator + given target GitState + -- once Errored, no transition to non-Errored non-Closed + let can = orch_can_transition(o.state, target) + assert (o.state != GitState.Errored) or (target == GitState.Errored) or (target == GitState.Closed) or (can == false) +} + +invariant no_push_without_validate { + given o Orchestrator + -- reach Pushed only via Merged; reach Merged only via Validated + assert (o.state != GitState.Pushed) or (o.last_error == OrchestrationError.None) +} + +-- Tests (mandatory 8) + +test happy_path_closed_to_pushed { + let mut o = orch_new("https://github.com/example/repo", "main") + o = orch_step(o, GitState.Opened) + o = orch_step(o, GitState.Fetched) + o = orch_step(o, GitState.Validated) + o = orch_step(o, GitState.Merged) + o = orch_step(o, GitState.Pushed) + assert o.state == GitState.Pushed + assert o.last_error == OrchestrationError.None +} + +test cannot_push_from_opened { + let o = orch_new("https://github.com/example/repo", "main") + let o2 = orch_step(o, GitState.Opened) + let o3 = orch_step(o2, GitState.Pushed) -- illegal + assert o3.state == GitState.Errored + assert o3.last_error == OrchestrationError.InvalidTransition +} + +test cannot_merge_without_validate { + let mut o = orch_new("https://github.com/example/repo", "main") + o = orch_step(o, GitState.Opened) + o = orch_step(o, GitState.Fetched) + o = orch_step(o, GitState.Merged) -- skipped Validated + assert o.state == GitState.Errored +} + +test three_way_strategy_rejected { + let mut o = orch_new("https://github.com/example/repo", "main") + o.strategy = MergeStrategy.ThreeWay + assert orch_fast_forward_only(o) == false +} + +test errored_stays_errored_on_push { + let mut o = orch_new("https://github.com/example/repo", "main") + o.state = GitState.Errored + o = orch_step(o, GitState.Pushed) + assert o.state == GitState.Errored +} + +test errored_can_transition_to_closed { + let mut o = orch_new("https://github.com/example/repo", "main") + o.state = GitState.Errored + o = orch_step(o, GitState.Closed) + assert o.state == GitState.Closed +} + +test opened_to_fetched_ok { + let mut o = orch_new("https://github.com/example/repo", "main") + o = orch_step(o, GitState.Opened) + o = orch_step(o, GitState.Fetched) + assert o.state == GitState.Fetched +} + +test repo_ref_url_ascii_only { + let o = orch_new("https://github.com/example/repo", "main") + assert forall b in o.repo.origin_url : b >= 0x20 and b <= 0x7E +} + +-- Benchmarks (mandatory 2) + +bench orch_step_throughput { + measure nanoseconds to orch_step(o, GitState.Fetched) + target 500_000_000 + warmup 3 + runs 100 +} + +bench orch_can_transition_lookup { + measure nanoseconds to orch_can_transition(GitState.Validated, GitState.Merged) + target 1_000_000_000 + warmup 3 + runs 100 +} diff --git a/dataset/igla-coder/v0.1/pairs/0005-mcp-tool-registry/metadata.json b/dataset/igla-coder/v0.1/pairs/0005-mcp-tool-registry/metadata.json new file mode 100644 index 000000000..ada8500f2 --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0005-mcp-tool-registry/metadata.json @@ -0,0 +1,16 @@ +{ + "pair_id": "0005-mcp-tool-registry", + "spec_path_in_t27": "specs/mcp/tool_registry.tri", + "spec_local_path": "pairs/0005-mcp-tool-registry/spec.tri", + "spec_sha256": "d00d00154073aa13a376b762702a36c50c4b5c2ea83ac1cd6afdfa5696c2872b", + "spec_bytes": 3959, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "Rust", + "ring_id": "ring-105-004", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "codegen_stub_pending_wave2", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 +} \ No newline at end of file diff --git a/dataset/igla-coder/v0.1/pairs/0005-mcp-tool-registry/spec.tri b/dataset/igla-coder/v0.1/pairs/0005-mcp-tool-registry/spec.tri new file mode 100644 index 000000000..4b44415d4 --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0005-mcp-tool-registry/spec.tri @@ -0,0 +1,143 @@ +spec mcp_tool_registry + +-- Ring 105-004: MCP tool registry (proposes ONE canonical surface across trios-mcp, trios-mcp-rag, trios) +-- Target path in t27 repo: specs/mcp/tool_registry.tri +-- Source repo: gHashTag/trios-mcp (Rust) +-- Codegen target: Rust -> gen/mcp/tool_registry.rs +-- HONEST GAP: compiler/codegen/rust/codegen.t27 does not exist yet on master; this pilot +-- ships a STUB skeleton for that backend as part of ring-105-004, but the full +-- Rust codegen is Wave-2 responsibility. +-- Law compliance: L1 (Closes trios-mcp#new-5), L3, L4, L7 + +pub const TOOL_ID_MAX_LEN u32 = 64 +pub const SCHEMA_JSON_MAX_LEN u32 = 65536 + +pub type Bytes32 = [32]u8 +pub type ToolId = str -- ASCII lowercase + digits + underscore + +pub type ToolDescriptor = struct { + id: ToolId, + version_major: u16, + version_minor: u16, + schema_json_sha256: Bytes32, + schema_json_len: u32 +} + +pub type RegistryError = enum(u8) { + None = 0, + DuplicateId = 1, + IdNotFound = 2, + IdTooLong = 3, + IdNotAscii = 4, + SchemaTooLarge = 5 +} + +pub type InvocationRecord = struct { + tool_id: ToolId, + request_sha256: Bytes32, + timestamp_epoch: i64 +} + +pub type ToolRegistry = struct { + size: u32, + last_error: RegistryError +} + +-- Core functions (mandatory 3) +pub fn registry_register(r ToolRegistry, d ToolDescriptor) -> ToolRegistry +pub fn registry_describe(r ToolRegistry, id ToolId) -> ToolDescriptor +pub fn registry_lookup(r ToolRegistry, id ToolId) -> bool + +-- Invariants (mandatory 3) + +invariant tool_id_ascii_only { + given d ToolDescriptor + assert forall b in d.id : b >= 0x30 and b <= 0x7A -- '0'..'z' subset (further checks in fn) +} + +invariant tool_id_length_bounded { + given d ToolDescriptor + assert len(d.id) <= TOOL_ID_MAX_LEN +} + +invariant schema_sha256_length_is_32 { + given d ToolDescriptor + assert len(d.schema_json_sha256) == 32 +} + +-- Tests (mandatory 8) + +test register_new_tool_succeeds { + let r0 = registry_new() + let d = descriptor_new("search_web", 1, 0, sha256_of("{}"), 2) + let r1 = registry_register(r0, d) + assert r1.last_error == RegistryError.None + assert r1.size == 1 +} + +test register_duplicate_id_rejected { + let mut r = registry_new() + let d = descriptor_new("search_web", 1, 0, sha256_of("{}"), 2) + r = registry_register(r, d) + r = registry_register(r, d) -- second time -> DuplicateId + assert r.last_error == RegistryError.DuplicateId +} + +test lookup_missing_returns_false { + let r = registry_new() + assert registry_lookup(r, "not_registered") == false +} + +test lookup_after_register_returns_true { + let mut r = registry_new() + let d = descriptor_new("call_x", 2, 3, sha256_of("{}"), 2) + r = registry_register(r, d) + assert registry_lookup(r, "call_x") == true +} + +test describe_returns_matching_descriptor { + let mut r = registry_new() + let d = descriptor_new("call_x", 2, 3, sha256_of("{}"), 2) + r = registry_register(r, d) + let back = registry_describe(r, "call_x") + assert back.version_major == 2 + assert back.version_minor == 3 +} + +test tool_id_non_ascii_rejected { + let mut r = registry_new() + let d = descriptor_new("bad\xE2id", 1, 0, sha256_of("{}"), 2) + r = registry_register(r, d) + assert r.last_error == RegistryError.IdNotAscii +} + +test tool_id_over_max_rejected { + let mut r = registry_new() + let long_id = str_repeat("a", 128) -- > 64 + let d = descriptor_new(long_id, 1, 0, sha256_of("{}"), 2) + r = registry_register(r, d) + assert r.last_error == RegistryError.IdTooLong +} + +test schema_over_max_rejected { + let mut r = registry_new() + let d = descriptor_new("call_x", 1, 0, sha256_of("{}"), SCHEMA_JSON_MAX_LEN + 1) + r = registry_register(r, d) + assert r.last_error == RegistryError.SchemaTooLarge +} + +-- Benchmarks (mandatory 2) + +bench register_1k_tools { + measure nanoseconds to registry_register(r, d) + target 200_000_000 + warmup 3 + runs 100 +} + +bench lookup_10k_hits { + measure nanoseconds to registry_lookup(r, "call_x") + target 1_000_000_000 + warmup 3 + runs 100 +} diff --git a/dataset/igla-coder/v0.1/pairs/0006-scene-schema/metadata.json b/dataset/igla-coder/v0.1/pairs/0006-scene-schema/metadata.json new file mode 100644 index 000000000..d8d0cdf21 --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0006-scene-schema/metadata.json @@ -0,0 +1,16 @@ +{ + "pair_id": "0006-scene-schema", + "spec_path_in_t27": "specs/scenes/scene_schema.tri", + "spec_local_path": "pairs/0006-scene-schema/spec.tri", + "spec_sha256": "88029f3274e76ae9112fe05dd672904f761d8e686c273e06719e8f6ffe1712d1", + "spec_bytes": 3843, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "TypeScript", + "ring_id": "ring-105-005", + "license": "Apache-2.0-anonymised", + "decontam_status": "Skipped", + "codegen_status": "codegen_deferred_wave3", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 +} \ No newline at end of file diff --git a/dataset/igla-coder/v0.1/pairs/0006-scene-schema/spec.tri b/dataset/igla-coder/v0.1/pairs/0006-scene-schema/spec.tri new file mode 100644 index 000000000..e23601adf --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0006-scene-schema/spec.tri @@ -0,0 +1,138 @@ +spec multibot_scene_schema + +-- Ring 105-005: Generic multibot scene state machine (public-safe abstraction) +-- Target path in t27 repo: specs/scenes/scene_schema.tri +-- Source repo: gHashTag/999-multibots-telegraf (PRIVATE, TypeScript) +-- Codegen target: TypeScript -> DEFERRED to Wave-3 (compiler/codegen/typescript/ does not exist yet) +-- Anonymisation: NO real bot names, NO real tariffs, NO real user ids, NO payment amounts +-- Law compliance: L1 (Closes t27#new-6), L3, L4, HR-anonymise + +pub const SCENE_ID_MAX_LEN u32 = 64 +pub const MESSAGE_KIND_COUNT u32 = 6 + +pub type SceneStateKind = enum(u8) { + Idle = 0, + Awaiting = 1, -- awaiting user input + Processing = 2, -- LLM/service call in flight + Terminal = 3 -- scene closed +} + +pub type MessageKind = enum(u8) { + Text = 0, + Command = 1, + Callback = 2, + Media = 3, + System = 4, + Timeout = 5 +} + +pub type SceneError = enum(u8) { + None = 0, + InvalidTransition = 1, + MessageKindUnsupported = 2, + SceneIdInvalid = 3 +} + +pub type SceneState = struct { + kind: SceneStateKind, + scene_id: str, + cycle: u64, + last_message_kind: MessageKind, + last_error: SceneError +} + +pub type Transition = struct { + from: SceneStateKind, + to: SceneStateKind, + trigger: MessageKind +} + +-- Core functions (mandatory 3) +pub fn scene_step(s SceneState, m MessageKind) -> SceneState +pub fn scene_transition_allowed(from SceneStateKind, to SceneStateKind, trigger MessageKind) -> bool +pub fn scene_is_terminal(s SceneState) -> bool + +-- Invariants (mandatory 3) + +invariant scene_no_infinite_loop { + given s SceneState + -- transitions must form a DAG when trigger is not System/Timeout + assert (s.cycle < 1000000) or (s.kind == SceneStateKind.Terminal) +} + +invariant terminal_is_absorbing { + given s SceneState + given m MessageKind + let s2 = scene_step(s, m) + assert (s.kind != SceneStateKind.Terminal) or (s2.kind == SceneStateKind.Terminal) +} + +invariant scene_id_ascii_only { + given s SceneState + assert forall b in s.scene_id : b >= 0x20 and b <= 0x7E +} + +-- Tests (mandatory 8) + +test idle_to_awaiting_on_text { + let s0 = scene_new("welcome", SceneStateKind.Idle) + let s1 = scene_step(s0, MessageKind.Text) + assert s1.kind == SceneStateKind.Awaiting +} + +test awaiting_to_processing_on_command { + let mut s = scene_new("welcome", SceneStateKind.Awaiting) + let s2 = scene_step(s, MessageKind.Command) + assert s2.kind == SceneStateKind.Processing +} + +test processing_to_terminal_on_system { + let s = scene_new("welcome", SceneStateKind.Processing) + let s2 = scene_step(s, MessageKind.System) + assert s2.kind == SceneStateKind.Terminal +} + +test terminal_stays_terminal { + let s = scene_new("welcome", SceneStateKind.Terminal) + let s2 = scene_step(s, MessageKind.Text) + assert s2.kind == SceneStateKind.Terminal +} + +test invalid_transition_sets_error { + let s = scene_new("welcome", SceneStateKind.Idle) + let s2 = scene_step(s, MessageKind.Callback) -- Idle+Callback illegal + assert s2.last_error == SceneError.InvalidTransition +} + +test cycle_monotone_on_step { + let s = scene_new("welcome", SceneStateKind.Idle) + let s2 = scene_step(s, MessageKind.Text) + assert s2.cycle >= s.cycle +} + +test scene_id_non_ascii_rejected { + let s = scene_new("bad\xE2id", SceneStateKind.Idle) + assert s.last_error == SceneError.SceneIdInvalid +} + +test timeout_message_always_ends_scene { + let s = scene_new("welcome", SceneStateKind.Processing) + let s2 = scene_step(s, MessageKind.Timeout) + assert s2.kind == SceneStateKind.Terminal +} + +-- Benchmarks (mandatory 2) + +bench scene_step_throughput { + measure nanoseconds to scene_step(s, MessageKind.Text) + target 500_000_000 + warmup 3 + runs 100 +} + +bench transition_allowed_lookup { + measure nanoseconds to scene_transition_allowed(SceneStateKind.Idle, SceneStateKind.Awaiting, MessageKind.Text) + target 1_000_000_000 + warmup 3 + runs 100 +} diff --git a/dataset/igla-coder/v0.1/pairs/0007-ring-runtime/metadata.json b/dataset/igla-coder/v0.1/pairs/0007-ring-runtime/metadata.json new file mode 100644 index 000000000..09afbf0cf --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0007-ring-runtime/metadata.json @@ -0,0 +1,16 @@ +{ + "pair_id": "0007-ring-runtime", + "spec_path_in_t27": "specs/organism/ring_runtime.tri", + "spec_local_path": "pairs/0007-ring-runtime/spec.tri", + "spec_sha256": "ba5421b4fb88095c3edb629415d12fb2ed6bc1a7392934f6426799d430ae2979", + "spec_bytes": 3848, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "Rust", + "ring_id": "ring-105-006", + "license": "Apache-2.0-anonymised", + "decontam_status": "Skipped", + "codegen_status": "codegen_stub_pending_wave2", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 +} \ No newline at end of file diff --git a/dataset/igla-coder/v0.1/pairs/0007-ring-runtime/spec.tri b/dataset/igla-coder/v0.1/pairs/0007-ring-runtime/spec.tri new file mode 100644 index 000000000..c403b8048 --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0007-ring-runtime/spec.tri @@ -0,0 +1,143 @@ +spec multibot_ring_runtime + +-- Ring 105-006: Ring runtime worker state machine (public-safe abstraction) +-- Target path in t27 repo: specs/organism/ring_runtime.tri +-- Source repo: gHashTag/999-multibots-rust (PRIVATE, Rust) +-- Codegen target: Rust -> gen/organism/ring_runtime.rs (STUB codegen from ring-105-004) +-- Anonymisation: NO wallet keys, NO seed phrases, NO bot tokens, NO user IDs +-- Law compliance: L1 (Closes t27#new-7), L3, L4, HR-anonymise + +pub const WORKER_ID_MAX_LEN u32 = 64 +pub const RETRY_MAX_COUNT u32 = 8 + +pub type WorkerStatus = enum(u8) { + Spawned = 0, + Running = 1, + Retrying = 2, + ShutDown = 3 +} + +pub type DispatchQueueKind = enum(u8) { + Fifo = 0 +} + +pub type RuntimeError = enum(u8) { + None = 0, + RetryExceeded = 1, + WorkerAlreadyShutdown = 2, + DispatchQueueFull = 3, + InvalidWorkerId = 4 +} + +pub type RetryPolicy = struct { + max_attempts: u32, + base_backoff_ms: u32 +} + +pub type RingWorker = struct { + id: str, + status: WorkerStatus, + retry_count: u32, + policy: RetryPolicy, + queue_kind: DispatchQueueKind, + last_error: RuntimeError +} + +pub type Dispatch = struct { + worker_id: str, + payload_sha256: [32]u8 +} + +-- Core functions (mandatory 3) +pub fn worker_spawn(id str, policy RetryPolicy) -> RingWorker +pub fn worker_dispatch(w RingWorker, d Dispatch) -> RingWorker +pub fn worker_shutdown(w RingWorker) -> RingWorker + +-- Invariants (mandatory 3) + +invariant retry_count_bounded { + given w RingWorker + assert w.retry_count <= RETRY_MAX_COUNT + assert w.retry_count <= w.policy.max_attempts +} + +invariant shutdown_is_absorbing { + given w RingWorker + given d Dispatch + let w2 = worker_dispatch(w, d) + assert (w.status != WorkerStatus.ShutDown) or (w2.status == WorkerStatus.ShutDown) +} + +invariant fifo_queue_order_preserved { + given w RingWorker + assert w.queue_kind == DispatchQueueKind.Fifo +} + +-- Tests (mandatory 8) + +test spawn_defaults_to_spawned { + let w = worker_spawn("worker-a", retry_policy_default()) + assert w.status == WorkerStatus.Spawned + assert w.retry_count == 0 +} + +test dispatch_moves_to_running { + let w0 = worker_spawn("worker-a", retry_policy_default()) + let d = dispatch_new("worker-a", sha256_of("payload")) + let w1 = worker_dispatch(w0, d) + assert w1.status == WorkerStatus.Running +} + +test shutdown_is_idempotent { + let w0 = worker_spawn("worker-a", retry_policy_default()) + let w1 = worker_shutdown(w0) + let w2 = worker_shutdown(w1) + assert w2.status == WorkerStatus.ShutDown +} + +test dispatch_to_shutdown_worker_rejected { + let w0 = worker_spawn("worker-a", retry_policy_default()) + let w1 = worker_shutdown(w0) + let w2 = worker_dispatch(w1, dispatch_new("worker-a", sha256_of("x"))) + assert w2.last_error == RuntimeError.WorkerAlreadyShutdown +} + +test retry_exceeded_sets_error { + let mut w = worker_spawn("worker-a", retry_policy_new(2, 100)) + w.retry_count = 2 + w.status = WorkerStatus.Retrying + let w2 = worker_dispatch(w, dispatch_new("worker-a", sha256_of("x"))) + assert w2.last_error == RuntimeError.RetryExceeded +} + +test invalid_worker_id_rejected { + let w = worker_spawn("bad\xE2id", retry_policy_default()) + assert w.last_error == RuntimeError.InvalidWorkerId +} + +test dispatch_mismatched_worker_id_rejected { + let w0 = worker_spawn("worker-a", retry_policy_default()) + let w1 = worker_dispatch(w0, dispatch_new("worker-b", sha256_of("x"))) + assert w1.last_error == RuntimeError.InvalidWorkerId +} + +test worker_id_ascii_only { + let w = worker_spawn("worker-a-42", retry_policy_default()) + assert forall b in w.id : b >= 0x20 and b <= 0x7E +} + +-- Benchmarks (mandatory 2) + +bench worker_dispatch_throughput { + measure nanoseconds to worker_dispatch(w, d) + target 500_000_000 + warmup 3 + runs 100 +} + +bench worker_spawn_1k { + measure nanoseconds to worker_spawn("worker-x", retry_policy_default()) + target 100_000_000 + warmup 3 + runs 100 +} diff --git a/dataset/igla-coder/v0.1/pairs/0008-igla-manifest/metadata.json b/dataset/igla-coder/v0.1/pairs/0008-igla-manifest/metadata.json new file mode 100644 index 000000000..2a4db87a4 --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0008-igla-manifest/metadata.json @@ -0,0 +1,16 @@ +{ + "pair_id": "0008-igla-manifest", + "spec_path_in_t27": "specs/dataset/igla_coder_manifest.tri", + "spec_local_path": "pairs/0008-igla-manifest/spec.tri", + "spec_sha256": "a09c423ceda7d99360a66e60c661feb39a35ddc53453b6aeb788bf325894219e", + "spec_bytes": 4366, + "gen_path_in_t27": null, + "gen_sha256": null, + "target_lang": "None", + "ring_id": "ring-105-007", + "license": "Apache-2.0", + "decontam_status": "Skipped", + "codegen_status": "spec_only", + "l3_ascii_pass": true, + "l3_non_ascii_bytes": 0 +} \ No newline at end of file diff --git a/dataset/igla-coder/v0.1/pairs/0008-igla-manifest/spec.tri b/dataset/igla-coder/v0.1/pairs/0008-igla-manifest/spec.tri new file mode 100644 index 000000000..846306137 --- /dev/null +++ b/dataset/igla-coder/v0.1/pairs/0008-igla-manifest/spec.tri @@ -0,0 +1,152 @@ +spec igla_coder_manifest + +-- Ring 105-007: IGLA CODER dataset v0.1 manifest schema +-- Target path in t27 repo: specs/dataset/igla_coder_manifest.tri +-- Purpose: define the shape of dataset/igla-coder/v0.1/MANIFEST.json +-- Law compliance: L1 (Closes t27#new-8), L3, L4, HR-decontam + +pub const PAIR_ID_MAX_LEN u32 = 64 +pub const MANIFEST_SCHEMA_VERSION u32 = 1 + +pub type Bytes32 = [32]u8 + +pub type TargetLang = enum(u8) { + Zig = 0, + Rust = 1, + Verilog = 2, + C = 3, + Python = 4, + TypeScript = 5, -- reserved; codegen deferred to Wave-3 + None = 255 -- spec-only pair, no gen file +} + +pub type License = enum(u8) { + Apache2 = 0, + MIT = 1, + BSD3 = 2, + Other = 255 +} + +pub type DecontamStatus = enum(u8) { + Clean = 0, + Skipped = 1, -- e.g. v0.1: no held-out eval yet + Failed = 2 +} + +pub type Pair = struct { + pair_id: str, + spec_path: str, + spec_sha256: Bytes32, + gen_path_opt: str, + gen_sha256_opt: Bytes32, + target_lang: TargetLang, + ring_id: str, + license: License, + decontam_status: DecontamStatus +} + +pub type Manifest = struct { + schema_version: u32, + dataset_version: str, + built_at_epoch: i64, + pair_count: u32, + decontam_bidirectional: bool +} + +-- Core functions (mandatory 3) +pub fn manifest_new(dataset_version str) -> Manifest +pub fn manifest_add_pair(m Manifest, p Pair) -> Manifest +pub fn manifest_validate(m Manifest, pairs [Pair]) -> bool + +-- Invariants (mandatory 3) + +invariant schema_version_locked { + given m Manifest + assert m.schema_version == MANIFEST_SCHEMA_VERSION +} + +invariant pair_ids_unique_in_manifest { + given m Manifest + given pairs [Pair] + -- for any two pairs at different indices, their pair_id differ + assert forall i, j in 0..m.pair_count : i != j implies pairs[i].pair_id != pairs[j].pair_id +} + +invariant spec_sha256_length_is_32 { + given p Pair + assert len(p.spec_sha256) == 32 +} + +-- Tests (mandatory 8) + +test manifest_new_starts_empty { + let m = manifest_new("0.1") + assert m.pair_count == 0 + assert m.schema_version == MANIFEST_SCHEMA_VERSION +} + +test add_pair_increments_count { + let m0 = manifest_new("0.1") + let p = pair_new("0001-mozg-state-machine", "specs/organism/mozg.tri", sha256_of("m"), + "gen/organism/mozg.zig", sha256_of("g"), TargetLang.Zig, + "ring-105-002", License.Apache2, DecontamStatus.Skipped) + let m1 = manifest_add_pair(m0, p) + assert m1.pair_count == 1 +} + +test add_duplicate_pair_id_rejected { + let m0 = manifest_new("0.1") + let p = pair_new("0001-dup", "s", sha256_of("m"), "g", sha256_of("g"), + TargetLang.Zig, "ring-105-002", License.Apache2, DecontamStatus.Skipped) + let m1 = manifest_add_pair(m0, p) + let m2 = manifest_add_pair(m1, p) -- second time -> no increment + assert m2.pair_count == m1.pair_count +} + +test spec_only_pair_target_none_allowed { + let p = pair_new("0002-experience-format", "specs/organism/experience.tri", sha256_of("m"), + "", zero_bytes32(), TargetLang.None, + "ring-105-001", License.Apache2, DecontamStatus.Skipped) + assert p.target_lang == TargetLang.None +} + +test v01_decontam_status_defaults_to_skipped { + let p = pair_new("0003-orch", "s", sha256_of("m"), "g", sha256_of("g"), + TargetLang.Zig, "ring-105-003", License.Apache2, DecontamStatus.Skipped) + assert p.decontam_status == DecontamStatus.Skipped +} + +test manifest_bidirectional_flag_false_at_v01 { + let m = manifest_new("0.1") + assert m.decontam_bidirectional == false +} + +test pair_id_ascii_only { + let p = pair_new("0004-test", "s", sha256_of("m"), "g", sha256_of("g"), + TargetLang.Zig, "ring-105-002", License.Apache2, DecontamStatus.Skipped) + assert forall b in p.pair_id : b >= 0x20 and b <= 0x7E +} + +test validate_manifest_ok_when_all_hashes_match { + let m0 = manifest_new("0.1") + let p1 = pair_new("0001", "s1", sha256_of("m1"), "g1", sha256_of("g1"), + TargetLang.Zig, "ring-105-002", License.Apache2, DecontamStatus.Skipped) + let m1 = manifest_add_pair(m0, p1) + assert manifest_validate(m1, [p1]) == true +} + +-- Benchmarks (mandatory 2) + +bench manifest_add_1k_pairs { + measure nanoseconds to manifest_add_pair(m, p) + target 100_000_000 + warmup 3 + runs 100 +} + +bench manifest_validate_100_pairs { + measure nanoseconds to manifest_validate(m, pairs_100) + target 10_000_000 + warmup 3 + runs 100 +} diff --git a/specs/dataset/igla_coder_manifest.tri b/specs/dataset/igla_coder_manifest.tri new file mode 100644 index 000000000..846306137 --- /dev/null +++ b/specs/dataset/igla_coder_manifest.tri @@ -0,0 +1,152 @@ +spec igla_coder_manifest + +-- Ring 105-007: IGLA CODER dataset v0.1 manifest schema +-- Target path in t27 repo: specs/dataset/igla_coder_manifest.tri +-- Purpose: define the shape of dataset/igla-coder/v0.1/MANIFEST.json +-- Law compliance: L1 (Closes t27#new-8), L3, L4, HR-decontam + +pub const PAIR_ID_MAX_LEN u32 = 64 +pub const MANIFEST_SCHEMA_VERSION u32 = 1 + +pub type Bytes32 = [32]u8 + +pub type TargetLang = enum(u8) { + Zig = 0, + Rust = 1, + Verilog = 2, + C = 3, + Python = 4, + TypeScript = 5, -- reserved; codegen deferred to Wave-3 + None = 255 -- spec-only pair, no gen file +} + +pub type License = enum(u8) { + Apache2 = 0, + MIT = 1, + BSD3 = 2, + Other = 255 +} + +pub type DecontamStatus = enum(u8) { + Clean = 0, + Skipped = 1, -- e.g. v0.1: no held-out eval yet + Failed = 2 +} + +pub type Pair = struct { + pair_id: str, + spec_path: str, + spec_sha256: Bytes32, + gen_path_opt: str, + gen_sha256_opt: Bytes32, + target_lang: TargetLang, + ring_id: str, + license: License, + decontam_status: DecontamStatus +} + +pub type Manifest = struct { + schema_version: u32, + dataset_version: str, + built_at_epoch: i64, + pair_count: u32, + decontam_bidirectional: bool +} + +-- Core functions (mandatory 3) +pub fn manifest_new(dataset_version str) -> Manifest +pub fn manifest_add_pair(m Manifest, p Pair) -> Manifest +pub fn manifest_validate(m Manifest, pairs [Pair]) -> bool + +-- Invariants (mandatory 3) + +invariant schema_version_locked { + given m Manifest + assert m.schema_version == MANIFEST_SCHEMA_VERSION +} + +invariant pair_ids_unique_in_manifest { + given m Manifest + given pairs [Pair] + -- for any two pairs at different indices, their pair_id differ + assert forall i, j in 0..m.pair_count : i != j implies pairs[i].pair_id != pairs[j].pair_id +} + +invariant spec_sha256_length_is_32 { + given p Pair + assert len(p.spec_sha256) == 32 +} + +-- Tests (mandatory 8) + +test manifest_new_starts_empty { + let m = manifest_new("0.1") + assert m.pair_count == 0 + assert m.schema_version == MANIFEST_SCHEMA_VERSION +} + +test add_pair_increments_count { + let m0 = manifest_new("0.1") + let p = pair_new("0001-mozg-state-machine", "specs/organism/mozg.tri", sha256_of("m"), + "gen/organism/mozg.zig", sha256_of("g"), TargetLang.Zig, + "ring-105-002", License.Apache2, DecontamStatus.Skipped) + let m1 = manifest_add_pair(m0, p) + assert m1.pair_count == 1 +} + +test add_duplicate_pair_id_rejected { + let m0 = manifest_new("0.1") + let p = pair_new("0001-dup", "s", sha256_of("m"), "g", sha256_of("g"), + TargetLang.Zig, "ring-105-002", License.Apache2, DecontamStatus.Skipped) + let m1 = manifest_add_pair(m0, p) + let m2 = manifest_add_pair(m1, p) -- second time -> no increment + assert m2.pair_count == m1.pair_count +} + +test spec_only_pair_target_none_allowed { + let p = pair_new("0002-experience-format", "specs/organism/experience.tri", sha256_of("m"), + "", zero_bytes32(), TargetLang.None, + "ring-105-001", License.Apache2, DecontamStatus.Skipped) + assert p.target_lang == TargetLang.None +} + +test v01_decontam_status_defaults_to_skipped { + let p = pair_new("0003-orch", "s", sha256_of("m"), "g", sha256_of("g"), + TargetLang.Zig, "ring-105-003", License.Apache2, DecontamStatus.Skipped) + assert p.decontam_status == DecontamStatus.Skipped +} + +test manifest_bidirectional_flag_false_at_v01 { + let m = manifest_new("0.1") + assert m.decontam_bidirectional == false +} + +test pair_id_ascii_only { + let p = pair_new("0004-test", "s", sha256_of("m"), "g", sha256_of("g"), + TargetLang.Zig, "ring-105-002", License.Apache2, DecontamStatus.Skipped) + assert forall b in p.pair_id : b >= 0x20 and b <= 0x7E +} + +test validate_manifest_ok_when_all_hashes_match { + let m0 = manifest_new("0.1") + let p1 = pair_new("0001", "s1", sha256_of("m1"), "g1", sha256_of("g1"), + TargetLang.Zig, "ring-105-002", License.Apache2, DecontamStatus.Skipped) + let m1 = manifest_add_pair(m0, p1) + assert manifest_validate(m1, [p1]) == true +} + +-- Benchmarks (mandatory 2) + +bench manifest_add_1k_pairs { + measure nanoseconds to manifest_add_pair(m, p) + target 100_000_000 + warmup 3 + runs 100 +} + +bench manifest_validate_100_pairs { + measure nanoseconds to manifest_validate(m, pairs_100) + target 10_000_000 + warmup 3 + runs 100 +}