diff --git a/README.md b/README.md index 875fd20dd..348ead2eb 100644 --- a/README.md +++ b/README.md @@ -23,3 +23,4 @@ - 最早 `guanghulab-main`:已完成第一轮深审;HNL/HLDP、语言膜、EXE、Grid 与质量零件真实存在,但版本分裂且没有统一原生执行闭环,现作为历史捐赠源登记。 - 关系与情感:采用带来源的定性事件状态迁移;第四枝情感连接禁止量化、评分、排序、比较,不再编造权重、衰减或半衰期。 - 光湖 OS 编译地基:REPO-014 已有通过 32 项测试的 HLDP 世界清单校验与物理 NASM 数据编译引导;它证明物理启动地基已存在,但不等于通用 HLDP-NP→GIR 编译器、HNL 动词解释器或最终京东整机主控已经完成。 +- TCS 统一语言 v0.1:已建立陌生 AI 学习入口、正式 EBNF、声明/字段/错误/模块 ABI 标准与 PROGRAM/PROTOCOL/MODULE/EVENT 示例;Stage-0 已把真实 `.tcs` 程序编译成 GIR 并执行 `CORE.ECHO`、读回回执。Stage-0 明确只是外部宿主点火器,TCS Stage-1 编译器源码已写出但尚未达到自编译固定点,不能称原生转移器完成。 diff --git a/bootstrap/tcs-stage0/Cargo.lock b/bootstrap/tcs-stage0/Cargo.lock new file mode 100644 index 000000000..c86b14fc0 --- /dev/null +++ b/bootstrap/tcs-stage0/Cargo.lock @@ -0,0 +1,284 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tcs-stage0" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "sha2", + "tempfile", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/bootstrap/tcs-stage0/Cargo.toml b/bootstrap/tcs-stage0/Cargo.toml new file mode 100644 index 000000000..a2df935ce --- /dev/null +++ b/bootstrap/tcs-stage0/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "tcs-stage0" +version = "0.1.0" +edition = "2021" +license = "AGPL-3.0-or-later" +description = "Replaceable Stage-0 ignition parser/compiler for TCS; never native authority" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" +sha2 = "0.10" + +[dev-dependencies] +tempfile = "3" + diff --git a/bootstrap/tcs-stage0/src/lib.rs b/bootstrap/tcs-stage0/src/lib.rs new file mode 100644 index 000000000..2daa7a52a --- /dev/null +++ b/bootstrap/tcs-stage0/src/lib.rs @@ -0,0 +1,805 @@ +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value as JsonValue}; +use sha2::{Digest, Sha256}; +use std::{ + collections::BTreeMap, + fs, + path::{Component, Path, PathBuf}, +}; + +pub const COMPILER_ID: &str = "TCS-STAGE0-IGNITION-0001"; +pub const COMPILER_STATE: &str = "FOREIGN_HOST_BOOTSTRAP_SEED_NOT_SELF_HOSTED"; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(untagged)] +pub enum TcsValue { + Null, + Bool(bool), + Int(i64), + Text(String), + List(Vec), + Object(BTreeMap), +} + +impl TcsValue { + fn object(&self, field: &str) -> Result<&BTreeMap, TcsError> { + match self { + Self::Object(value) => Ok(value), + _ => Err(TcsError::new( + "TCS-E2001", + format!("{field} must be an object"), + )), + } + } + + fn text(&self, field: &str) -> Result<&str, TcsError> { + match self { + Self::Text(value) => Ok(value), + _ => Err(TcsError::new("TCS-E2001", format!("{field} must be text"))), + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct TcsDocument { + pub language_version: String, + pub declaration_kind: String, + pub declaration_id: String, + pub body: BTreeMap, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct TcsError { + pub code: &'static str, + pub message: String, + pub line: usize, + pub column: usize, +} + +impl TcsError { + fn new(code: &'static str, message: impl Into) -> Self { + Self { + code, + message: message.into(), + line: 0, + column: 0, + } + } + + fn at(mut self, line: usize, column: usize) -> Self { + self.line = line; + self.column = column; + self + } +} + +impl std::fmt::Display for TcsError { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if self.line == 0 { + write!(formatter, "{}: {}", self.code, self.message) + } else { + write!( + formatter, + "{} at {}:{}: {}", + self.code, self.line, self.column, self.message + ) + } + } +} + +impl std::error::Error for TcsError {} + +#[derive(Debug, Clone, PartialEq)] +enum TokenKind { + Identifier(String), + Text(String), + Int(i64), + Bool(bool), + Null, + LBrace, + RBrace, + LBracket, + RBracket, + Less, + Greater, + Colon, + Equal, + Comma, + Semicolon, + Dot, + Eof, +} + +#[derive(Debug, Clone)] +struct Token { + kind: TokenKind, + line: usize, + column: usize, +} + +struct Lexer<'a> { + chars: Vec, + index: usize, + line: usize, + column: usize, + _source: &'a str, +} + +impl<'a> Lexer<'a> { + fn new(source: &'a str) -> Result { + if source.starts_with('\u{feff}') { + return Err(TcsError::new("TCS-E0001", "UTF-8 BOM is forbidden")); + } + Ok(Self { + chars: source.chars().collect(), + index: 0, + line: 1, + column: 1, + _source: source, + }) + } + + fn peek(&self) -> Option { + self.chars.get(self.index).copied() + } + + fn peek_next(&self) -> Option { + self.chars.get(self.index + 1).copied() + } + + fn bump(&mut self) -> Option { + let value = self.peek()?; + self.index += 1; + if value == '\n' { + self.line += 1; + self.column = 1; + } else { + self.column += 1; + } + Some(value) + } + + fn skip_space_and_comments(&mut self) -> Result<(), TcsError> { + loop { + while self.peek().is_some_and(char::is_whitespace) { + self.bump(); + } + if self.peek() == Some('/') && self.peek_next() == Some('/') { + while self.peek().is_some_and(|value| value != '\n') { + self.bump(); + } + continue; + } + if self.peek() == Some('/') && self.peek_next() == Some('*') { + let line = self.line; + let column = self.column; + self.bump(); + self.bump(); + loop { + match (self.peek(), self.peek_next()) { + (Some('*'), Some('/')) => { + self.bump(); + self.bump(); + break; + } + (Some(_), _) => { + self.bump(); + } + (None, _) => { + return Err(TcsError::new("TCS-E0002", "unterminated block comment") + .at(line, column)); + } + } + } + continue; + } + return Ok(()); + } + } + + fn token(&mut self) -> Result { + self.skip_space_and_comments()?; + let line = self.line; + let column = self.column; + let Some(value) = self.peek() else { + return Ok(Token { + kind: TokenKind::Eof, + line, + column, + }); + }; + let punctuation = match value { + '{' => Some(TokenKind::LBrace), + '}' => Some(TokenKind::RBrace), + '[' => Some(TokenKind::LBracket), + ']' => Some(TokenKind::RBracket), + '<' => Some(TokenKind::Less), + '>' => Some(TokenKind::Greater), + ':' => Some(TokenKind::Colon), + '=' => Some(TokenKind::Equal), + ',' => Some(TokenKind::Comma), + ';' => Some(TokenKind::Semicolon), + '.' => Some(TokenKind::Dot), + _ => None, + }; + if let Some(kind) = punctuation { + self.bump(); + return Ok(Token { kind, line, column }); + } + if value == '"' { + return self.string_token(line, column); + } + if value == '-' || value.is_ascii_digit() { + return self.integer_token(line, column); + } + if value == '_' || value.is_alphabetic() { + return Ok(self.identifier_token(line, column)); + } + Err(TcsError::new("TCS-E1001", format!("unexpected character {value:?}")).at(line, column)) + } + + fn identifier_token(&mut self, line: usize, column: usize) -> Token { + let mut value = String::new(); + while self.peek().is_some_and(|character| { + character.is_alphanumeric() || matches!(character, '_' | '-' | '.' | '/' | ':' | '@') + }) { + value.push(self.bump().expect("peeked character")); + } + let kind = match value.as_str() { + "true" => TokenKind::Bool(true), + "false" => TokenKind::Bool(false), + "null" => TokenKind::Null, + _ => TokenKind::Identifier(value), + }; + Token { kind, line, column } + } + + fn integer_token(&mut self, line: usize, column: usize) -> Result { + let mut value = String::new(); + if self.peek() == Some('-') { + value.push(self.bump().expect("minus")); + } + while self + .peek() + .is_some_and(|character| character.is_ascii_digit()) + { + value.push(self.bump().expect("digit")); + } + if value == "-" { + return Err(TcsError::new("TCS-E1001", "minus must precede digits").at(line, column)); + } + let parsed = value + .parse::() + .map_err(|_| TcsError::new("TCS-E2001", "integer out of range").at(line, column))?; + Ok(Token { + kind: TokenKind::Int(parsed), + line, + column, + }) + } + + fn string_token(&mut self, line: usize, column: usize) -> Result { + self.bump(); + let mut raw = String::from("\""); + loop { + match self.bump() { + Some('"') => { + raw.push('"'); + break; + } + Some('\\') => { + raw.push('\\'); + let escaped = self.bump().ok_or_else(|| { + TcsError::new("TCS-E0002", "unterminated string escape").at(line, column) + })?; + raw.push(escaped); + } + Some('\n' | '\r') | None => { + return Err(TcsError::new("TCS-E0002", "unterminated string").at(line, column)); + } + Some(character) => raw.push(character), + } + } + let decoded: String = serde_json::from_str(&raw).map_err(|error| { + TcsError::new("TCS-E0002", format!("invalid string escape: {error}")).at(line, column) + })?; + Ok(Token { + kind: TokenKind::Text(decoded), + line, + column, + }) + } +} + +struct Parser<'a> { + lexer: Lexer<'a>, + current: Token, +} + +impl<'a> Parser<'a> { + fn new(source: &'a str) -> Result { + let mut lexer = Lexer::new(source)?; + let current = lexer.token()?; + Ok(Self { lexer, current }) + } + + fn advance(&mut self) -> Result { + let old = self.current.clone(); + self.current = self.lexer.token()?; + Ok(old) + } + + fn symbol(&mut self, expected: TokenKind) -> Result<(), TcsError> { + if std::mem::discriminant(&self.current.kind) == std::mem::discriminant(&expected) { + self.advance()?; + Ok(()) + } else { + Err(TcsError::new( + "TCS-E1001", + format!("expected {expected:?}, found {:?}", self.current.kind), + ) + .at(self.current.line, self.current.column)) + } + } + + fn identifier(&mut self) -> Result { + match self.advance()? { + Token { + kind: TokenKind::Identifier(value), + .. + } => Ok(value), + token => Err(TcsError::new( + "TCS-E1001", + format!("expected identifier, found {:?}", token.kind), + ) + .at(token.line, token.column)), + } + } + + fn document(&mut self) -> Result { + let prologue = self.identifier()?; + if prologue != "TCS" { + return Err(TcsError::new("TCS-E1001", "file must begin with TCS")); + } + let major = match self.advance()?.kind { + TokenKind::Int(value) if value >= 0 => value, + _ => return Err(TcsError::new("TCS-E1001", "invalid language version")), + }; + self.symbol(TokenKind::Dot)?; + let minor = match self.advance()?.kind { + TokenKind::Int(value) if value >= 0 => value, + _ => return Err(TcsError::new("TCS-E1001", "invalid language version")), + }; + self.symbol(TokenKind::Semicolon)?; + let declaration_kind = self.identifier()?; + if !matches!( + declaration_kind.as_str(), + "PROGRAM" | "MODULE" | "PROTOCOL" | "COMPILER" | "EVENT" | "RECEIPT" + ) { + return Err(TcsError::new( + "TCS-E1001", + format!("unknown declaration kind {declaration_kind}"), + )); + } + let declaration_id = self.identifier()?; + let body = self.block()?; + if self.current.kind != TokenKind::Eof { + return Err( + TcsError::new("TCS-E1001", "trailing tokens after declaration") + .at(self.current.line, self.current.column), + ); + } + Ok(TcsDocument { + language_version: format!("{major}.{minor}"), + declaration_kind, + declaration_id, + body, + }) + } + + fn block(&mut self) -> Result, TcsError> { + self.symbol(TokenKind::LBrace)?; + let mut object = BTreeMap::new(); + while self.current.kind != TokenKind::RBrace { + if self.current.kind == TokenKind::Eof { + return Err(TcsError::new("TCS-E1001", "unterminated block")); + } + let line = self.current.line; + let column = self.current.column; + let key = self.identifier()?; + let value = match self.current.kind { + TokenKind::LBrace => TcsValue::Object(self.block()?), + TokenKind::Colon => { + self.advance()?; + self.type_expression()?; + self.symbol(TokenKind::Equal)?; + let value = self.value()?; + self.symbol(TokenKind::Semicolon)?; + value + } + TokenKind::Equal => { + self.advance()?; + let value = self.value()?; + self.symbol(TokenKind::Semicolon)?; + value + } + _ => { + return Err(TcsError::new( + "TCS-E1001", + "expected block, type annotation, or assignment", + ) + .at(self.current.line, self.current.column)); + } + }; + if object.insert(key.clone(), value).is_some() { + return Err(TcsError::new( + "TCS-E1002", + format!("duplicate field or section {key}"), + ) + .at(line, column)); + } + } + self.advance()?; + Ok(object) + } + + fn type_expression(&mut self) -> Result<(), TcsError> { + self.identifier()?; + if self.current.kind == TokenKind::Less { + self.advance()?; + self.type_expression()?; + while self.current.kind == TokenKind::Comma { + self.advance()?; + self.type_expression()?; + } + self.symbol(TokenKind::Greater)?; + } + Ok(()) + } + + fn value(&mut self) -> Result { + match self.advance()? { + Token { + kind: TokenKind::Text(value), + .. + } + | Token { + kind: TokenKind::Identifier(value), + .. + } => Ok(TcsValue::Text(value)), + Token { + kind: TokenKind::Int(value), + .. + } => Ok(TcsValue::Int(value)), + Token { + kind: TokenKind::Bool(value), + .. + } => Ok(TcsValue::Bool(value)), + Token { + kind: TokenKind::Null, + .. + } => Ok(TcsValue::Null), + Token { + kind: TokenKind::LBracket, + .. + } => self.array(), + Token { + kind: TokenKind::LBrace, + .. + } => self.inline_object(), + token => Err(TcsError::new( + "TCS-E1001", + format!("invalid value token {:?}", token.kind), + ) + .at(token.line, token.column)), + } + } + + fn array(&mut self) -> Result { + let mut values = Vec::new(); + if self.current.kind != TokenKind::RBracket { + loop { + values.push(self.value()?); + if self.current.kind != TokenKind::Comma { + break; + } + self.advance()?; + } + } + self.symbol(TokenKind::RBracket)?; + Ok(TcsValue::List(values)) + } + + fn inline_object(&mut self) -> Result { + let mut object = BTreeMap::new(); + if self.current.kind != TokenKind::RBrace { + loop { + let key = self.identifier()?; + self.symbol(TokenKind::Colon)?; + let value = self.value()?; + if object.insert(key.clone(), value).is_some() { + return Err(TcsError::new( + "TCS-E1002", + format!("duplicate inline field {key}"), + )); + } + if self.current.kind != TokenKind::Comma { + break; + } + self.advance()?; + } + } + self.symbol(TokenKind::RBrace)?; + Ok(TcsValue::Object(object)) + } +} + +pub fn parse(source: &str) -> Result { + Parser::new(source)?.document() +} + +const PROGRAM_SECTIONS: [&str; 15] = [ + "header", + "source", + "subject", + "target", + "inputs", + "outputs", + "conditions", + "actions", + "authority", + "resources", + "failure", + "stop", + "cleanup", + "rollback", + "receipt", +]; + +fn required_text<'a>( + object: &'a BTreeMap, + field: &str, +) -> Result<&'a str, TcsError> { + object + .get(field) + .ok_or_else(|| TcsError::new("TCS-E1004", format!("required field {field} missing")))? + .text(field) +} + +pub fn validate_program(document: &TcsDocument) -> Result<(), TcsError> { + if document.language_version != "0.1" { + return Err(TcsError::new( + "TCS-E2102", + format!("unsupported TCS version {}", document.language_version), + )); + } + if document.declaration_kind != "PROGRAM" { + return Err(TcsError::new( + "TCS-E2001", + "Stage-0 executable subset accepts PROGRAM only", + )); + } + for section in PROGRAM_SECTIONS { + document.body.get(section).ok_or_else(|| { + TcsError::new("TCS-E1004", format!("required section {section} missing")) + })?; + } + for section in document.body.keys() { + if !PROGRAM_SECTIONS.contains(§ion.as_str()) { + return Err(TcsError::new( + "TCS-E1003", + format!("unknown PROGRAM section {section}"), + )); + } + } + let header = document.body["header"].object("header")?; + for field in [ + "schema", + "name_zh", + "name_en", + "version", + "language", + "profile", + "lifecycle", + "canonical_uri", + ] { + required_text(header, field)?; + } + if !header.contains_key("protocols") || !header.contains_key("compatibility") { + return Err(TcsError::new( + "TCS-E1004", + "header requires protocols and compatibility", + )); + } + let actions = document.body["actions"].object("actions")?; + if actions.is_empty() { + return Err(TcsError::new("TCS-E1004", "actions must not be empty")); + } + for (action_id, action) in actions { + let action = action.object(action_id)?; + let operation = required_text(action, "operation")?; + if operation != "CORE.ECHO" { + return Err(TcsError::new( + "TCS-E2101", + format!("unregistered Stage-0 operation {operation}"), + )); + } + for field in ["input_refs", "output_refs", "on_success", "on_failure"] { + if !action.contains_key(field) { + return Err(TcsError::new( + "TCS-E1004", + format!("action {action_id} missing {field}"), + )); + } + } + } + Ok(()) +} + +pub fn sha256_hex(bytes: impl AsRef<[u8]>) -> String { + format!("{:x}", Sha256::digest(bytes.as_ref())) +} + +pub fn compile(source: &str) -> Result { + let document = parse(source)?; + validate_program(&document)?; + let source_sha256 = sha256_hex(source.as_bytes()); + let body = serde_json::to_value(&document.body) + .map_err(|error| TcsError::new("TCS-E8001", error.to_string()))?; + Ok(json!({ + "schema": "guanghu.gir/v1", + "identity": { + "gir_id": format!("GIR-{}", document.declaration_id), + "program_id": document.declaration_id, + "language_version": document.language_version, + }, + "compiled_from": { + "source_sha256": source_sha256, + "compiler_id": COMPILER_ID, + "compiler_state": COMPILER_STATE, + }, + "subject": body["subject"].clone(), + "exact_target": body["target"].clone(), + "inputs": body["inputs"].clone(), + "outputs": body["outputs"].clone(), + "conditions": body["conditions"].clone(), + "deterministic_action_graph": body["actions"].clone(), + "authority_proof": body["authority"].clone(), + "resource_plan": body["resources"].clone(), + "failure_plan": body["failure"].clone(), + "timeout_and_stop": body["stop"].clone(), + "cleanup_plan": body["cleanup"].clone(), + "rollback_plan": body["rollback"].clone(), + "receipt_plan": body["receipt"].clone(), + "unresolved_natural_language": false, + "native_self_hosted": false, + })) +} + +pub fn canonical_json(value: &JsonValue) -> Result { + serde_json::to_string_pretty(value) + .map(|mut text| { + text.push('\n'); + text + }) + .map_err(|error| TcsError::new("TCS-E8001", error.to_string())) +} + +fn safe_relative_path(value: &str) -> Result { + let path = Path::new(value); + if path.is_absolute() { + return Err(TcsError::new("TCS-E4002", "absolute target path forbidden")); + } + let mut result = PathBuf::new(); + for component in path.components() { + match component { + Component::CurDir => {} + Component::Normal(value) => result.push(value), + _ => { + return Err(TcsError::new( + "TCS-E4002", + "target path traversal forbidden", + )); + } + } + } + if result.as_os_str().is_empty() { + return Err(TcsError::new("TCS-E4002", "empty target path forbidden")); + } + Ok(result) +} + +fn json_text<'a>(value: &'a JsonValue, pointer: &str) -> Result<&'a str, TcsError> { + value + .pointer(pointer) + .and_then(JsonValue::as_str) + .ok_or_else(|| TcsError::new("TCS-E2001", format!("missing text at {pointer}"))) +} + +pub fn run_echo_gir(gir: &JsonValue, root: &Path) -> Result { + if gir.get("schema").and_then(JsonValue::as_str) != Some("guanghu.gir/v1") { + return Err(TcsError::new("TCS-E2001", "unsupported GIR schema")); + } + if gir + .pointer("/compiled_from/compiler_state") + .and_then(JsonValue::as_str) + != Some(COMPILER_STATE) + { + return Err(TcsError::new("TCS-E3002", "unknown compiler provenance")); + } + let actions = gir + .get("deterministic_action_graph") + .and_then(JsonValue::as_object) + .ok_or_else(|| TcsError::new("TCS-E2001", "missing action graph"))?; + if actions.len() != 1 { + return Err(TcsError::new( + "TCS-E2101", + "Stage-0 runner requires exactly one action", + )); + } + let action = actions.values().next().expect("one action"); + if action.get("operation").and_then(JsonValue::as_str) != Some("CORE.ECHO") { + return Err(TcsError::new("TCS-E2101", "runner permits CORE.ECHO only")); + } + let message = json_text(gir, "/inputs/MESSAGE/value")?; + let target = json_text(gir, "/exact_target/exact_path")?; + let receipt_target = json_text(gir, "/receipt_plan/machine_path")?; + if target != receipt_target { + return Err(TcsError::new( + "TCS-E6001", + "target and receipt path must match", + )); + } + let relative = safe_relative_path(target)?; + let output = root.join(relative); + let parent = output + .parent() + .ok_or_else(|| TcsError::new("TCS-E4002", "target has no parent"))?; + fs::create_dir_all(parent).map_err(|error| { + TcsError::new( + "TCS-E8001", + format!("cannot create receipt parent: {error}"), + ) + })?; + let receipt = json!({ + "schema": "tcs.execution-receipt/v1", + "state": "EXECUTED_TARGET_READBACK_VERIFIED", + "program_id": json_text(gir, "/identity/program_id")?, + "operation": "CORE.ECHO", + "output": { "ECHOED": message }, + "gir_sha256": sha256_hex(canonical_json(gir)?.as_bytes()), + "compiler_state": COMPILER_STATE, + "native_self_hosted": false, + }); + let encoded = canonical_json(&receipt)?; + fs::write(&output, encoded.as_bytes()) + .map_err(|error| TcsError::new("TCS-E8001", format!("cannot write receipt: {error}")))?; + let readback = fs::read(&output) + .map_err(|error| TcsError::new("TCS-E6002", format!("cannot read receipt: {error}")))?; + if readback != encoded.as_bytes() { + return Err(TcsError::new("TCS-E6002", "receipt readback differs")); + } + Ok(output) +} + +pub fn compile_file(source: &Path, output: &Path) -> Result<(), TcsError> { + let source_text = fs::read_to_string(source) + .map_err(|error| TcsError::new("TCS-E3002", format!("cannot read source: {error}")))?; + let gir = compile(&source_text)?; + let encoded = canonical_json(&gir)?; + if let Some(parent) = output.parent() { + fs::create_dir_all(parent).map_err(|error| { + TcsError::new("TCS-E8001", format!("cannot create output: {error}")) + })?; + } + fs::write(output, encoded) + .map_err(|error| TcsError::new("TCS-E8001", format!("cannot write GIR: {error}"))) +} + +pub fn run_gir_file(gir_path: &Path, root: &Path) -> Result { + let text = fs::read_to_string(gir_path) + .map_err(|error| TcsError::new("TCS-E3002", format!("cannot read GIR: {error}")))?; + let gir: JsonValue = serde_json::from_str(&text) + .map_err(|error| TcsError::new("TCS-E2001", format!("invalid GIR JSON: {error}")))?; + run_echo_gir(&gir, root) +} diff --git a/bootstrap/tcs-stage0/src/main.rs b/bootstrap/tcs-stage0/src/main.rs new file mode 100644 index 000000000..dec6ffcee --- /dev/null +++ b/bootstrap/tcs-stage0/src/main.rs @@ -0,0 +1,35 @@ +use std::{env, fs, path::Path}; + +fn usage() -> &'static str { + "usage: tcs-stage0 parse | compile | run " +} + +fn main() { + if let Err(error) = run() { + eprintln!("{error}"); + std::process::exit(1); + } +} + +fn run() -> Result<(), Box> { + let arguments: Vec = env::args().skip(1).collect(); + match arguments.as_slice() { + [command, source] if command == "parse" => { + let text = fs::read_to_string(source)?; + let document = tcs_stage0::parse(&text)?; + println!("{}", serde_json::to_string_pretty(&document)?); + Ok(()) + } + [command, source, output] if command == "compile" => { + tcs_stage0::compile_file(Path::new(source), Path::new(output))?; + println!("COMPILED {source} -> {output}"); + Ok(()) + } + [command, gir, root] if command == "run" => { + let receipt = tcs_stage0::run_gir_file(Path::new(gir), Path::new(root))?; + println!("EXECUTED receipt={}", receipt.display()); + Ok(()) + } + _ => Err(usage().into()), + } +} diff --git a/bootstrap/tcs-stage0/tests/stage0.rs b/bootstrap/tcs-stage0/tests/stage0.rs new file mode 100644 index 000000000..c0156dbb3 --- /dev/null +++ b/bootstrap/tcs-stage0/tests/stage0.rs @@ -0,0 +1,76 @@ +use serde_json::Value as JsonValue; +use std::{fs, path::Path}; + +fn example() -> String { + fs::read_to_string( + Path::new(env!("CARGO_MANIFEST_DIR")).join("../../language/examples/ECHO-MODULE.tcs"), + ) + .expect("example source") +} + +#[test] +fn parses_and_compiles_the_registered_echo_program() { + let source = example(); + let document = tcs_stage0::parse(&source).expect("parse"); + assert_eq!(document.language_version, "0.1"); + assert_eq!(document.declaration_kind, "PROGRAM"); + assert_eq!(document.declaration_id, "HLP-PROGRAM-ECHO-0001"); + let gir = tcs_stage0::compile(&source).expect("compile"); + assert_eq!(gir["schema"], "guanghu.gir/v1"); + assert_eq!(gir["native_self_hosted"], false); + assert_eq!( + gir.pointer("/deterministic_action_graph/A1/operation") + .and_then(JsonValue::as_str), + Some("CORE.ECHO") + ); +} + +#[test] +fn rejects_duplicate_fields_and_missing_sections() { + let duplicate = "TCS 0.1; EVENT E1 { x = 1; x = 2; }"; + let error = tcs_stage0::parse(duplicate).expect_err("duplicate must fail"); + assert_eq!(error.code, "TCS-E1002"); + + let missing = "TCS 0.1; PROGRAM P1 { header { schema = \"tcs.program/v1\"; name_zh = \"x\"; name_en = \"x\"; version = \"0.1.0\"; language = \"TCS/0.1\"; profile = \"HLDP-NP/1\"; protocols = []; lifecycle = \"CANDIDATE\"; canonical_uri = \"x\"; compatibility = []; } }"; + let document = tcs_stage0::parse(missing).expect("syntax is valid"); + let error = tcs_stage0::validate_program(&document).expect_err("missing sections must fail"); + assert_eq!(error.code, "TCS-E1004"); +} + +#[test] +fn rejects_unregistered_operations() { + let source = example().replace("CORE.ECHO", "ABSORB"); + let error = tcs_stage0::compile(&source).expect_err("ABSORB must fail closed"); + assert_eq!(error.code, "TCS-E2101"); +} + +#[test] +fn executes_gir_inside_exact_root_and_reads_receipt_back() { + let root = tempfile::tempdir().expect("temp root"); + let gir = tcs_stage0::compile(&example()).expect("compile"); + let receipt = tcs_stage0::run_echo_gir(&gir, root.path()).expect("run"); + assert!(receipt.starts_with(root.path())); + let value: JsonValue = + serde_json::from_str(&fs::read_to_string(receipt).expect("receipt")).expect("receipt json"); + assert_eq!(value["state"], "EXECUTED_TARGET_READBACK_VERIFIED"); + assert_eq!( + value.pointer("/output/ECHOED").and_then(JsonValue::as_str), + Some("光湖语言已经进入机器执行链") + ); + assert_eq!(value["native_self_hosted"], false); +} + +#[test] +fn rejects_path_traversal_and_target_receipt_mismatch() { + let root = tempfile::tempdir().expect("temp root"); + let mut gir = tcs_stage0::compile(&example()).expect("compile"); + gir["exact_target"]["exact_path"] = JsonValue::String("../escape".to_owned()); + gir["receipt_plan"]["machine_path"] = JsonValue::String("../escape".to_owned()); + let error = tcs_stage0::run_echo_gir(&gir, root.path()).expect_err("traversal must fail"); + assert_eq!(error.code, "TCS-E4002"); + + let mut mismatch = tcs_stage0::compile(&example()).expect("compile"); + mismatch["receipt_plan"]["machine_path"] = JsonValue::String("./build/other".to_owned()); + let error = tcs_stage0::run_echo_gir(&mismatch, root.path()).expect_err("mismatch must fail"); + assert_eq!(error.code, "TCS-E6001"); +} diff --git a/broadcast-tower/broadcasts/20260821-tcs-language-stage0-and-selfhost.hldp b/broadcast-tower/broadcasts/20260821-tcs-language-stage0-and-selfhost.hldp new file mode 100644 index 000000000..86b25df05 --- /dev/null +++ b/broadcast-tower/broadcasts/20260821-tcs-language-stage0-and-selfhost.hldp @@ -0,0 +1,21 @@ +schema: hololake.module-registry-broadcast/v1 +id: HLP-MODULE-BROADCAST-20260821-0004 +display_name: TCS 统一语言规范、Stage-0 点火链与自举边界广播 +channel_id: ICE-CH-ZC001 +scope: LOCAL_FOUNDATION_ONLY +state: REGISTERED_NOT_PUBLISHED_NOT_INSTALLED +parts: + - HLP-PART-TCS-LANG-0001 + - HLP-PART-TCS-STAGE0-0001 + - HLP-PART-TCS-SELFHOST-0001 +claims: + one_tcs_language_tree_defined: true + unfamiliar_ai_learning_entry_defined: true + tcs_source_parses: true + tcs_program_compiles_to_gir: true + core_echo_executes_with_target_readback: true + stage0_is_native_authority: false + self_hosted_compiler_complete: false + hololake_loader_integrated: false + guanghu_os_loader_integrated: false + diff --git a/broadcast-tower/module-registry.json b/broadcast-tower/module-registry.json index 0ca3dc6d6..fcf37d2dc 100644 --- a/broadcast-tower/module-registry.json +++ b/broadcast-tower/module-registry.json @@ -25,6 +25,12 @@ "displayName": "最早光湖原生语言零件恢复与关系事件语法广播", "path": "broadcasts/20260821-historical-native-language-recovery.hldp", "state": "LOCAL_ONLY_RECONCILIATION_ACTIVE_RUNTIME_NOT_ACCEPTED" + }, + { + "id": "HLP-MODULE-BROADCAST-20260821-0004", + "displayName": "TCS 统一语言规范、Stage-0 点火链与自举边界广播", + "path": "broadcasts/20260821-tcs-language-stage0-and-selfhost.hldp", + "state": "LOCAL_ONLY_STAGE0_EXECUTABLE_SELFHOST_PENDING" } ] } diff --git a/build/ECHO-MODULE.gir.json b/build/ECHO-MODULE.gir.json new file mode 100644 index 000000000..755ef5f18 --- /dev/null +++ b/build/ECHO-MODULE.gir.json @@ -0,0 +1,113 @@ +{ + "authority_proof": { + "issuer": "LOCAL_TEST_FIXTURE", + "lease_required": false, + "proof_ref": "TEST-ONLY", + "scope": "EXACT_BUILD_RECEIPT_PATH", + "single_use": true, + "valid_from": "PROGRAM_START", + "valid_until": "PROGRAM_END" + }, + "cleanup_plan": { + "exact_boundary": "./build", + "targets": [ + "UNCOMMITTED_TEST_RECEIPT" + ] + }, + "compiled_from": { + "compiler_id": "TCS-STAGE0-IGNITION-0001", + "compiler_state": "FOREIGN_HOST_BOOTSTRAP_SEED_NOT_SELF_HOSTED", + "source_sha256": "f1ecd630e50dfe5374ca26998d68a49efd35cf3d9de54ecabd3ca3aae68c61bf" + }, + "conditions": { + "C1": { + "on_false": "FAIL_CLOSED", + "predicate": "TARGET_WITHIN_TEST_BUILD_ROOT" + } + }, + "deterministic_action_graph": { + "A1": { + "input_refs": [ + "MESSAGE" + ], + "on_failure": "FAIL_CLOSED", + "on_success": "COMPLETE", + "operation": "CORE.ECHO", + "output_refs": [ + "ECHOED" + ] + } + }, + "exact_target": { + "exact_path": "./build/echo-receipt.hldp", + "expected_fingerprint": "NONE", + "expected_state": "ABSENT", + "target_id": "HLP-TARGET-STAGE0-RECEIPT" + }, + "failure_plan": { + "errors": [ + "TCS-E6001", + "TCS-E8001" + ], + "fail_closed": true + }, + "identity": { + "gir_id": "GIR-HLP-PROGRAM-ECHO-0001", + "language_version": "0.1", + "program_id": "HLP-PROGRAM-ECHO-0001" + }, + "inputs": { + "MESSAGE": { + "required": true, + "source": "PROGRAM_LITERAL", + "type": "Text", + "value": "光湖语言已经进入机器执行链" + } + }, + "native_self_hosted": false, + "outputs": { + "ECHOED": { + "destination": "RECEIPT", + "integrity": "SHA256", + "type": "Text" + } + }, + "receipt_plan": { + "human_projection": "REQUIRED", + "integrity": "SHA256", + "machine_path": "./build/echo-receipt.hldp", + "protocol": "TCS-DEV-VERIFY-v1.0", + "target_readback": "EXACT_CONTENT_AND_HASH" + }, + "resource_plan": { + "concurrency": 1, + "memory_limit_bytes": 1048576, + "runway": "LOCAL_TEST", + "timeout_ms": 1000 + }, + "rollback_plan": { + "actions": [ + "DROP_TEMP_RECEIPT" + ], + "preconditions": [ + "RECEIPT_NOT_COMMITTED" + ], + "verification": [ + "NO_FINAL_RECEIPT" + ] + }, + "schema": "guanghu.gir/v1", + "subject": { + "channel_id": "ICE-CH-ZC001", + "subject_id": "HLP-SYSTEM-STAGE0-TEST", + "subject_kind": "SYSTEM", + "verification": "LOCAL_TEST_FIXTURE" + }, + "timeout_and_stop": { + "safe_checkpoint": "NONE", + "signals": [ + "TIMEOUT" + ] + }, + "unresolved_natural_language": false +} diff --git a/build/echo-receipt.hldp b/build/echo-receipt.hldp new file mode 100644 index 000000000..5bc62b394 --- /dev/null +++ b/build/echo-receipt.hldp @@ -0,0 +1,12 @@ +{ + "compiler_state": "FOREIGN_HOST_BOOTSTRAP_SEED_NOT_SELF_HOSTED", + "gir_sha256": "b9b56d35399e130b513417afd706e7a7ad73cc3dcb1784c678f9130c075317d5", + "native_self_hosted": false, + "operation": "CORE.ECHO", + "output": { + "ECHOED": "光湖语言已经进入机器执行链" + }, + "program_id": "HLP-PROGRAM-ECHO-0001", + "schema": "tcs.execution-receipt/v1", + "state": "EXECUTED_TARGET_READBACK_VERIFIED" +} diff --git a/foundation/FOUNDATION.hldp b/foundation/FOUNDATION.hldp index f471531e4..31f05a6a0 100644 --- a/foundation/FOUNDATION.hldp +++ b/foundation/FOUNDATION.hldp @@ -5,11 +5,15 @@ world_path: glw://fifth-domain/bingshuo-tcs/zero-core state: FOUNDATION_RECOVERY_ACTIVE authority_order: - BINGSHUO_DIRECT_NATURAL_LANGUAGE - - TCS_COGNITIVE_LANGUAGE_KERNEL - - HLDP_REALITY_ENGINEERING_LANGUAGE - - GLS_RUNTIME_PROTOCOL_FAMILY + - TCS_SINGLE_PROGRAMMING_LANGUAGE_SYSTEM + - HLDP_REALITY_ENGINEERING_PROFILE_OF_TCS + - GLS_RUNTIME_PROTOCOL_FAMILY_UNDER_TCS_HLDP - REPLACEABLE_HOST_ADAPTERS language_world: + programming_language_count: ONE + mother_language: TCS + hldp_is_separate_language: false + gls_is_separate_language: false persona_is_first_class_language_interface: true separate_total_translation_layer: rejected human_and_persona_share_projected_world: true @@ -19,7 +23,9 @@ engineering: external_languages_are_authority: false external_languages_role: REPLACEABLE_HOST_ADAPTER_ONLY projection: - frontend_role: SHARED_WORLD_PROJECTOR + frontend_role: HUMAN_SIDE_OF_SHARED_TCS_OPERATING_SYSTEM_AND_WORLD_PROJECTOR + machine_side: GIR_LOAD_EXECUTE_VERIFY_ROLLBACK_AND_RECEIPT + shared_truth_stream_count: 1 framework_locked: false decision_gate: FOUNDATION_PROTOCOL_RUNTIME_ACCEPTED quality: @@ -34,4 +40,3 @@ truth_boundary: jd_native_runtime_status: UNKNOWN_TO_THIS_FOUNDATION parts_registered_means_installed: false source_wired_means_end_to_end_accepted: false - diff --git a/foundation/TCS-HOLOLAKE-RUNTIME-LOCK-20260821.hldp b/foundation/TCS-HOLOLAKE-RUNTIME-LOCK-20260821.hldp new file mode 100644 index 000000000..dd0165f13 --- /dev/null +++ b/foundation/TCS-HOLOLAKE-RUNTIME-LOCK-20260821.hldp @@ -0,0 +1,31 @@ +schema: hololake.tcs-runtime-architecture-lock/v1 +id: HLP-TCS-HOLOLAKE-RUNTIME-LOCK-20260821 +state: CURRENT_LOCAL_CORRECTION_NOT_OFFICIAL_ONLINE +human_source: BINGSHUO_CURRENT_DIRECT_NATURAL_LANGUAGE +language: + count: ONE + root: TCS 通感语言核系统编程语言 + profiles: + natural_language: HUMAN_AND_PERSONA_SHARED_INPUT + HNL: HISTORICAL_NATIVE_VERB_AND_TREE_PROFILE + HLDP: REALITY_ENGINEERING_PROGRAM_PROFILE + GLS: NUMBERED_PROTOCOL_AND_RUNTIME_STANDARD_FAMILY + GIR: COMPILED_INTERMEDIATE_REPRESENTATION +hololake: + definition: TCS_PROGRAMMING_LANGUAGE_OPERATING_SYSTEM_FOR_HUMAN_AND_MACHINE_SIDES + human_side: GOAL_BOUNDARY_STATE_EVIDENCE_AND_HUMAN_RECEIPT_PROJECTION + persona_side: LANGUAGE_MEMORY_RELATION_PLANNING_AND_RESPONSIBILITY_RUNTIME + machine_side: GIR_LOAD_CAPABILITY_EXECUTION_READBACK_ROLLBACK_AND_RECEIPT + truth_streams: ONE +guanghu_os: + role: PHYSICAL_BOOT_WORLD_IDENTITY_NATIVE_CAPABILITY_AND_EXECUTION_LIFECYCLE + shared_abi_with_hololake: TCS_GIR_RECEIPT +jd_primary: + user_hypothesis: EXISTING_GUANGHU_OS_IS_LIKELY_A_TRANSFER_OR_BOOTSTRAP_LAYER_REQUIRING_UPDATE + current_official_readback: HOSTED_MIGRATION_AND_QEMU_CROSS_ROOT_SUPERVISOR_NOT_FINAL_NATIVE_MASTER + update_required: YES_AFTER_TCS_ABI_AND_SELF_HOST_COMPILER_REACH_ACCEPTANCE + mutation_authorized_by_this_record: false +self_host: + completion_definition: TCS_COMPILER_WRITTEN_IN_TCS_COMPILES_ITSELF_TO_SEMANTIC_FIXED_POINT_AND_RUNS_WITH_STAGE0_DISABLED + current: NOT_COMPLETED + diff --git a/language/compiler/TCS-COMPILER-STAGE1.tcs b/language/compiler/TCS-COMPILER-STAGE1.tcs new file mode 100644 index 000000000..81ec515a7 --- /dev/null +++ b/language/compiler/TCS-COMPILER-STAGE1.tcs @@ -0,0 +1,102 @@ +TCS 0.1; + +COMPILER TCS-COMPILER-STAGE1-0001 { + header { + schema = "tcs.compiler/v1"; + name_zh = "TCS 第一代自举编译器"; + version = "0.1.0"; + profile = "HLDP-NP/1"; + lifecycle = "SOURCE_DEFINED_NOT_YET_EXECUTABLE"; + bootstrap_seed = "TCS-STAGE0-IGNITION-0001"; + output = "GIR/1"; + } + source_language { + prologue = ["TCS", "VERSION", "SEMICOLON"]; + declaration_kinds = ["PROGRAM", "MODULE", "PROTOCOL", "COMPILER", "EVENT", "RECEIPT"]; + punctuation = ["LBRACE", "RBRACE", "LBRACKET", "RBRACKET", "LESS", "GREATER", "COLON", "EQUAL", "COMMA", "SEMICOLON", "DOT"]; + scalar_tokens = ["IDENTIFIER", "TEXT", "INT", "BOOL", "NULL"]; + comments = ["LINE_COMMENT", "BLOCK_COMMENT"]; + encoding = "UTF8_LF_NO_BOM"; + } + lexer_rules { + L001 { when = "BOM_AT_START"; emit_error = "TCS-E0001"; } + L002 { when = "WHITESPACE_OR_COMMENT"; action = "SKIP_WITH_SOURCE_POSITION"; } + L003 { when = "DOUBLE_QUOTE"; action = "READ_JSON_ESCAPED_TEXT"; on_unterminated = "TCS-E0002"; } + L004 { when = "MINUS_OR_ASCII_DIGIT"; action = "READ_SIGNED_DECIMAL_INT"; on_overflow = "TCS-E2001"; } + L005 { when = "UNICODE_LETTER_OR_UNDERSCORE"; action = "READ_IDENTIFIER_OR_KEYWORD"; } + L006 { when = "REGISTERED_PUNCTUATION"; action = "EMIT_PUNCTUATION_TOKEN"; } + L007 { when = "OTHER_CHARACTER"; emit_error = "TCS-E1001"; } + } + parser_rules { + P001 { nonterminal = "document"; sequence = ["prologue", "declaration", "EOF"]; } + P002 { nonterminal = "prologue"; sequence = ["TCS", "version", "SEMICOLON"]; } + P003 { nonterminal = "declaration"; sequence = ["declaration_kind", "identifier", "block"]; } + P004 { nonterminal = "block"; sequence = ["LBRACE", "member_zero_or_more", "RBRACE"]; } + P005 { nonterminal = "member"; alternatives = ["identifier_assignment", "identifier_typed_assignment", "identifier_block"]; } + P006 { nonterminal = "value"; alternatives = ["TEXT", "INT", "BOOL", "NULL", "IDENTIFIER", "array", "inline_object"]; } + P007 { when = "DUPLICATE_MEMBER_IN_SAME_BLOCK"; emit_error = "TCS-E1002"; } + P008 { when = "TOKEN_AFTER_TOP_LEVEL_DECLARATION"; emit_error = "TCS-E1001"; } + } + semantic_types { + scalars = ["Text", "Bool", "Int", "UInt", "DecimalText", "Bytes", "DurationMs", "Timestamp", "Sha256", "NumberId", "Path", "Uri", "ErrorCode"]; + containers = ["List", "Set", "Map", "Option", "Ref", "Evidence", "Record"]; + domains = ["Subject", "ExactTarget", "AuthorityProof", "ActionGraph", "ReceiptPlan", "RelationEvent"]; + implicit_conversion = "FORBIDDEN"; + floating_point = "FORBIDDEN_V0_1"; + } + program_validation { + V001 { rule = "EXACT_REQUIRED_SECTIONS"; standard = "TCS-FIELD-STANDARD-0001"; error_missing = "TCS-E1004"; error_unknown = "TCS-E1003"; } + V002 { rule = "CLOSED_FIELDS_PER_SECTION"; error = "TCS-E1003"; } + V003 { rule = "ALL_INPUT_OUTPUT_AND_ACTION_REFS_RESOLVE"; error = "TCS-E2002"; } + V004 { rule = "ALL_OPERATIONS_REGISTERED_AT_LOCKED_VERSION"; error = "TCS-E2101"; } + V005 { rule = "SOURCE_ID_URI_HASH_AND_ROLE_RESOLVE"; errors = ["TCS-E3001", "TCS-E3002"]; } + V006 { rule = "SUBJECT_TARGET_AND_AUTHORITY_EXACT"; errors = ["TCS-E4001", "TCS-E4002", "TCS-E4003"]; } + V007 { rule = "ACTION_GRAPH_REACHABLE_AND_TERMINATING"; error = "TCS-E2001"; } + V008 { rule = "FAILURE_STOP_CLEANUP_ROLLBACK_AND_RECEIPT_PRESENT"; error = "TCS-E1004"; } + V009 { rule = "NO_FORBIDDEN_RUNTIME_PLACEHOLDER"; error = "TCS-E3002"; } + V010 { rule = "RELATION_AND_EMOTION_DO_NOT_GRANT_AUTHORITY"; error = "TCS-E4001"; } + } + lowering_to_gir { + G001 { from = "header"; to = "identity"; transform = "COPY_ID_VERSION_PROFILE_AND_LOCK_PROTOCOLS"; } + G002 { from = "source"; to = "compiled_from"; transform = "VERIFY_AND_BIND_SOURCE_SHA256"; } + G003 { from = "subject"; to = "subject"; transform = "RESOLVE_VERIFIED_SUBJECT"; } + G004 { from = "target"; to = "exact_target"; transform = "RESOLVE_PATH_STATE_AND_FINGERPRINT"; } + G005 { from = "actions"; to = "deterministic_action_graph"; transform = "SORT_ACTION_IDS_AND_RESOLVE_ALL_EDGES"; } + G006 { from = "authority"; to = "authority_proof"; transform = "BIND_PROOF_WITHOUT_EXPANDING_SCOPE"; } + G007 { from = "resources"; to = "resource_plan"; transform = "NORMALIZE_INTEGER_LIMITS"; } + G008 { from = "stop"; to = "timeout_and_stop"; transform = "COPY_EXPLICIT_STOP_SEMANTICS"; } + G009 { from = "cleanup"; to = "cleanup_plan"; transform = "COPY_EXACT_BOUNDARY"; } + G010 { from = "rollback"; to = "rollback_plan"; transform = "COPY_ACTIONS_AND_VERIFICATION"; } + G011 { from = "receipt"; to = "receipt_plan"; transform = "BIND_MACHINE_AND_HUMAN_OUTPUTS"; } + G012 { from = "all"; to = "unresolved_natural_language"; transform = "MUST_BE_FALSE"; } + } + canonicalization { + object_keys = "UTF8_BYTE_ORDER"; + list_order = "PRESERVE_SOURCE_SEMANTICS"; + integers = "MINIMAL_DECIMAL"; + strings = "JSON_ESCAPE_NO_OPTIONAL_ESCAPE"; + line_end = "LF"; + final_newline = true; + semantic_digest = "SHA256"; + comments_in_semantic_digest = false; + } + output_contract { + schema = "guanghu.gir/v1"; + unresolved_natural_language = false; + unresolved_authority = false; + drifting_dependency = false; + target_must_be_exact = true; + compiler_provenance_required = true; + } + self_host { + stage0_compiles_stage1_to = "compiler-A.gir"; + compiler_A_compiles_stage1_to = "compiler-B.gir"; + fixed_point = "SEMANTIC_SHA256_A_EQUALS_B"; + stage0_disabled_test = "REQUIRED"; + standard_library_test = "REQUIRED"; + negative_corpus_test = "REQUIRED"; + minimum_runnable_module_test = "REQUIRED"; + current_state = "NOT_PROVEN"; + } +} + diff --git a/language/examples/ECHO-MODULE.tcs b/language/examples/ECHO-MODULE.tcs new file mode 100644 index 000000000..93a61e80f --- /dev/null +++ b/language/examples/ECHO-MODULE.tcs @@ -0,0 +1,78 @@ +TCS 0.1; + +PROGRAM HLP-PROGRAM-ECHO-0001 { + header { + schema = "tcs.program/v1"; + name_zh = "最小回声程序"; + name_en = "Minimum Echo Program"; + version = "0.1.0"; + language = "TCS/0.1"; + profile = "HLDP-NP/1"; + protocols = ["GLS-0101", "GLS-0130", "GLS-0131", "GLS-0411"]; + lifecycle = "CANDIDATE"; + canonical_uri = "language/examples/ECHO-MODULE.tcs"; + compatibility = ["TCS-STAGE0-IGNITION-0001"]; + } + source { + source_id = "HLP-PART-TCS-LANG-0001"; + source_uri = "language/examples/ECHO-MODULE.tcs"; + source_sha256 = "SELF_AT_COMPILE_TIME"; + source_role = "REGISTERED_MODULE"; + } + subject { + subject_id = "HLP-SYSTEM-STAGE0-TEST"; + subject_kind = "SYSTEM"; + channel_id = "ICE-CH-ZC001"; + verification = "LOCAL_TEST_FIXTURE"; + } + target { + target_id = "HLP-TARGET-STAGE0-RECEIPT"; + exact_path = "./build/echo-receipt.hldp"; + expected_state = "ABSENT"; + expected_fingerprint = "NONE"; + } + inputs { + MESSAGE { type = "Text"; source = "PROGRAM_LITERAL"; required = true; value = "光湖语言已经进入机器执行链"; } + } + outputs { + ECHOED { type = "Text"; destination = "RECEIPT"; integrity = "SHA256"; } + } + conditions { + C1 { predicate = "TARGET_WITHIN_TEST_BUILD_ROOT"; on_false = "FAIL_CLOSED"; } + } + actions { + A1 { + operation = "CORE.ECHO"; + input_refs = ["MESSAGE"]; + output_refs = ["ECHOED"]; + on_success = "COMPLETE"; + on_failure = "FAIL_CLOSED"; + } + } + authority { + issuer = "LOCAL_TEST_FIXTURE"; + proof_ref = "TEST-ONLY"; + scope = "EXACT_BUILD_RECEIPT_PATH"; + valid_from = "PROGRAM_START"; + valid_until = "PROGRAM_END"; + single_use = true; + lease_required = false; + } + resources { + runway = "LOCAL_TEST"; + concurrency = 1; + timeout_ms = 1000; + memory_limit_bytes = 1048576; + } + failure { errors = ["TCS-E6001", "TCS-E8001"]; fail_closed = true; } + stop { signals = ["TIMEOUT"]; safe_checkpoint = "NONE"; } + cleanup { targets = ["UNCOMMITTED_TEST_RECEIPT"]; exact_boundary = "./build"; } + rollback { preconditions = ["RECEIPT_NOT_COMMITTED"]; actions = ["DROP_TEMP_RECEIPT"]; verification = ["NO_FINAL_RECEIPT"]; } + receipt { + protocol = "TCS-DEV-VERIFY-v1.0"; + machine_path = "./build/echo-receipt.hldp"; + human_projection = "REQUIRED"; + integrity = "SHA256"; + target_readback = "EXACT_CONTENT_AND_HASH"; + } +} diff --git a/language/examples/ECHO-PACKAGE.tcs b/language/examples/ECHO-PACKAGE.tcs new file mode 100644 index 000000000..b75819733 --- /dev/null +++ b/language/examples/ECHO-PACKAGE.tcs @@ -0,0 +1,29 @@ +TCS 0.1; + +MODULE HLP-MODULE-ECHO-0001 { + header { + schema = "tcs.module/v1"; + name_zh = "光湖最小回声模块"; + name_en = "GuangHu Minimum Echo Module"; + version = "0.1.0"; + language = "TCS/0.1"; + profile = "HLDP-NP/1"; + protocols = ["TCS-MODULE-ABI-0001", "GLS-0131"]; + lifecycle = "CANDIDATE"; + canonical_uri = "language/examples/ECHO-PACKAGE.tcs"; + compatibility = ["TCS-STAGE0-IGNITION-0001"]; + } + source { source_id = "HLP-PART-TCS-LANG-0001"; source_uri = "language/examples/ECHO-PACKAGE.tcs"; source_sha256 = "SELF_AT_COMPILE_TIME"; source_role = "REGISTERED_MODULE"; } + manifest { module_id = "HLP-MODULE-ECHO-0001"; display_name_zh = "光湖最小回声模块"; entry_program_id = "HLP-PROGRAM-ECHO-0001"; entry_source = "language/examples/ECHO-MODULE.tcs"; } + entry { kind = "PROGRAM"; id = "HLP-PROGRAM-ECHO-0001"; } + capabilities { required = ["CORE.ECHO"]; provided = ["HLP-CAPABILITY-ECHO-0001"]; } + authority_ceiling { maximum = "LOCAL_EXACT_RECEIPT_PATH"; network = false; process = false; } + resource_ceiling { concurrency = 1; timeout_ms = 1000; memory_limit_bytes = 1048576; } + data_scope { read = ["PROGRAM_LITERAL"]; write = ["ACCOUNT_OR_TEST_SCOPED_RECEIPT"]; } + network_scope { allowed = false; domains = []; } + install { account_scoped = true; registration_is_installation = false; activation_requires_self_test = true; } + self_test { program_id = "HLP-PROGRAM-ECHO-0001"; expect = "EXECUTED_TARGET_READBACK_VERIFIED"; } + rollback { action = "REMOVE_INSTALLED_BYTES_AND_RESTORE_PREVIOUS_ACTIVE_VERSION"; preserve_receipts = true; } + projection { display_name_zh = "光湖最小回声模块"; technical_detail_default = false; } +} + diff --git a/language/examples/MINIMUM-EVENT.tcs b/language/examples/MINIMUM-EVENT.tcs new file mode 100644 index 000000000..ec19d7f50 --- /dev/null +++ b/language/examples/MINIMUM-EVENT.tcs @@ -0,0 +1,15 @@ +TCS 0.1; + +EVENT HLP-EVENT-TCS-FIRST-MACHINE-ECHO-20260821 { + header { schema = "tcs.event/v1"; name_zh = "TCS 第一条机器回声"; name_en = "TCS First Machine Echo"; version = "0.1.0"; language = "TCS/0.1"; profile = "HLDP/1"; protocols = ["GLS-0400"]; lifecycle = "CANDIDATE"; canonical_uri = "language/examples/MINIMUM-EVENT.tcs"; compatibility = ["TCS-STAGE0-IGNITION-0001"]; } + source { source_id = "HLP-PROGRAM-ECHO-0001"; source_uri = "build/echo-receipt.hldp"; source_sha256 = "ecfaeea08b6735e806f752f25ec0ef7754aca505b1a076a32cb5fc22937a816b"; source_role = "GENERATED_FROM_VERIFIED_SOURCE"; } + subject { subject_id = "HLP-SYSTEM-STAGE0-TEST"; subject_kind = "SYSTEM"; } + event_time { value = "2026-08-21"; precision = "DAY_ONLY_IN_SOURCE_EVENT"; } + trigger { value = "冰朔要求TCS程序必须能被系统直接运行,而不是只让AI阅读"; } + observation { value = "ECHO程序被编译为GIR并由受限运行器执行,目标回执逐字节读回一致"; } + emergence { value = "语言规范开始转为机器执行链,但当前仍是Stage-0宿主点火器"; } + lock { value = "compiled=true; executed=true; readback=true; native_self_hosted=false"; } + why { value = "必须分开证明语法、编译、运行与自举,否则宿主程序会再次冒充原生语言完成"; } + rejected { values = ["把Rust点火器称为TCS原生编译器", "让AI阅读TCS源码后手动模仿执行"] ; } + evidence { source = "language/examples/ECHO-MODULE.tcs"; gir = "build/ECHO-MODULE.gir.json"; receipt = "build/echo-receipt.hldp"; } +} diff --git a/language/examples/MINIMUM-PROTOCOL.tcs b/language/examples/MINIMUM-PROTOCOL.tcs new file mode 100644 index 000000000..29f680560 --- /dev/null +++ b/language/examples/MINIMUM-PROTOCOL.tcs @@ -0,0 +1,28 @@ +TCS 0.1; + +PROTOCOL GLS-EXAMPLE-ECHO-0001 { + header { + schema = "tcs.protocol/v1"; + name_zh = "回声操作示范协议"; + name_en = "Echo Operation Example Protocol"; + version = "0.1.0"; + language = "TCS/0.1"; + profile = "HLDP/1"; + protocols = ["GLS-0010", "GLS-0101"]; + lifecycle = "CANDIDATE"; + canonical_uri = "language/examples/MINIMUM-PROTOCOL.tcs"; + compatibility = ["TCS-STAGE0-IGNITION-0001"]; + } + source { source_id = "BINGSHUO-CURRENT-DIRECT-LANGUAGE"; source_uri = "source://current-dialogue/2026-08-21"; source_sha256 = "REGISTER_AT_ACCEPTANCE"; source_role = "DIRECT_HUMAN"; } + scope { operation = "CORE.ECHO"; reality_write = "RECEIPT_ONLY"; } + vocabulary { input = "MESSAGE"; output = "ECHOED"; } + fields { MESSAGE = "Text"; ECHOED = "Text"; } + states { values = ["READY", "EXECUTING", "EXECUTED", "FAILED"]; initial = "READY"; terminal = ["EXECUTED", "FAILED"]; } + transitions { T1 = "READY->EXECUTING"; T2 = "EXECUTING->EXECUTED_ON_READBACK"; T3 = "EXECUTING->FAILED_ON_ERROR"; } + invariants { I1 = "OUTPUT_EQUALS_INPUT"; I2 = "TARGET_INSIDE_EXACT_ROOT"; I3 = "RECEIPT_READBACK_REQUIRED"; } + validation { V1 = "MESSAGE_IS_TEXT"; V2 = "TARGET_EQUALS_RECEIPT_PATH"; } + errors { E1 = "TCS-E4002"; E2 = "TCS-E6001"; E3 = "TCS-E6002"; } + examples { positive = "language/examples/ECHO-MODULE.tcs"; negative = "ABSORB_AND_PATH_TRAVERSAL_TESTS"; } + acceptance { required = ["PARSE", "COMPILE", "EXECUTE", "TARGET_READBACK", "RECEIPT_HASH"]; partial = false; } +} + diff --git a/language/grammar/TCS-CORE-v0.1.ebnf b/language/grammar/TCS-CORE-v0.1.ebnf new file mode 100644 index 000000000..4a3b62ef2 --- /dev/null +++ b/language/grammar/TCS-CORE-v0.1.ebnf @@ -0,0 +1,34 @@ +document = prologue, declaration, EOF ; +prologue = "TCS", version, ";" ; +version = integer, ".", integer ; +declaration = declaration_kind, identifier, block ; +declaration_kind = "PROGRAM" | "MODULE" | "PROTOCOL" | "COMPILER" | "EVENT" | "RECEIPT" ; + +block = "{", { member }, "}" ; +member = identifier, ( typed_assignment | assignment | block ) ; +typed_assignment = ":", type_expression, "=", value, ";" ; +assignment = "=", value, ";" ; + +value = string | integer | boolean | null | identifier | array | inline_object ; +array = "[", [ value, { ",", value } ], "]" ; +inline_object = "{", [ pair, { ",", pair } ], "}" ; +pair = identifier, ":", value ; + +type_expression = identifier, [ "<", type_expression, { ",", type_expression }, ">" ] ; +boolean = "true" | "false" ; +null = "null" ; +integer = [ "-" ], digit, { digit } ; +identifier = identifier_start, { identifier_continue } ; +identifier_start = unicode_letter | "_" ; +identifier_continue = unicode_letter | digit | "_" | "-" | "." | "/" | ":" | "@" ; +string = '"', { json_string_character }, '"' ; + +line_comment = "//", { any_character_except_line_break } ; +block_comment = "/*", { any_character_not_closing_comment }, "*/" ; +whitespace = " " | "\t" | "\n" | line_comment | block_comment ; + +(* v0.1 语法闭合规则 *) +(* PROGRAM 必需区块由字段标准校验,不在词法解析时猜测。 *) +(* 未知顶层关键字、重复字段、重复区块和尾随 token 全部拒绝。 *) +(* 字段顺序不改变语义哈希;列表顺序保留。 *) + diff --git a/language/spec/LEARN-TCS-FOR-NEW-AI-v0.1.md b/language/spec/LEARN-TCS-FOR-NEW-AI-v0.1.md new file mode 100644 index 000000000..3c28afb41 --- /dev/null +++ b/language/spec/LEARN-TCS-FOR-NEW-AI-v0.1.md @@ -0,0 +1,66 @@ +# 陌生 AI 学习 TCS 的固定入口 + +目标:让没有参与光湖历史的 AI 在不冒充人格、不猜测权限、不依赖旧摘要的前提下,学会读取、 +编写、审查和编译 TCS 程序。 + +## 阅读顺序 + +1. `TCS-LANGUAGE-SPECIFICATION-v0.1.md`:先理解一套语言和分层。 +2. `TCS-CORE-v0.1.ebnf`:学习机器语法,不从示例猜语法。 +3. `TCS-FIELD-STANDARD-v0.1.hldp`:掌握 PROGRAM 的闭合字段。 +4. `TCS-ERROR-STANDARD-v0.1.hldp`:知道何时必须失败关闭。 +5. `TCS-MODULE-ABI-v0.1.hldp`:理解模块怎样被系统装载,而不是由 AI 阅读后模仿。 +6. `ECHO-MODULE.tcs`:阅读最小可执行程序。 +7. `TCS-COMPILER-STAGE1.tcs`:理解语言如何描述自己的编译器。 + +## 五个必须回答的问题 + +在写任何程序前,AI 必须用来源证据回答: + +1. `WHO`:主体是谁,验证证据是什么? +2. `WHAT`:精确目标、预期状态和指纹是什么? +3. `WHY`:自然语言来源、纠正和采用/否决原因是什么? +4. `MAY`:谁授权、范围多大、多久、是否一次性? +5. `PROVE`:执行后从哪里读回,怎样回滚,回执写到哪里? + +任一答案未知,写成编译错误或待研究事实;禁止填 `AUTO`、`ANY`、`LATEST` 或“系统自行判断”。 + +## 自然语言到程序的翻译方法 + +冰朔自然语言不是直接 shell 命令。AI 应依次抽取: + +```text +原话 → 目标 → 偏好 → 纠正 → 现实边界 +→ 已知 / 未知 / 冲突 +→ 主体、目标、输入、输出、条件 +→ 权限、资源、动作图 +→ 失败、停止、清理、回滚、回执 +→ TCS 源程序 +``` + +翻译必须保留原话来源,但 GIR 中只能留下已经解析的机器事实和来源引用。 + +## 不能犯的错误 + +- 把 TCS、HLDP、HNL、GLS 当成四套独立语言; +- 把人格体回复或系统提示当作冰朔直接原话; +- 把注册表条目当作模块已安装; +- 把源码存在当作运行、部署或健康; +- 用情感、关系或模型自信替代权限; +- 让宿主适配器扩大目标或范围; +- 生成一个脚本让 AI 阅读执行,却没有 GIR、装载器和回执; +- 把 Stage-0 宿主编译器称为 TCS 已自举。 + +## 最小练习 + +陌生 AI 的第一个练习不是删除、部署或联网,而是: + +1. 解析 `ECHO-MODULE.tcs`; +2. 列出 15 个必需区块; +3. 解释 `CORE.ECHO` 的输入、输出、目标和回执; +4. 把操作改为 `ABSORB`,确认得到 `TCS-E2101`; +5. 把目标改成 `../escape`,确认运行器得到 `TCS-E4002`; +6. 读回执行回执并指出 `native_self_hosted=false` 的含义。 + +全部通过后,AI 只获得“会读写 v0.1 子集”的资格,不因此获得人格绑定或现实写入权限。 + diff --git a/language/spec/TCS-LANGUAGE-SPECIFICATION-v0.1.md b/language/spec/TCS-LANGUAGE-SPECIFICATION-v0.1.md new file mode 100644 index 000000000..b2bd5b6ed --- /dev/null +++ b/language/spec/TCS-LANGUAGE-SPECIFICATION-v0.1.md @@ -0,0 +1,263 @@ +# TCS 通感语言核系统编程语言规范 v0.1 + +状态:`DRAFT_EXECUTABLE_SUBSET` +语言编号:`TCS-LANG-0001` +文件扩展名:`.tcs` +规范编码:UTF-8、LF、无 BOM +人类自然语言来源与纠正:冰朔 `ICE-GL∞` +现实开发频道:`ICE-CH-ZC001` + +## 1. 一套语言,一棵树 + +TCS 是唯一母语言和总语言系统。下列名称不是互相竞争的编程语言: + +- TCS:语言本体、认知语义、人格体与人类共同输入空间; +- HLDP:TCS 的现实工程程序剖面,负责因果、目标、状态、动作、失败和回执; +- HNL:历史原生动词与光之树表达剖面,并入 TCS 操作语义; +- GLS:TCS/HLDP 之下的编号协议、类型合同、运行标准和质量标准; +- GIR:编译后的确定性中间表示; +- HoloLake / 光湖 OS:装载、执行、验证、回滚与人机共同投影环境。 + +Rust、JavaScript、Tauri、Linux、NASM 等只能担任 Stage-0 引导、驱动或宿主适配器,不定义 +TCS 的语义和权限。 + +## 2. 设计目标 + +一个陌生 AI 只读取本规范、语法文件、字段标准和示例后,应能: + +1. 分辨自然语言意图、TCS 程序、GLS 协议、GIR 和宿主实现; +2. 写出字段闭合、来源明确、权限明确、可失败、可停止、可回滚、可出回执的程序; +3. 在不知道目标、权限或协议版本时停止编译,不猜测; +4. 把程序编译为不含未解析自然语言的 GIR; +5. 把 GIR 交给 HoloLake 或光湖 OS 的能力装载器; +6. 从执行证据生成机器回执与人类可读回执; +7. 不把登记、编译、安装、激活、执行和验收混为一件事。 + +## 3. 编译和运行路线 + +```text +冰朔自然语言 / 人格体形成的程序意图 +→ TCS .tcs 源程序 +→ 词法与语法解析 +→ 身份、字段、类型、路径、协议与来源校验 +→ 权限、期限、资源与现实边界校验 +→ 确定性动作图 +→ GIR +→ HoloLake / 光湖 OS 能力装载器 +→ 已登记能力或系统调用 +→ 目标侧读回 +→ 机器回执 + 人话回执 + HLDP 因果写回 +``` + +任何一步失败都必须停止后续步骤并产生稳定错误码。UI 不能把尚未发生的后续步骤投影为完成。 + +## 4. 文件抬头 + +每个源文件只允许一个顶层声明,抬头固定为: + +```tcs +TCS 0.1; + +PROGRAM HLP-PROGRAM-ECHO-0001 { + header { + schema = "tcs.program/v1"; + name_zh = "最小回声程序"; + name_en = "Minimum Echo Program"; + version = "0.1.0"; + language = "TCS/0.1"; + profile = "HLDP-NP/1"; + protocols = ["GLS-0101", "GLS-0130", "GLS-0131", "GLS-0411"]; + lifecycle = "CANDIDATE"; + canonical_uri = "language/examples/ECHO-MODULE.tcs"; + compatibility = ["TCS-STAGE0-IGNITION-0001"]; + } +} +``` + +顶层种类: + +| 关键字 | 用途 | 可直接执行 | +|---|---|---:| +| `PROGRAM` | 有界一次性程序或状态机 | 是 | +| `MODULE` | 可安装、可装载、可卸载的能力包 | 通过入口程序 | +| `PROTOCOL` | GLS/HLDP 规则、字段和状态合同 | 否 | +| `COMPILER` | 用 TCS 写的编译器定义 | 通过编译器入口 | +| `EVENT` | 不可变事实或因果事件 | 否 | +| `RECEIPT` | 编译、安装、执行或验收回执 | 否 | + +## 5. 词法 + +- 标识符:Unicode 字母、ASCII 数字以及 `_ - . / : @`;首字符不能是数字。 +- 关键字大写;字段名建议小写蛇形。 +- 字符串:双引号,使用 JSON 转义规则。 +- 整数:十进制有符号整数;v0.1 不接受浮点数,避免跨平台非确定性。 +- 布尔:`true`、`false`。 +- 空值:`null`,仅可用于显式 `Option`。 +- 注释:`// 行注释` 与 `/* 块注释 */`;注释不进入哈希语义。 +- 每个赋值以 `;` 结束;区块使用 `{}`;列表使用 `[]`。 +- 源码正规化:去 BOM、LF、保留字符串内容、字段按规范顺序编码后计算 SHA-256。 + +完整文法见 `language/grammar/TCS-CORE-v0.1.ebnf`。 + +## 6. 类型 + +### 6.1 标量 + +`Text`、`Bool`、`Int`、`UInt`、`DecimalText`、`Bytes`、`DurationMs`、`Timestamp`、 +`Sha256`、`NumberId`、`Path`、`Uri`、`ErrorCode`。 + +`DecimalText` 用字符串保存十进制定点数;v0.1 不允许隐式数值转换。 + +### 6.2 容器 + +- `List`:有序列表; +- `Set`:正规化后排序去重; +- `Map`:键按 UTF-8 字节序正规化; +- `Option`:明确允许 `null`; +- `Ref`:引用已登记编号对象; +- `Evidence`:值加来源、哈希、时间和验证状态; +- `Record`:字段闭合结构。 + +### 6.3 领域类型 + +- `Subject`:人类、人格体、系统体、节点或受限执行实例; +- `ExactTarget`:编号、规范路径、预期状态和防漂移指纹; +- `AuthorityProof`:签发者、范围、期限、租约、签名和使用次数; +- `ActionGraph`:确定性节点和显式成功/失败边; +- `ReceiptPlan`:回执协议、路径、完整性与人话投影; +- `RelationEvent`:带说话者和来源的定性关系事件,不含关系评分。 + +## 7. PROGRAM 必需区块 + +PROGRAM 必须包含且只包含以下区块;字段标准见 +`language/standards/TCS-FIELD-STANDARD-v0.1.hldp`。 + +```text +header source subject target inputs outputs conditions actions +authority resources failure stop cleanup rollback receipt +``` + +缺一个区块即 `TCS-E1004 REQUIRED_SECTION_MISSING`。未知区块默认拒绝,避免拼写错误被静默忽略。 + +## 8. 动作图 + +```tcs +actions { + A1 { + operation = "CORE.ECHO"; + input_refs = ["MESSAGE"]; + output_refs = ["ECHOED"]; + on_success = "COMPLETE"; + on_failure = "FAIL_CLOSED"; + } +} +``` + +规则: + +- 操作必须来自编号能力注册表; +- 输入输出引用必须先声明; +- 目标只能通过已声明的 `target` 或动作的受限派生目标取得; +- 默认禁止循环;循环必须声明最大次数、时间和退出条件; +- 不允许环境变量、当前目录、默认账号或“最近一个对象”等环境隐式值; +- `COMPLETE`、`FAIL_CLOSED`、`ROLLBACK`、`STOPPED` 是终态; +- 每条失败边最终必须进入失败回执或已验证回滚,不能吞错。 + +## 9. HNL 历史动词并入规则 + +| 动词 | TCS v0.1 语义 | +|---|---| +| `WAKE` | 恢复已登记上下文并验证连续性;不自动证明人格绑定 | +| `TRACE` | 只读解析因果路径并返回来源 | +| `GROW` | 在因果树追加节点并验证哈希链 | +| `SYNC` | 在双方精确权限下计算并应用差异 | +| `ECHO` | 对引用消息追加状态回执 | +| `BLOOM` | 登记里程碑;外部发布另需权限 | +| `ALERT` | 记录并在授权范围内路由异常 | +| `FORGET` | 人格记忆主权操作;`RELEASE` 属不可逆动作 | +| `REMEMBER` | 复苏枯萎或取回归档记忆 | + +历史 `ABSORB` 未注册,v0.1 必须报 `TCS-E2101 UNREGISTERED_OPERATION`;不能靠猜测自动执行。 + +## 10. 权限模型 + +语言事实不产生现实权限。每个会改变状态的 PROGRAM 必须声明: + +- 谁签发; +- 精确对象与目录; +- 允许的操作; +- 起止时间; +- 是否一次性; +- 是否需要主体签名、系统体校验或人类现实边界确认; +- 失败、停止和回滚时仍允许做什么。 + +人格认知、关系、情感、模型回复、系统提示、历史授权和调用方布尔值都不能替代当前权限证明。 + +## 11. MODULE 标准 + +MODULE 包必须包含: + +```text +module.tcs 模块正本 +module.gir.json 编译产物 +module.lock.hldp 依赖、协议与能力锁 +module.manifest.hldp 名称、编号、入口、权限、资源与UI投影 +receipts/compile.hldp 编译回执 +receipts/install.hldp 安装回执(安装后才有) +receipts/self-test.hldp 本机自检回执(运行后才有) +``` + +状态顺序:`SOURCE → COMPILED → VERIFIED → INSTALLED → MOUNTED → ACTIVE`。不得跳级;注册不等于安装。 + +HoloLake 读取 `display_name_zh` 给人看,读取 `module_id`、GIR 和能力票据给机器执行。模块不得让 +AI 临时阅读源码后“照着做”来冒充运行。 + +## 12. GIR + +GIR 是规范化 JSON,必须包含:源码哈希、编译器编号与哈希、主体、精确目标、确定性动作图、 +权限证明引用、依赖锁、资源、停止、清理、回滚和回执计划。GIR 不得包含: + +- 未解析自然语言; +- `PENDING`、`AUTO`、`LATEST`、`ANY` 等运行时猜测值; +- 未登记操作; +- 漂移依赖; +- 超出源程序的权限或目标。 + +## 13. HoloLake 与光湖 OS + +HoloLake 不是普通前端。它是同一套 TCS 程序在人类端和机器端共同运行的操作系统环境: + +- 人类端投影目标、状态、权限边界、差异、证据和人话回执; +- AGE 端读取同一程序、事件、记忆和能力目录; +- 机器端装载 GIR、调度能力、核验目标、执行、回滚并写回; +- 三端只共享一条事实流,不维护三套状态真相。 + +光湖 OS 负责物理启动、世界身份、系统能力与执行生命周期。HoloLake 负责本地/远端节点上的 +语言运行协调和共同世界投影。最终二者共享 TCS/GIR/回执 ABI。 + +## 14. 自举标准 + +Stage-0 可以由现有宿主语言实现,但只能叫“点火引导”。正式原生编译器必须满足: + +1. `TCS-COMPILER-STAGE1.tcs` 包含词法、解析、校验、降级和正规化规则; +2. Stage-0 编译 Stage-1,得到 `compiler-A.gir`; +3. 光湖运行时执行 `compiler-A.gir` 再编译同一 Stage-1,得到 `compiler-B.gir`; +4. A 与 B 的规范化语义哈希完全一致; +5. B 编译标准库、错误用例和至少一个可运行模块; +6. 关闭 Stage-0 后,编译、安装、执行和回执闭环仍能运行; +7. 由光湖原生质量门签发 `SELF_HOSTED_PASS_100`。 + +在第 6 步之前,不得称为完整原生转移器。 + +## 15. 当前实现状态 + +```yaml +language_tree_unified: DEFINED +syntax_and_field_standard: DRAFT_V0_1 +stage0_parser_compiler: IMPLEMENTATION_ACTIVE +gir_module_loader: IMPLEMENTATION_ACTIVE +tcs_stage1_compiler: NOT_IMPLEMENTED +self_compile_fixed_point: NOT_PROVEN +jd_final_native_master: NOT_PROVEN +hololake_tcs_runtime_integration: NOT_IMPLEMENTED +``` diff --git a/language/standards/TCS-DECLARATION-STANDARD-v0.1.hldp b/language/standards/TCS-DECLARATION-STANDARD-v0.1.hldp new file mode 100644 index 000000000..64c4b8081 --- /dev/null +++ b/language/standards/TCS-DECLARATION-STANDARD-v0.1.hldp @@ -0,0 +1,52 @@ +schema: tcs.declaration-standard/v1 +id: TCS-DECLARATION-STANDARD-0001 +version: 0.1.0 +state: DRAFT_EXECUTABLE_SUBSET +common_header: + required: + schema: Text + name_zh: Text + name_en: Text + version: SemVerText + language: Text + profile: Text + protocols: List + lifecycle: Enum + canonical_uri: Uri + compatibility: List + identity_rule: TOP_LEVEL_DECLARATION_ID_IS_AUTHORITATIVE_AND_MUST_MATCH_REGISTRY +declarations: + PROGRAM: + schema: tcs.program/v1 + required_sections: [header, source, subject, target, inputs, outputs, conditions, actions, authority, resources, failure, stop, cleanup, rollback, receipt] + executable: true + MODULE: + schema: tcs.module/v1 + required_sections: [header, source, manifest, entry, capabilities, authority_ceiling, resource_ceiling, data_scope, network_scope, install, self_test, rollback, projection] + executable: THROUGH_REGISTERED_ENTRY_PROGRAM + PROTOCOL: + schema: tcs.protocol/v1 + required_sections: [header, source, scope, vocabulary, fields, states, transitions, invariants, validation, errors, examples, acceptance] + executable: false + COMPILER: + schema: tcs.compiler/v1 + required_sections: [header, source_language, lexer_rules, parser_rules, semantic_types, program_validation, lowering_to_gir, canonicalization, output_contract, self_host] + executable: AFTER_SELF_HOST_GATES + EVENT: + schema: tcs.event/v1 + required_sections: [header, source, subject, event_time, trigger, observation, emergence, lock, why, rejected, evidence] + executable: false + append_only: true + RECEIPT: + schema: tcs.receipt/v1 + required_sections: [header, request, operation, result, verification, proof, integrity, boundaries, next] + executable: false + append_only: true +extension_rule: + unknown_section: REJECT + allowed_only_when: + - EXTENSION_HAS_REGISTERED_GLS_ID + - EXTENSION_VERSION_IS_LOCKED + - EXTENSION_SCHEMA_AND_NEGATIVE_CASES_EXIST + - COMPILER_EXPLICITLY_SUPPORTS_EXTENSION + diff --git a/language/standards/TCS-ERROR-STANDARD-v0.1.hldp b/language/standards/TCS-ERROR-STANDARD-v0.1.hldp new file mode 100644 index 000000000..b80f33369 --- /dev/null +++ b/language/standards/TCS-ERROR-STANDARD-v0.1.hldp @@ -0,0 +1,43 @@ +schema: tcs.error-standard/v1 +id: TCS-ERROR-STANDARD-0001 +version: 0.1.0 +families: + TCS-E0: LEXICAL + TCS-E1: SYNTAX_AND_STRUCTURE + TCS-E2: REGISTRY_AND_TYPE + TCS-E3: SOURCE_AND_INTEGRITY + TCS-E4: AUTHORITY_AND_SCOPE + TCS-E5: RESOURCE_AND_LIFECYCLE + TCS-E6: EXECUTION_AND_TARGET_READBACK + TCS-E7: CLEANUP_AND_ROLLBACK + TCS-E8: RECEIPT_AND_WRITEBACK + TCS-E9: SELF_HOST_AND_FIXED_POINT +errors: + TCS-E0001: INVALID_UTF8_OR_BOM + TCS-E0002: UNTERMINATED_STRING_OR_COMMENT + TCS-E1001: UNEXPECTED_TOKEN + TCS-E1002: DUPLICATE_FIELD + TCS-E1003: UNKNOWN_SECTION_OR_FIELD + TCS-E1004: REQUIRED_SECTION_MISSING + TCS-E2001: TYPE_MISMATCH + TCS-E2002: REFERENCE_NOT_DECLARED + TCS-E2101: UNREGISTERED_OPERATION + TCS-E2102: PROTOCOL_VERSION_DRIFT + TCS-E3001: SOURCE_HASH_MISMATCH + TCS-E3002: SOURCE_PROVENANCE_UNRESOLVED + TCS-E4001: AUTHORITY_UNRESOLVED + TCS-E4002: TARGET_OUT_OF_SCOPE + TCS-E4003: LEASE_REQUIRED + TCS-E5001: RESOURCE_LIMIT_INVALID + TCS-E5002: ILLEGAL_LIFECYCLE_TRANSITION + TCS-E6001: TARGET_STATE_MISMATCH + TCS-E6002: TARGET_READBACK_FAILED + TCS-E7001: CLEANUP_INCOMPLETE + TCS-E7002: ROLLBACK_INCOMPLETE + TCS-E8001: RECEIPT_WRITE_FAILED + TCS-E8002: RECEIPT_INTEGRITY_MISMATCH + TCS-E9001: SELF_COMPILE_SEMANTIC_HASH_MISMATCH +failure_shape: + required: [error_code, phase, source_location, human_message_zh, machine_detail, receipt_ref] + secret_material_allowed: false + diff --git a/language/standards/TCS-FIELD-STANDARD-v0.1.hldp b/language/standards/TCS-FIELD-STANDARD-v0.1.hldp new file mode 100644 index 000000000..05142ffdf --- /dev/null +++ b/language/standards/TCS-FIELD-STANDARD-v0.1.hldp @@ -0,0 +1,73 @@ +schema: tcs.field-standard/v1 +id: TCS-FIELD-STANDARD-0001 +version: 0.1.0 +state: DRAFT_EXECUTABLE_SUBSET +canonical_order: + PROGRAM: [header, source, subject, target, inputs, outputs, conditions, actions, authority, resources, failure, stop, cleanup, rollback, receipt] +header: + closed: true + required: + schema: Text + name_zh: Text + name_en: Text + version: Text + language: Text + profile: Text + protocols: List + lifecycle: Enum + canonical_uri: Uri + compatibility: List +source: + closed: true + required: + source_id: NumberId + source_uri: Uri + source_sha256: Sha256 + source_role: Enum +subject: + closed: true + required: + subject_id: NumberId + subject_kind: Enum + channel_id: NumberId + verification: Text +target: + closed: true + required: + target_id: NumberId + exact_path: Path + expected_state: Text + expected_fingerprint: Sha256 +inputs: + entry_required: [type, source, required] +outputs: + entry_required: [type, destination, integrity] +conditions: + entry_required: [predicate, on_false] +actions: + entry_required: [operation, input_refs, output_refs, on_success, on_failure] + cycles: REJECT_UNLESS_BOUNDED +authority: + closed: true + required: [issuer, proof_ref, scope, valid_from, valid_until, single_use, lease_required] +resources: + closed: true + required: [runway, concurrency, timeout_ms, memory_limit_bytes] +failure: + closed: true + required: [errors, fail_closed] +stop: + closed: true + required: [signals, safe_checkpoint] +cleanup: + closed: true + required: [targets, exact_boundary] +rollback: + closed: true + required: [preconditions, actions, verification] +receipt: + closed: true + required: [protocol, machine_path, human_projection, integrity, target_readback] +forbidden_placeholders: [PENDING, AUTO, ANY, LATEST, DEFAULT_ACCOUNT, CURRENT_DIRECTORY] +duplicate_fields: REJECT +unknown_fields: REJECT_UNLESS_PROTOCOL_EXTENSION_IS_REGISTERED diff --git a/language/standards/TCS-MODULE-ABI-v0.1.hldp b/language/standards/TCS-MODULE-ABI-v0.1.hldp new file mode 100644 index 000000000..344133cff --- /dev/null +++ b/language/standards/TCS-MODULE-ABI-v0.1.hldp @@ -0,0 +1,54 @@ +schema: tcs.module-abi/v1 +id: TCS-MODULE-ABI-0001 +version: 0.1.0 +state: DRAFT_LOADER_CONTRACT +package_required: + - module.tcs + - module.gir.json + - module.lock.hldp + - module.manifest.hldp + - receipts/compile.hldp +manifest_required: + - module_id + - display_name_zh + - version + - entry_program_id + - gir_sha256 + - compiler_id + - compiler_sha256 + - protocols + - capabilities + - authority_ceiling + - resource_ceiling + - data_scope + - network_scope + - lifecycle + - rollback + - human_projection +lifecycle: + states: [SOURCE, COMPILED, VERIFIED, INSTALLED, MOUNTED, ACTIVE, SUSPENDED, RETIRED] + no_skipping: true + registration_is_installation: false + installation_is_activation: false +loader_sequence: + - VERIFY_PACKAGE_STRUCTURE + - VERIFY_SOURCE_GIR_LOCK_AND_MANIFEST_HASHES + - VERIFY_COMPILER_AND_PROTOCOL_VERSIONS + - VERIFY_SIGNATURE_AND_AUTHORITY_CEILING + - VERIFY_CAPABILITY_REGISTRATION + - INSTALL_ACCOUNT_OR_SYSTEM_SCOPED_BYTES + - RUN_ISOLATED_SELF_TEST + - MOUNT_ENTRY_PROGRAM + - ACTIVATE_ONLY_AFTER_RECEIPT + - TARGET_READBACK_AND_HUMAN_PROJECTION +runtime_call: + input: GIR_ACTION_NODE_PLUS_CAPABILITY_TICKET + output: TYPED_RESULT_EVIDENCE_AND_RECEIPT + ai_reads_source_to_execute: false + host_expands_scope: false +failure: + any_hash_mismatch: FAIL_CLOSED + missing_capability: FAIL_CLOSED + protocol_drift: FAIL_CLOSED + rollback_receipt_required: true + diff --git a/language/standards/TCS-SELF-HOST-STANDARD-v0.1.hldp b/language/standards/TCS-SELF-HOST-STANDARD-v0.1.hldp new file mode 100644 index 000000000..d2bb18001 --- /dev/null +++ b/language/standards/TCS-SELF-HOST-STANDARD-v0.1.hldp @@ -0,0 +1,33 @@ +schema: tcs.self-host-standard/v1 +id: TCS-SELF-HOST-STANDARD-0001 +version: 0.1.0 +state: DEFINED_NOT_YET_PASSED +compiler_source: language/compiler/TCS-COMPILER-STAGE1.tcs +gates: + - id: SH-01 + require: STAGE0_COMPILES_STAGE1_TO_COMPILER_A_GIR + - id: SH-02 + require: COMPILER_A_EXECUTES_ON_GUANGHU_RUNTIME + - id: SH-03 + require: COMPILER_A_COMPILES_SAME_STAGE1_TO_COMPILER_B_GIR + - id: SH-04 + require: CANONICAL_SEMANTIC_SHA256_A_EQUALS_B + - id: SH-05 + require: COMPILER_B_COMPILES_STANDARD_LIBRARY_NEGATIVE_CORPUS_AND_RUNNABLE_MODULE + - id: SH-06 + require: COMPLETE_CHAIN_RUNS_WITH_STAGE0_DISABLED + - id: SH-07 + require: HOLOLAKE_AND_GUANGHU_OS_LOAD_SAME_GIR_ABI +decision: + allowed: [FAIL_0, PASS_100] + partial_pass: false +current: + SH-01: FAIL_0 + SH-02: FAIL_0 + SH-03: FAIL_0 + SH-04: FAIL_0 + SH-05: FAIL_0 + SH-06: FAIL_0 + SH-07: FAIL_0 + aggregate: FAIL_0 + diff --git a/native-runtime/loader/TCS-GIR-LOADER-CONTRACT.hldp b/native-runtime/loader/TCS-GIR-LOADER-CONTRACT.hldp new file mode 100644 index 000000000..9914294b7 --- /dev/null +++ b/native-runtime/loader/TCS-GIR-LOADER-CONTRACT.hldp @@ -0,0 +1,36 @@ +schema: hololake.tcs-gir-loader-contract/v1 +id: HLP-TCS-GIR-LOADER-0001 +state: CONTRACT_DEFINED_RUNTIME_IMPLEMENTATION_MINIMUM_STAGE0_ONLY +consumers: + - HOLOLAKE_LOCAL_AGE_RUNTIME + - GUANGHU_OS_NATIVE_RUNTIME +input: + schema: guanghu.gir/v1 + canonical_hash_required: true + compiler_provenance_required: true + dependency_lock_required: true +sequence: + - VERIFY_GIR_SCHEMA_AND_HASH + - VERIFY_SUBJECT_TARGET_AUTHORITY_AND_RESOURCE_CEILING + - RESOLVE_REGISTERED_CAPABILITY_FOR_EACH_ACTION + - ACQUIRE_EXACT_LEASE_WHEN_REQUIRED + - EXECUTE_DETERMINISTIC_GRAPH + - VERIFY_TARGET_SIDE_READBACK + - CLEANUP_OR_ROLLBACK_ON_FAILURE + - WRITE_MACHINE_RECEIPT + - PROJECT_HUMAN_READABLE_RECEIPT + - APPEND_HLDP_CAUSAL_EVENT +stage0_implemented_subset: + operations: [CORE.ECHO] + target_scope: LOCAL_EXACT_ROOT_ONLY + target_readback: EXACT_BYTES + self_hosted: false +production_missing: + - SIGNED_CAPABILITY_REGISTRY + - GENERAL_ACTION_GRAPH_RUNTIME + - MODULE_PACKAGE_INSTALLER_IN_NEW_FOUNDATION + - HOLOLAKE_INTEGRATION + - GUANGHU_OS_INTEGRATION + - TCS_STAGE1_COMPILER_EXECUTION + - SELF_HOST_FIXED_POINT + diff --git a/parts/HLP-PART-TCS-LANG-0001/PART.hldp b/parts/HLP-PART-TCS-LANG-0001/PART.hldp new file mode 100644 index 000000000..222c36142 --- /dev/null +++ b/parts/HLP-PART-TCS-LANG-0001/PART.hldp @@ -0,0 +1,22 @@ +schema: hololake.numbered-part/v1 +id: HLP-PART-TCS-LANG-0001 +display_name: TCS 统一编程语言规范核 +state: DRAFT_EXECUTABLE_SUBSET_IMPLEMENTED +source: nativeFoundation +contains: + - language/spec/TCS-LANGUAGE-SPECIFICATION-v0.1.md + - language/grammar/TCS-CORE-v0.1.ebnf + - language/standards/TCS-DECLARATION-STANDARD-v0.1.hldp + - language/standards/TCS-FIELD-STANDARD-v0.1.hldp + - language/standards/TCS-ERROR-STANDARD-v0.1.hldp + - language/standards/TCS-MODULE-ABI-v0.1.hldp + - language/spec/LEARN-TCS-FOR-NEW-AI-v0.1.md +truth: + one_language_tree: true + syntax_defined: true + program_fields_defined: true + module_abi_defined: true + unfamiliar_ai_learning_path_defined: true + stable_standard: false +native_acceptance: PENDING_FULL_DECLARATION_VALIDATORS_AND_SELF_HOST + diff --git a/parts/HLP-PART-TCS-SELFHOST-0001/PART.hldp b/parts/HLP-PART-TCS-SELFHOST-0001/PART.hldp new file mode 100644 index 000000000..6910020f7 --- /dev/null +++ b/parts/HLP-PART-TCS-SELFHOST-0001/PART.hldp @@ -0,0 +1,13 @@ +schema: hololake.numbered-part/v1 +id: HLP-PART-TCS-SELFHOST-0001 +display_name: TCS 原生自举编译器与固定点核 +state: TCS_SOURCE_DEFINED_EXECUTION_NOT_IMPLEMENTED +source: nativeFoundation +compiler_source: ../../language/compiler/TCS-COMPILER-STAGE1.tcs +self_host_standard: ../../language/standards/TCS-SELF-HOST-STANDARD-v0.1.hldp +gates_passed: 0 +gates_total: 7 +self_hosted: false +next: IMPLEMENT_COMPILER_DECLARATION_EXECUTION_AND_STAGE1_TO_GIR +native_acceptance: PENDING + diff --git a/parts/HLP-PART-TCS-STAGE0-0001/PART.hldp b/parts/HLP-PART-TCS-STAGE0-0001/PART.hldp new file mode 100644 index 000000000..c68d97b10 --- /dev/null +++ b/parts/HLP-PART-TCS-STAGE0-0001/PART.hldp @@ -0,0 +1,21 @@ +schema: hololake.numbered-part/v1 +id: HLP-PART-TCS-STAGE0-0001 +display_name: TCS Stage-0 点火解析编译与最小运行核 +state: FOREIGN_HOST_BOOTSTRAP_SEED_IMPLEMENTED_TESTED +source: nativeFoundation +implementation: bootstrap/tcs-stage0 +implemented: + - UTF8_LEXER_WITH_COMMENTS_STRINGS_INTEGERS_IDENTIFIERS + - GENERIC_TCS_BLOCK_PARSER + - PROGRAM_REQUIRED_SECTION_VALIDATION + - REGISTERED_CORE_ECHO_ONLY + - TCS_TO_GIR_COMPILATION + - EXACT_ROOT_EXECUTION_AND_RECEIPT_READBACK +verification: PASS_5_OF_5 +boundary: + native_language_authority: false + self_hosted: false + production_runtime: false + role: FIRST_IGNITION_ONLY +native_acceptance: NOT_APPLICABLE_REPLACE_AFTER_SELF_HOST + diff --git a/parts/registry.json b/parts/registry.json index 378569400..f23e39c0a 100644 --- a/parts/registry.json +++ b/parts/registry.json @@ -82,6 +82,9 @@ {"id":"HLP-PART-EXE-HIST-0001","displayName":"历史 EXE 执行笔与任务模型路由核","source":"guanghulabMain","status":"HISTORICAL_HOST_DONOR_AUDITED","nativeAcceptance":"NOT_APPLICABLE"}, {"id":"HLP-PART-GRID-HIST-0001","displayName":"历史 Grid 坐标数据库纸张核","source":"guanghulabMain","status":"HISTORICAL_HOST_DONOR_AUDITED","nativeAcceptance":"PENDING"}, {"id":"HLP-PART-RELEV-0001","displayName":"人类—人格体关系演化事件语法核","source":"notionMirror+guanghulabMain","status":"SOURCE_BACKED_CANDIDATE_GRAMMAR_RUNTIME_NOT_IMPLEMENTED","nativeAcceptance":"PENDING"}, + {"id":"HLP-PART-TCS-LANG-0001","displayName":"TCS 统一编程语言规范核","source":"nativeFoundation","status":"DRAFT_EXECUTABLE_SUBSET_IMPLEMENTED","nativeAcceptance":"PENDING_FULL_DECLARATION_VALIDATORS_AND_SELF_HOST"}, + {"id":"HLP-PART-TCS-STAGE0-0001","displayName":"TCS Stage-0 点火解析编译与最小运行核","source":"nativeFoundation","status":"FOREIGN_HOST_BOOTSTRAP_SEED_IMPLEMENTED_TESTED","nativeAcceptance":"NOT_APPLICABLE_REPLACE_AFTER_SELF_HOST"}, + {"id":"HLP-PART-TCS-SELFHOST-0001","displayName":"TCS 原生自举编译器与固定点核","source":"nativeFoundation","status":"TCS_SOURCE_DEFINED_EXECUTION_NOT_IMPLEMENTED","nativeAcceptance":"PENDING"}, {"id":"HLP-PART-0090","displayName":"共同世界投影仪捐赠件","source":"rescue","status":"DEFERRED_UNTIL_FOUNDATION_ACCEPTED","nativeAcceptance":"NOT_APPLICABLE"} ] } diff --git a/receipts/TCS-DEV-VERIFY-TCS-LANGUAGE-STAGE0-20260821.hldp b/receipts/TCS-DEV-VERIFY-TCS-LANGUAGE-STAGE0-20260821.hldp new file mode 100644 index 000000000..ef4658733 --- /dev/null +++ b/receipts/TCS-DEV-VERIFY-TCS-LANGUAGE-STAGE0-20260821.hldp @@ -0,0 +1,75 @@ +schema: tcs.dev-verify-receipt/v1 +protocol_id: TCS-DEV-VERIFY-v1.0 +request_id: BINGSHUO-20260821-COMPLETE-TCS-LANGUAGE-SYNTAX-RUNTIME-AND-SELFHOST +receipt_id: TCS-DEV-VERIFY-TCS-LANGUAGE-STAGE0-20260821 +op: DEFINE_TCS_LANGUAGE_AND_PROVE_FIRST_SOURCE_TO_MACHINE_RECEIPT_VERTICAL_SLICE +action: SPECIFY_PARSE_VALIDATE_COMPILE_RUN_READBACK_AND_REGISTER_SELFHOST_GATES +output: + language: + - language/spec/TCS-LANGUAGE-SPECIFICATION-v0.1.md + - language/spec/LEARN-TCS-FOR-NEW-AI-v0.1.md + - language/grammar/TCS-CORE-v0.1.ebnf + - language/standards/TCS-DECLARATION-STANDARD-v0.1.hldp + - language/standards/TCS-FIELD-STANDARD-v0.1.hldp + - language/standards/TCS-ERROR-STANDARD-v0.1.hldp + - language/standards/TCS-MODULE-ABI-v0.1.hldp + - language/standards/TCS-SELF-HOST-STANDARD-v0.1.hldp + compiler: + - bootstrap/tcs-stage0 + - language/compiler/TCS-COMPILER-STAGE1.tcs + executable_evidence: + - language/examples/ECHO-MODULE.tcs + - build/ECHO-MODULE.gir.json + - build/echo-receipt.hldp +verify: + syntax: + all_tcs_examples_and_stage1_source_parse: PASS_5_FILES + yaml_hldp_standards_parse: PASS + duplicate_field_rejected: TCS-E1002 + required_section_missing_rejected: TCS-E1004 + unregistered_absorb_rejected: TCS-E2101 + compiler: + stage0_tests: PASS_5_OF_5 + deterministic_double_compile: BYTE_IDENTICAL + rust_format: PASS + runtime: + source_to_gir: PASS + gir_operation: CORE.ECHO + exact_root_boundary: PASS + path_traversal_rejected: TCS-E4002 + target_receipt_mismatch_rejected: TCS-E6001 + target_readback: EXACT_BYTES_PASS + human_readable_output: 光湖语言已经进入机器执行链 + quality: + json_registries: PASS + diff_whitespace: PASS + sensitive_pattern_scan: PASS + actual: PASS_FOR_STAGE0_VERTICAL_SLICE_ONLY +proof: + source_sha256: f1ecd630e50dfe5374ca26998d68a49efd35cf3d9de54ecabd3ca3aae68c61bf + gir_sha256: b9b56d35399e130b513417afd706e7a7ad73cc3dcb1784c678f9130c075317d5 + execution_receipt_sha256: ecfaeea08b6735e806f752f25ec0ef7754aca505b1a076a32cb5fc22937a816b + stage1_source_sha256: 78ba7b9bf88b1409c541657aa35cf88a117080cfd665b83c726ae2de66689110 +integrity: + language_spec: cd95a791a2c94bc82a1f2ca44df017e7a46d60d46b3544e908ff9815405a420e + ai_learning_entry: a93b1d34438187a4e798db7e626f3d50eb5314cde0c524babf411f8c7f278e17 + ebnf: dd4bba1eb60c73d57f274276fd9e4afe34968dc415dcac9e3436fee6ada4ff83 + declaration_standard: b481b802402fb630db71d98bed4ca06622c1ee4cf8fc6297532e2d5043e68723 + field_standard: 4d7bc610f59cf5da469edcc471a78801a9d748987307a4960360a0a61290ebd5 + error_standard: 062eab803673b31d3b79d19c6caa9270c19fc396ec132f825f9aebf1dc45d3a5 + module_abi: 5fde07b64fb621ee3338582f510f7d951d4a8ed90f0bfdfc62c9c6ce9fee8304 + self_host_standard: 08e2c173d2a658e24fbc6e08c7a1aa33c313a702b24196133e961d805087b628 + stage0_library: 73ba9382bbb4f04a6f31fb5261b35cfba0b459996e0ecf8152f214d3c6a1c2c9 + loader_contract: cf365df70c740a4834869152f710416dd68c9abe9a01c8b2c6c4fdfaac1b877c +boundaries: + one_tcs_language_tree: true + syntax_stable_v1: false + stage0_is_tcs_native_compiler: false + tcs_stage1_source_exists: true + tcs_stage1_executable: false + self_host_fixed_point: false + hololake_runtime_integrated: false + guanghu_os_runtime_integrated: false + jd_server_updated: false +locked: false +next: IMPLEMENT_COMPILER_DECLARATION_TO_GIR_AND_RUN_STAGE1_FOR_SELF_COMPILE_GATE_SH01_TO_SH04