wyckit/PassGen
GitHub: wyckit/PassGen
PassGen 是一个以密码生成为演示领域的「符号意图架构」参考实现,展示了如何将自然语言转化为经校验的结构化意图后再执行,从而避免不可靠的语言直接触发工具操作。
Stars: 0 | Forks: 0
# PassGen
[](https://github.com/wyckit/PassGen/actions/workflows/ci.yml)
[](LICENSE)
[](https://dotnet.microsoft.com/)
**PassGen 看起来像是一个密码生成器。它实际上是一个小型的架构演示。**
现代 AI agent 可以调用工具、编写代码、查询数据库、发送消息并触发
工作流。这种能力引发了一个安全问题:**原始的自然语言并不是一个可靠的授权
层。** 一句具有说服力的话——无论是来自用户、网页、检索到的文档,还是另一个
工具的输出——都不应该能够*直接*引发一个操作。
PassGen 演示了一种不同的模式,即**符号意图架构 (Symbolic Intent Architecture, SIA)**:
该演示的领域之所以选择密码生成,是因为它规模小、对安全敏感,且易于
理解。项目中没有 LLM、没有 API 调用、没有云服务——这种“理解”存在于一个编译好的
知识图谱中,生成过程是一个确定性引擎,并且**每个结果都会根据
请求进行验证。**
## 核心转变

```
Common agent pattern ─ language has too much authority
user / web / tool text ──► LLM ──► tool call ──► action ("hope the guardrails hold")
Symbolic Intent Architecture ─ language becomes inspectable intent before action
prompt ──► language resolver ──► symbolic graph ──► typed intent ──► validator ──► tool ──► verifier ──► audit
(proposes) (constrains) (inspectable) (law) (machine) (inspector) (history)
```
原始的自然语言永远不会直接接触工具。它必须首先转换为有类型、经过验证的结构——如果
这种结构是不可能存在或被禁止的,工具就永远不会被调用。请在
**[docs/SYMBOLIC-INTENT-ARCHITECTURE.md](docs/SYMBOLIC-INTENT-ARCHITECTURE.md)** 中阅读完整的模式。
## 看见它:可见的流水线
`passgen --trace` 展示了全部五个阶段——语言转化为已验证意图的过程,以及
在工具运行前拒绝不可能请求的故障关闭场景:

语言提出了一些不可能的请求。符号层在任何工具运行**之前**就拒绝了它。
系统的目标不是试图迎合,而是力求准确无误。
## 快速开始
```
.\passgen.ps1 # interactive assistant
.\passgen.ps1 give me a 16 char password, 2 uppercase, no ambiguous # one-shot
.\passgen.ps1 --trace 20 chars, 3 digits, 2 symbols, no ambiguous # show the SIA pipeline
.\passgen.ps1 what reduces password entropy # knowledge Q&A
```
```
password: ktQ_+EVq8?Zy7GbK
spec: len=16, allow: uppercase(min2)+lowercase+numeric+symbol, no-ambiguous
entropy: 97.7 bits (very strong), charset 69, avg crack ~4.0e9 years
check: OK -- satisfies the spec
```
## 符号层:“TLM 即模型”
PassGen 的符号层是一个 **TLM**(一个编译好的概念/关系知识图谱)。
词汇和语法并不是硬编码的——它们存在于 TLM 数据中:
- **`rs-char-classes`** 包含类名别名(`digits`/`numbers`/`numeric` → numeric 等)。
- **`rs-nl-vocabulary`** 包含自然语言 (NL) *线索*——每个线索由一个 `Trigger` 短语和一个 `Signal` 组成(例如 `q.min`、
`target.length`、`only.`、`unsupported:`)。
- **`TlmNlu`** 在启动时加载这些线索和别名,并*根据*它们构建匹配器。
**覆盖率通过编辑 TLM 数据来提升,而不是修改代码**(参见 SIA 文档中的学习循环)。
生成过程是确定性且可审计的:默认使用 CSPRNG(无偏拒绝采样),仅在传入显式种子时使用
种子生成器(标记为 INSECURE),采用平坦均匀填充,
优先满足最小数量要求,重新检查每个结果,并将熵报告为精确的
`log2(valid count)`。
## 文档
| 文档 | 内容 |
|-----|------|
| [docs/SYMBOLIC-INTENT-ARCHITECTURE.md](docs/SYMBOLIC-INTENT-ARCHITECTURE.md) | 范式、类比、如何推广(SQL/工作流/DevOps)、LLM 的适用位置 |
| [THREAT_MODEL.md](THREAT_MODEL.md) | STRIDE + SIA 如何中和提示词注入 / MCP 工具风险 |
| [SECURITY.md](SECURITY.md) | 安全策略 + 设计立场 |
| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | PassGen 实现内部原理 |
| [docs/NLU-MATRIX.md](docs/NLU-MATRIX.md) | 50 多种可归一化为相同符号形状的表述方式 |
| [docs/GOAL-symbolic-intent-architecture.md](docs/GOAL-symbolic-intent-architecture.md) | 指导性目标提示词 |
## 布局
| 路径 | 用途 |
|------|---------|
| `PassGen.App/` | 助手程序:REPL + 一次性执行 + `--trace`,英语 → 密码 + 知识问答(无 LLM) |
| `PassGen.Engine/` | 确定性引擎——规格、生成器、验证器、熵、`RandomStringTool` 以及 `TlmNlu`(TLM 驱动的解析器) |
| `PassGen.Tlm/` | 独立的 TLM 格式库——编译器/反编译器、SHA-256 哈希器、`.tlmz` 封装(**与实时 RSRM 字节兼容**) |
| `PassGen.Tlm.Cli/` | `tlm` CLI:`author` / `compile` / `decompile` / `validate` / `verify` |
| `PassGen.Engine.Tests/` | xUnit 测试套件——针对性用例 + 从 TLM 词汇生成的覆盖矩阵 |
| `dataset/` | 独立的 RSRM TLM 数据集(7 个关联的 TLM);参见 [dataset/README.md](dataset/README.md) |
## 构建 / 测试 / 运行
```
dotnet test PassGen.Engine.Tests # full suite, net10.0
dotnet run --project PassGen.Engine.Demo # demo output + the tool schema
.\build-dataset.ps1 # author -> compile -> decompile -> verify the TLMs
.\make-publish.ps1 # assemble a self-contained publish/ bundle
```
## 规范
net10.0 · 可空类型 + 隐式 using · 文件范围命名空间 · 用于契约的 `sealed record` + 主构造函数 · xUnit。`.ps1` 脚本保持仅包含 ASCII 字符。
## 许可证
[MIT](LICENSE)。
更喜欢看文本?以下是同样两次运行的面板逐项展示。
``` $ passgen --trace "give me a 20-character password with 3 numbers, 2 symbols, no confusing characters" +-- [1] PROMPT (what the human said) | "give me a 20-character password with 3 numbers, 2 symbols, no confusing characters" v +-- [2] RESOLVED INTENT (language -> inspectable symbolic constraints) | length = 20 | numeric = min 3 | symbol = min 2 | exclude = ambiguous look-alikes (0 O o 1 l I) v +-- [3] VALIDATION (is the intent satisfiable?) | satisfiable = YES v +-- [4] EXECUTION (deterministic tool runs on validated intent) | rng = CSPRNG (cryptographically secure) | output = ^&Z!5n76^2^^E_RS3qn4 v +-- [5] VERIFICATION (post-conditions checked after execution) length: pass numeric: pass (>=3) symbol: pass (>=2) verdict: MATCHES REQUEST ``` 最能说明问题的是那个**不可能**的情况——即故障关闭: ``` $ passgen --trace "make me a 4-character password with 10 uppercase letters" +-- [3] VALIDATION satisfiable = NO status = REJECTED +-- [4] EXECUTION [ HALTED ] the generator is never invoked +-- [5] VERIFICATION [ BYPASSED ] nothing was produced to verify ```标签:AI合规, AI智能体, 密码生成, 软件架构