职业协调MCP
确定性推理增强了求职协调。
职业协调mcp是通过模型上下文协议(mcp)公开的治理优先职业协调引擎的C++20参考实现。
其设计目的是:
- 将结构化机会与不可变的经验原子相匹配
- 按照宪法撰写简历
- 强制执行外展状态机规则
- 维护完整的交互审核日志
- 防止无根据的索赔
- 在验证之前,将LLM输出视为不可信
这个项目的设计是确定的。
______________________________________________________________________
哲学
现代人工智能系统优化流畅性。
职业协调需要正直。
这台发动机遵循严格的姿态:
- 确定性规则决定结构。
- LLMs(如果使用)仅起草散文。
- 验证对所有输出进行门控。
- 审计日志保留了可解释性。
- 没有明确的人类权威,就不会发生自主行动。
每个输出都必须归因于:
- 特定经验原子,
- 明确的规则,
- 以及版本化的宪法。
______________________________________________________________________
为什么选择Apache 2.0?
此项目根据Apache许可证2.0获得许可。
我们选择Apache而不是MIT是因为:
- 它包括明确的专利授权。
- 它包括专利报复保护。
- 它仍然是完全宽容和商业友好的。
- 它支持生态系统增长,不受版权限制。
目标是将治理级基础设施回馈给社区,同时保护贡献者免受专利模糊的影响。
您可以自由地:
- 使用
- 修改
- 嵌入
- 商业化
- 分叉
这段代码是基础设施,而不是陷阱。
______________________________________________________________________
架构概述
该系统围绕五个核心领域构建:
1.体验原子
不可变、可验证的能力事实。
示例:
- 企业架构领导力
- 人工智能治理设计
- 系统级安全实施
原子是简历声明的唯一允许来源。
______________________________________________________________________
2.机会
具有规范化要求的职位发布的结构化表示。
机会匹配具有确定性和可解释性。
______________________________________________________________________
3.简历组成
简历生成是符合宪法的:
- 选定的原子必须映射到机会要求。
- 不允许无根据的索赔。
- 输出在接受之前必须通过验证。
______________________________________________________________________
4.外联状态机
接触交互由有限状态机控制:
- 没有重复的第一次触摸。
- 如果标记为“不要联系”,则不进行外联
- 每次转换都会被记录下来。
______________________________________________________________________
5.宪法验证引擎(CVE)
核心执行机制。
CVE:
- 运行确定性规则包。
- 生成机器可读的验证报告。
- 仅在宪法允许的情况下支持覆盖。
- 仅发送附加审核事件。
未经验证,不接受任何工件。
______________________________________________________________________
项目结构
career-coordination-mcp/
├── include/ccmcp/
│ ├── app/ # Pipeline orchestration (app_service)
│ ├── constitution/ # Rules, ValidationEngine, Findings
│ ├── core/ # IDs, Result, hashing, utilities
│ ├── domain/ # Atoms, Opportunities, Interactions, DecisionRecord
│ ├── embedding/ # IEmbeddingProvider + stub implementations
│ ├── indexing/ # IIndexRunStore, IndexBuildPipeline, drift detection
│ ├── ingest/ # IResumeIngestor, IResumeStore, IngestedResume
│ ├── interaction/ # IInteractionCoordinator, FSM, Redis coordinator
│ ├── matching/ # Lexical + hybrid retrieval, scoring
│ ├── storage/ # IAuditLog, IAtomRepository, IOpportunityRepository,
│ │ │ # IDecisionStore
│ │ └── sqlite/ # SqliteDb, all SQLite implementations
│ ├── tokenization/ # Token IR, semantic tokenizer
│ └── vector/ # IEmbeddingIndex, InMemory + SQLite implementations
├── src/ # All library implementations
├── apps/
│ ├── shared/ # Shared arg_parser template (used by both apps)
│ ├── ccmcp_cli/ # CLI reference app
│ │ └── commands/ # ingest-resume, tokenize-resume, index-build, match,
│ │ # get-decision, list-decisions
│ └── mcp_server/ # MCP JSON-RPC server
│ └── handlers/ # Per-tool handler implementations
├── tests/ # 226 deterministic unit tests
└── docs/ # Architecture, governance, and design specs当前阶段--v0.4正在进行中
状态: ✅ v0.3已完成--v0.4正在进行中(切片1-10已完成)。 测验: 226个案例·1414个断言·0个失败·跳过7个(Redis+SQLite向量选择加入) v0.3准备就绪报告: 文档/V0_3_READINES_REPORT.md
特征矩阵
| 功能 | 状态 | 持久性 | CLI | MCP工具 |
|---|---|---|---|---|
| 词汇匹配 | ✅ | SQLite | match (演示) | match_opportunity |
| 混合(词汇+嵌入)匹配 | ✅ | SQLite+向量 | -- | match_opportunity |
| 宪法确认 | ✅ | — | — | match_opportunity |
| 审计日志(仅可追加,可查询跟踪) | ✅ | SQLite | -- | get_audit_trace |
| 交互状态机(FSM) | ✅ | SQLite+Redis(必填) | -- | interaction_apply_event |
| 恢复摄入 | ✅ | SQLite | ingest-resume | ingest_resume |
| 令牌IR生成 | ✅ | SQLite | tokenize-resume | — |
| 嵌入索引构建/重建 | ✅ | SQLite+矢量 | index-build | index_build |
| 漂移检测(源哈希比较) | ✅ (会话内) | SQLite | -- | -- |
| 决策记录(匹配来源) | ✅ | SQLite | get-decision, list-decisions | get_decision, list_decisions |
| 宪法阻止覆盖(授权操作员) | ✅ | — (请求范围) | --override-rule --operator --reason | — |
所有v0.3切片都已实现并通过。看 路线图 下面是完整的细节。
______________________________________________________________________
非目标
- 自主求职机器人
- 未经批准自动发送电子邮件
- 代理浏览循环
- 未记录的状态转换
- 仅矢量匹配
这是治理基础设施,而不是自动化玩具。
______________________________________________________________________
建筑
先决条件
- CMake 3.21+
- C++20兼容编译器(Clang 14+、GCC 12+或MSVC 19.30+)
- 提交时的vcpkg
e6ebaa9c3ca8fca90c63af62fc895c2486609580或稍后($VCPKG_ROOT或~/vcpkg) - Python 3(用于基线验证)
scripts/build.sh) - (可选)clang-format和clang-tidy 14+用于代码质量
依赖性治理
依赖版本通过固定 builtin-baseline 领域 vcpkg.json.这个 保证干净的签出解析完全相同的包图,无论 构建运行的时间或地点。构建脚本在配置之前验证基线 如果本地vcpkg安装比固定提交旧,CMake会很快失败。
vcpkg_installed/ 被排除在版本控制之外——工件始终得到解决 从固定基线开始,从不从提交的二进制文件开始。
看 docs/DEVELOPMENT.md 关于完整的依赖性治理细节, 洁净室验证步骤和基线更新程序。
构建说明
# Recommended: deterministic build with baseline verification
./scripts/build.sh
# Build without tests
./scripts/build.sh --skip-tests
# Clean build (wipe build dir, then build and test)
./scripts/build.sh --clean或手动:
# Configure with vcpkg toolchain
cmake -S . -B build-vcpkg \
-DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/vcpkg.cmake
# Build
cmake --build build-vcpkg --parallel
# Run CLI demo
./build-vcpkg/apps/ccmcp_cli/ccmcp_cli
# Run tests
./build-vcpkg/tests/ccmcp_tests依赖关系(通过vcpkg.json固定 builtin-baseline,自动解决):
- nlohmann json 3.12.0(json序列化)
- 格式12.1.0(格式化)
- Catch2 3.12.0(测试)
- sqlite3 3.51.2(持久层)
- redis plus 1.3.15(交互协调)
- libzip 1.11.4(DOCX恢复摄取)
- pugixml 1.15(DOCX恢复摄入)
代码质量
格式化代码并运行静态分析:
# Format all C++ files (modifies in-place)
./scripts/format.sh
# Check formatting without modifying
./scripts/format.sh --check
# Run clang-tidy static analysis
./scripts/lint.sh看 docs/LINTING.md 获取详细的linting和格式化文档。
确定性推理增强
这个项目体现了一个简单的原则:
确定性结构优先。 模型辅助第二。 人的权威永远。
该引擎稍后可以集成LLM提供者,但是:
- LLM输出被视为不受信任的输入。
- 验证是强制性的。
- 没有根据,不得引入新的事实。
- 所有的主张都必须追溯到规范原子。
______________________________________________________________________
路线图
v0.1✅ 完成
- 确定性匹配器
- 宪法验证支架
- 审核日志记录
- CLI演示
v0.2✅ 完成
- 混合词汇+嵌入检索
- SQLite持久性(原子、机会、交互、审计日志)
- Redis支持的交互状态机协调
- 带app_service层的MCP协议服务器
v0.3✅ 完成(6个切片+CLI重构)
切片1--恢复摄入管道
- 多格式摄取(Markdown、TXT、DOCX和PDF存根)
- 确定性文本提取和卫生规范化
- SQLite模式v2(恢复+恢复数据表)
- CLI:
ccmcp_cli ingest-resume - 看 简历_简历.md
切片2——令牌IR生成
- 从摄入的简历中提取语义标记
- 象征性IR的宪法验证(无无无根据的主张)
- SQLite模式v3(resume_tokens表)
- CLI:
ccmcp_cli tokenize-resume - 看 TOKEN_IR.md
切片3——SQLite支持的持久向量索引
SqliteEmbeddingIndex:追加销售、相似性搜索、持久存储- 替换仅供生产使用的内存中的临时矢量索引
- 看 VECTORDB_BACKEND.md
切片4——嵌入生命周期+索引构建/重建
- SQLite模式v4(index_runs+index_entrys表)
IIndexRunStore+SqliteIndexRunStore用于追踪来源run_index_build()具有每个工件漂移检测的管道(源哈希比较)- 确定性索引重建:跳过不变,重新索引过时
- CLI:
ccmcp_cli index-build - 审核事件:
IndexRunStarted,IndexedArtifact,IndexRunCompleted - 看 索引.md
CLI强化重构
- 共享
arg_parser模板提取到apps/shared/ - CLI从单片557行main分解为命令表调度+每个命令文件
Slice 5-MCP服务器加固+持久性布线
- 所有六个后端均已连接
main.cpp:SQLite存储、Redis协调器、LanceDB向量索引 - 配置标志:
--db,--redis,--vector-backend inmemory|sqlite,--vector-db-path,--matching-strategy - 两个新的MCP工具:
ingest_resume,index_build match_opportunity增益可选resume_id用于审计可追溯性ServerContext扩展为IResumeIngestor,IResumeStore,IIndexRunStore- 短暂回退:所有子系统在非持久性时在stderr上宣布警告
- 看 MCP_SERVER.md
切片6--决策记录
- SQLite模式v5(
decision_records表,按索引trace_id) DecisionRecord:一级来源工件,捕获匹配决策的完整“为什么”
- 按需求原子属性(atom_id, evidence_tokens) - 检索统计快照(词汇、嵌入、合并候选计数) - 验证摘要(状态、发现计数、失败/阻止/警告发现的顶级规则ID)
IDecisionStore接口+SqliteDecisionStore+InMemoryDecisionStorerecord_match_decision():每次之后都会打电话match_opportunity奔跑;发射DecisionRecorded审计事项match_opportunity现在的回应包括decision_id用于立即查找- 两个新的MCP工具:
get_decision,list_decisions - 两个新的CLI命令:
ccmcp_cli get-decision,ccmcp_cli list-decisions - 确定性JSON序列化(通过
nlohmann::jsonstd::map默认值) - 看 DECISION_RECORDS.md
v0.4(进行中)
切片1——确定性指数运行标识 ✅
- 架构v6(
id_counters表):单调递增的运行ID在重启过程中保持不变 IIndexRunStore::next_index_run_id()来源于SQLite计数器(修复了WARN-001)- 漂移检测正确性:运行ID在CLI调用之间不再冲突
切片2——矢量后端语义规范化 ✅
VectorBackendenum:共享权威词汇表--vector-backend旗帜- 将CLI和MCP服务器对齐到相同的有效值(
inmemory,sqlite) - MCP服务器
--lancedb-path命名至--vector-db-path;lancedb价值现在很快就会失效 - 已删除无声别名:标志→ 实现布线清晰详尽
切片3——可再现依赖解析 ✅
builtin-baseline固定在vcpkg.json--每次干净结账时都有相同的依赖关系图scripts/build.sh--具有基线验证的确定性构建入口点docs/DEVELOPMENT.md--洁净室构建过程和依赖性治理docs/ARCHITECTURE.md--依赖性治理部分
第4部分——宪法性封锁覆盖铁路 ✅
ConstitutionOverrideRequest域类型(rule_id,operator_id,reason,payload_hash)ValidationStatus::kOverridden--第五种不同的终端状态;BLOCK存在但被明确覆盖payload_hash结合:stable_hash64_hex(envelope.artifact_id)--覆盖是工件绑定的;不匹配默默拒绝- CVE:覆盖应用的帖子发现排序;BLOCK发现保留;仅
status更改为kOverridden ConstitutionOverrideApplied之后发出的审核事件ValidationCompleted当应用覆盖时- CLI:
--override-rule,--operator,--reason--全有或全无;部分集合快速失败 - 覆盖逻辑仅限于
app_service/CVE层——无存储适配器参与 - 看 宪法_RULES.md --BLOCK超控轨道段
Slice 5-Redis第一运行姿态 ✅
--redisMCP服务器启动时需要;生产路径中没有内存回退InMemoryInteractionCoordinator从所有实际代码路径中删除;RedisInteractionCoordinator仅redis-healthCLI命令在使用前验证活动性和往返性- 缺少或无法解析Redis URI时启动失败很快
切片6--运输/储存边界硬化 ✅
CCMCP_TRANSPORT_BOUNDARY_GUARD#error11个混凝土sqlite/redis集管ccmcp_cli_logic和mcp_transport_logic使用保护标志编译的OBJECT库- 逻辑层仅包括接口;仅在布线中建造的混凝土物体
.cpp+main.cpp - 编译时强制:跨界耦合立即导致构建失败
切片7——确定性运行时配置快照 ✅
sha256_hex()--纯C++FIPS 180-4 SHA-256,没有新的依赖关系core::kBuildVersion常数("0.4")用于来源标签RedisConfig::redis_db场;redis://host:port/N数据库索引的URI解析RuntimeConfigSnapshot域类型+确定性JSON序列化(按字母顺序排序的键)IRuntimeSnapshotStore接口+SqliteRuntimeSnapshotStore(模式v7,边界保护)- 架构v7:
runtime_snapshots桌子--run_id,snapshot_json,snapshot_hash,created_at - MCP服务器在每次进程启动之前都会发出一个快照
run_server_loop,在两个代码路径中 - 新不变量:每次运行一个持久化数据库都有一个匹配
runtime_snapshots排
切片8——确定性审计哈希链(加密的事件完整性前兆) ✅
AuditEvent扩展:previous_hash+event_hash字段(默认"",根据append计算)kGenesisHash--64个零十六进制数字,每个跟踪的第一个事件的确定性链锚compute_event_hash()--SHA-256(事件字段的稳定JSON+previous_hash),按字母顺序排序的键verify_audit_chain()--重新计算每个链接;回报AuditChainVerificationResult(有效、索引、错误)- 两者
InMemoryAuditLog::append和SqliteAuditLog::append计算并存储链 SqliteAuditLog获取(idx, previous_hash)单锁获取下的原子性- 架构v8:
ALTER TABLE audit_events ADD COLUMN previous_hash / event_hash TEXT NOT NULL DEFAULT '' - 新的不变性:每个附加的审计事件都携带一个防篡改的SHA-256哈希,将其链接到其前身
切片9——Docker化准备就绪(仅本地容器化部署蓝图) ✅
- 多级
Dockerfile:ubuntu:22.04建造者→debian:bookworm-slim运行时 - 通过自定义叠加三元组实现静态vcpkg链接(
docker/triplets/x64-linux-static-release.cmake) scripts/docker-entrypoint.sh--验证REDIS_HOST构造CLI参数,execsmcp_serverdocker-compose.yml—redis:7-alpine+应用服务,绑定挂载./data:/data用于SQLite持久化- 非根容器执行(
ccmcpUID 10001);Redis隔离桥接网络;没有暴露的主机端口 - 零C++更改——入口点脚本处理env-var转换;保留所有启动验证
- 看 部署.md
第10部分——强化v1前的治理 ✅
- 覆盖从升级的有效负载绑定哈希
stable_hash64占位符转换为SHA-256;binding_hash_alg字段为遗留覆盖保留向后兼容性 RuntimeConfigSnapshot字段已重命名schema_version→snapshot_format_version(v2);db_schema_version字段已添加;Slice 7快照保留了传统反序列化--audit-chain-verify标志:启动时对所有存储的跟踪进行SHA-256哈希链完整性检查;fail模式因损坏而拒绝启动list_trace_ids()添加到IAuditLog接口;实现于InMemoryAuditLog和SqliteAuditLog- 5项新测试:
test_audit_chain_startup.cpp—[audit-chain]标签
计划:
- 通过容器化工具链实现真正的PDF提取(Poppler/MuPDF)
- 恢复合成工作流程(原子选择→ 草案→ 验证→ 输出)
- 结构化简历修补(宪法差异和修补操作)
- 真正的LanceDB C++SDK集成(目前
SqliteEmbeddingIndex填充此插槽) - 令牌验证规则包
- 真正的嵌入提供商集成(OpenAI、本地模型)
______________________________________________________________________
贡献
如果捐款能够保留以下内容,欢迎捐款:
- 决定论
- 可审计性
- 明确的治理边界
- 清除错误表面
- 可重复性
请避免添加:
- 隐藏的网络呼叫
- 代理循环
- 非确定性决策路径
所有捐款都必须符合项目的宪法立场。
______________________________________________________________________
许可证
此项目根据Apache许可证2.0版获得许可。
版权所有(c)2026 PlainSight实验室
有关完整条款,请参阅许可和通知。
资产例外
以下资产未在Apache 2.0下获得许可,仍受版权保护: •平视-lab-logo.svg •plainsight-lab-logo-dark.svg
这些文件仅在此存储库中使用,未经明确许可,不得重新分发、修改或用于暗示从属关系。
除非另有说明,否则此存储库中的所有其他源代码和文档均在Apache 2.0下获得许可。
最后说明
这不仅仅是一个求职工具。
它是以下内容的参考实现:
- 确定性推理
- 宪法确认
- 可审计决策系统
它是约束下推理的基础设施。
