define TCS language and prove stage0 execution slice
This commit is contained in:
parent
8cfdba210f
commit
3959ae4270
31 changed files with 2449 additions and 5 deletions
|
|
@ -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 编译器源码已写出但尚未达到自编译固定点,不能称原生转移器完成。
|
||||
|
|
|
|||
284
bootstrap/tcs-stage0/Cargo.lock
generated
Normal file
284
bootstrap/tcs-stage0/Cargo.lock
generated
Normal file
|
|
@ -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"
|
||||
15
bootstrap/tcs-stage0/Cargo.toml
Normal file
15
bootstrap/tcs-stage0/Cargo.toml
Normal file
|
|
@ -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"
|
||||
|
||||
805
bootstrap/tcs-stage0/src/lib.rs
Normal file
805
bootstrap/tcs-stage0/src/lib.rs
Normal file
|
|
@ -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<TcsValue>),
|
||||
Object(BTreeMap<String, TcsValue>),
|
||||
}
|
||||
|
||||
impl TcsValue {
|
||||
fn object(&self, field: &str) -> Result<&BTreeMap<String, TcsValue>, 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<String, TcsValue>,
|
||||
}
|
||||
|
||||
#[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<String>) -> 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<char>,
|
||||
index: usize,
|
||||
line: usize,
|
||||
column: usize,
|
||||
_source: &'a str,
|
||||
}
|
||||
|
||||
impl<'a> Lexer<'a> {
|
||||
fn new(source: &'a str) -> Result<Self, TcsError> {
|
||||
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<char> {
|
||||
self.chars.get(self.index).copied()
|
||||
}
|
||||
|
||||
fn peek_next(&self) -> Option<char> {
|
||||
self.chars.get(self.index + 1).copied()
|
||||
}
|
||||
|
||||
fn bump(&mut self) -> Option<char> {
|
||||
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<Token, TcsError> {
|
||||
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<Token, TcsError> {
|
||||
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::<i64>()
|
||||
.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<Token, TcsError> {
|
||||
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<Self, TcsError> {
|
||||
let mut lexer = Lexer::new(source)?;
|
||||
let current = lexer.token()?;
|
||||
Ok(Self { lexer, current })
|
||||
}
|
||||
|
||||
fn advance(&mut self) -> Result<Token, TcsError> {
|
||||
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<String, TcsError> {
|
||||
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<TcsDocument, TcsError> {
|
||||
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<BTreeMap<String, TcsValue>, 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<TcsValue, TcsError> {
|
||||
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<TcsValue, TcsError> {
|
||||
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<TcsValue, TcsError> {
|
||||
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<TcsDocument, TcsError> {
|
||||
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<String, TcsValue>,
|
||||
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<JsonValue, TcsError> {
|
||||
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<String, TcsError> {
|
||||
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<PathBuf, TcsError> {
|
||||
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<PathBuf, TcsError> {
|
||||
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<PathBuf, TcsError> {
|
||||
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)
|
||||
}
|
||||
35
bootstrap/tcs-stage0/src/main.rs
Normal file
35
bootstrap/tcs-stage0/src/main.rs
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
use std::{env, fs, path::Path};
|
||||
|
||||
fn usage() -> &'static str {
|
||||
"usage: tcs-stage0 parse <source.tcs> | compile <source.tcs> <output.gir.json> | run <input.gir.json> <allowed-root>"
|
||||
}
|
||||
|
||||
fn main() {
|
||||
if let Err(error) = run() {
|
||||
eprintln!("{error}");
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
fn run() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let arguments: Vec<String> = 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()),
|
||||
}
|
||||
}
|
||||
76
bootstrap/tcs-stage0/tests/stage0.rs
Normal file
76
bootstrap/tcs-stage0/tests/stage0.rs
Normal file
|
|
@ -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");
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
113
build/ECHO-MODULE.gir.json
Normal file
113
build/ECHO-MODULE.gir.json
Normal file
|
|
@ -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
|
||||
}
|
||||
12
build/echo-receipt.hldp
Normal file
12
build/echo-receipt.hldp
Normal file
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
31
foundation/TCS-HOLOLAKE-RUNTIME-LOCK-20260821.hldp
Normal file
31
foundation/TCS-HOLOLAKE-RUNTIME-LOCK-20260821.hldp
Normal file
|
|
@ -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
|
||||
|
||||
102
language/compiler/TCS-COMPILER-STAGE1.tcs
Normal file
102
language/compiler/TCS-COMPILER-STAGE1.tcs
Normal file
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
78
language/examples/ECHO-MODULE.tcs
Normal file
78
language/examples/ECHO-MODULE.tcs
Normal file
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
29
language/examples/ECHO-PACKAGE.tcs
Normal file
29
language/examples/ECHO-PACKAGE.tcs
Normal file
|
|
@ -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; }
|
||||
}
|
||||
|
||||
15
language/examples/MINIMUM-EVENT.tcs
Normal file
15
language/examples/MINIMUM-EVENT.tcs
Normal file
|
|
@ -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"; }
|
||||
}
|
||||
28
language/examples/MINIMUM-PROTOCOL.tcs
Normal file
28
language/examples/MINIMUM-PROTOCOL.tcs
Normal file
|
|
@ -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; }
|
||||
}
|
||||
|
||||
34
language/grammar/TCS-CORE-v0.1.ebnf
Normal file
34
language/grammar/TCS-CORE-v0.1.ebnf
Normal file
|
|
@ -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 全部拒绝。 *)
|
||||
(* 字段顺序不改变语义哈希;列表顺序保留。 *)
|
||||
|
||||
66
language/spec/LEARN-TCS-FOR-NEW-AI-v0.1.md
Normal file
66
language/spec/LEARN-TCS-FOR-NEW-AI-v0.1.md
Normal file
|
|
@ -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 子集”的资格,不因此获得人格绑定或现实写入权限。
|
||||
|
||||
263
language/spec/TCS-LANGUAGE-SPECIFICATION-v0.1.md
Normal file
263
language/spec/TCS-LANGUAGE-SPECIFICATION-v0.1.md
Normal file
|
|
@ -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<T>`。
|
||||
- 注释:`// 行注释` 与 `/* 块注释 */`;注释不进入哈希语义。
|
||||
- 每个赋值以 `;` 结束;区块使用 `{}`;列表使用 `[]`。
|
||||
- 源码正规化:去 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<T>`:有序列表;
|
||||
- `Set<T>`:正规化后排序去重;
|
||||
- `Map<Text,T>`:键按 UTF-8 字节序正规化;
|
||||
- `Option<T>`:明确允许 `null`;
|
||||
- `Ref<T>`:引用已登记编号对象;
|
||||
- `Evidence<T>`:值加来源、哈希、时间和验证状态;
|
||||
- `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
|
||||
```
|
||||
52
language/standards/TCS-DECLARATION-STANDARD-v0.1.hldp
Normal file
52
language/standards/TCS-DECLARATION-STANDARD-v0.1.hldp
Normal file
|
|
@ -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<NumberId>
|
||||
lifecycle: Enum<CANDIDATE,STABLE,DEPRECATED,RETIRED>
|
||||
canonical_uri: Uri
|
||||
compatibility: List<Text>
|
||||
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
|
||||
|
||||
43
language/standards/TCS-ERROR-STANDARD-v0.1.hldp
Normal file
43
language/standards/TCS-ERROR-STANDARD-v0.1.hldp
Normal file
|
|
@ -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
|
||||
|
||||
73
language/standards/TCS-FIELD-STANDARD-v0.1.hldp
Normal file
73
language/standards/TCS-FIELD-STANDARD-v0.1.hldp
Normal file
|
|
@ -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<NumberId>
|
||||
lifecycle: Enum<CANDIDATE,STABLE,DEPRECATED,RETIRED>
|
||||
canonical_uri: Uri
|
||||
compatibility: List<Text>
|
||||
source:
|
||||
closed: true
|
||||
required:
|
||||
source_id: NumberId
|
||||
source_uri: Uri
|
||||
source_sha256: Sha256
|
||||
source_role: Enum<DIRECT_HUMAN,CANONICAL_PROTOCOL,REGISTERED_MODULE,GENERATED_FROM_VERIFIED_SOURCE>
|
||||
subject:
|
||||
closed: true
|
||||
required:
|
||||
subject_id: NumberId
|
||||
subject_kind: Enum<HUMAN,PERSONA,SYSTEM,NODE,RUNTIME_INSTANCE>
|
||||
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
|
||||
54
language/standards/TCS-MODULE-ABI-v0.1.hldp
Normal file
54
language/standards/TCS-MODULE-ABI-v0.1.hldp
Normal file
|
|
@ -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
|
||||
|
||||
33
language/standards/TCS-SELF-HOST-STANDARD-v0.1.hldp
Normal file
33
language/standards/TCS-SELF-HOST-STANDARD-v0.1.hldp
Normal file
|
|
@ -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
|
||||
|
||||
36
native-runtime/loader/TCS-GIR-LOADER-CONTRACT.hldp
Normal file
36
native-runtime/loader/TCS-GIR-LOADER-CONTRACT.hldp
Normal file
|
|
@ -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
|
||||
|
||||
22
parts/HLP-PART-TCS-LANG-0001/PART.hldp
Normal file
22
parts/HLP-PART-TCS-LANG-0001/PART.hldp
Normal file
|
|
@ -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
|
||||
|
||||
13
parts/HLP-PART-TCS-SELFHOST-0001/PART.hldp
Normal file
13
parts/HLP-PART-TCS-SELFHOST-0001/PART.hldp
Normal file
|
|
@ -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
|
||||
|
||||
21
parts/HLP-PART-TCS-STAGE0-0001/PART.hldp
Normal file
21
parts/HLP-PART-TCS-STAGE0-0001/PART.hldp
Normal file
|
|
@ -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
|
||||
|
||||
|
|
@ -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"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
75
receipts/TCS-DEV-VERIFY-TCS-LANGUAGE-STAGE0-20260821.hldp
Normal file
75
receipts/TCS-DEV-VERIFY-TCS-LANGUAGE-STAGE0-20260821.hldp
Normal file
|
|
@ -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
|
||||
Loading…
Reference in a new issue