任务:知识库喂入层(kb-feeding,方向 2)
设计依据:所有者 10-24 定稿(修订 2,评审目录 kb-design-1024.md)与进度页决定 62。树苗(docs/hub-r4-tasks/kb-seedling.md,方向 1)之外的一切资料——用例、缺陷、需求/规格、构建、自由文本——都由 Circle 喂给树:Circle 实际用到什么,Hub 就按来源的 schema 把什么填进去;Circle 只补程序填不了的语义,带逐字引文;Hub 只核验、登记、写账,不问人、不调模型、不裁决矛盾。本页把 knowledge-structure@1 的结构逐项写死;实现拆分待本页审定后另列。
喂入层的位置与形状(照定稿)
- 挂在树苗旁,不进根摘要:喂入对象是独立内容寻址对象,只带指向树苗(和节点路径)的引用。
- 进入时机 = Circle 用到:运行里经 Hub 连接器读到,或上传为输入;Hub 之外读到的只有上传才算用到。不再整批生产。
- 运行中不问人:待办只登记在控制台;唯一的问人在 start_run(包要求版本而没给、结构也定不出时拒绝并列候选)。
- 冲突:结构问题按产品包声明的权威源判;语义矛盾两边都留、建 contradicts,不裁决。
- 伪造:一切陈述的根据必须是 Hub 自己经连接器读到并保存的原文,引文逐字核对,不存在整条拒收;闭集、命令、路径解析不出即拒;管理员撤回记录是唯一的事后纠正。
0. 总则(不许的东西)
不许关键词、词表、同义词、前缀表或自由文本正则决定身份、绑定或关联;一切匹配是结构化值的完全相等(命令串↔命令树路径按 CommandIdentity,编号↔声明语法,版本↔目录语法)。例子全部合成:平台 zx-u、版本线 10.8 起、地址只用 192.0.2.0/24。
1. 五类对象的身份、出处与字段
身份一律是内容摘要(K01 同款规范化:排序紧凑 UTF-8、身份字段不含时间戳);文档号/节点号是出处,不是身份。10 份字节相同的脑图 = 一个对象、多条来源、多条绑定。
1.1 用例(fed-case@1)
- 身份:规范化的用例子树摘要。复用 cases.ts 的投影:kityminder@1 子树 →
{autoid, priority, 资源, 步骤文本, 期望文本}规范形(cases.tscaseStatement的输入形状),摘要 = canonical JSON 的 SHA-256。autoid 缺失时身份只按内容(autoid 是字段,不是键)。 - 出处字段:
source = { system: 'agile', document: <文档号>, element: <节点号>, revision: <平台修订>, bytes: <原件对象摘要> };一份文档多来源就多条source,身份不变。 - 程序读到即填的字段(全部来自 famx 包结构化解析,逐字段):
autoid、priority、resources← 敏捷平台 meta + 脑图 JSON 节点 data(cases.tselementDocument/ 脑图解析)。steps[].text、expects[].text←cases.ts.caseBody共用读取两种布局:步骤子分支+期望叶子,或用例节点正文分行+期望叶子。编号、[check]、空白和原措辞保留,不另写喂入专用提取规则。commands←cases-commands.ts.stepCommands共用完整命令行和类型核验,按锁定树苗的命令目录生成CommandIdentity。解析不出的步骤不猜、不擦除编号或标记,计入unparsed_steps;上级标签、标题布局的纯标题和期望中的命令不补成操作命令。document_lines← 敏捷目录版本层(documents.tsdocumentLines)。
- Circle 可经回注提出的字段(每个都带逐字引文
quote = {source 对象摘要 + 选择器}):classification(闭集:功能/反向/升级/…)、manual_link(用例↔手册章节提议,见关联规则)、relations(same_subject / contradicts / covers)、applicability(逐字段,FAMX_COMPONENTS 等闭集)、correction(对步骤/期望原文的更正建议,不改原件)。 - 关联规则:用例↔命令:
steps里的命令串与树苗/commands/<词…>路径完全相等(CommandIdentity 相等)→ 程序建(结构),核验只查锁定根里路径仍可解析。用例↔手册章节:只经核验的提议——Circle 提manual_link,Hub 核引文在手册原件逐字存在、章节路径在锁定树苗/manual/*下可解析;核不过整条拒。程序不建章节关联。
1.2 缺陷(fed-defect@1)
- 身份:PLM 导出的规范化记录摘要(定稿:编号是出处不是身份;同编号内容变了 = 新身份、旧主张失效)。
- 出处:
source = { system: 'plm', ticket: <编号>, revision: <导出批次>, bytes }。 - 程序填:
id(编号)、status、affected_lines、resolved_lines、fix_builds← PLM 结构化字段(fixed-bugs.ts 同款投影);affected_lines为空 → 版本”未声明”。 - Circle 回注(带引文):
classification、same_subject/contradicts/covers关系、applicability、对描述的更正建议。
1.3 需求/规格(fed-spec@1)
- 身份:规格文档规范化摘要(specifications.ts 的文档形状)。
- 出处:
source = { system: 'plm-requirements' | 'manual-store', ticket | path, bytes }。 - 程序填:
id、title、linked_builds← PLM 构建的需求字段;文档目录行(documents.ts)。 - Circle 回注(带引文):章节↔命令提议、章节↔用例提议、
applicability、更正。
1.4 构建(fed-build@1)
- 身份:构建站写法的完整构建名本身 + 家族/线/平台解析(naming.ts
parseBuildName的规范输出)。 - 出处:
source = { system: 'build-site', page: <页名>, bytes }。 - 程序填:
name、family、line、platform、built_at、released_at、tree(命令树对象摘要)、fixed_bugs(修复清单,fixed-bugs.ts)——全部来自 sync.ts 已有投影;点名构建(FAMX_PINNED_BUILDS)进喂入层照常。 - Circle 回注(带引文):
applicability、构建↔缺陷 covers 提议。运行目标不产生任何绑定,只产生使用记录。
1.5 自由文本(fed-note@1)
- 身份:上传原件的内容摘要(工单、纪要,任何自由文本)。
- 出处:
source = { system: 'upload', bytes };上传原件来源类型是”声明”,只对上传者和管理员可见(B02 R[3]),不作团队知识的根据。 - 程序填:只有采集事实(谁、哪次运行、时刻);不解析内容、不抽关键词。
- Circle 回注(带引文):
classification(闭集 = 对象种类加工单、纪要,其余记未分类——决定 62 集成者七项)、逐字引文的段落声明、关系提议。
2. 版本绑定(version-binding@1)
一条绑定是一条主张(B01 形状):
| 字段 | 取值 |
|---|---|
object |
喂入对象摘要 |
product |
产品线 |
line |
版本线(按产品包声明的目录/名称语法解析;C07 R[9]:10.8 = 10.8.0) |
basis |
source_structure(来源结构)或 declared(人的声明);组成依据词表加”来源结构”一档(决定 62) |
grounds |
source_structure:目录标签原文片段 + 解析语法名;declared:声明人 + 运行号(case-location 的 line 参数、回注的版本声明) |
state |
bound / undeclared / conflict;conflict 带 candidates: line[](目录里两个版本层时两个都留) |
- 出处只有两种:来源结构(敏捷目录版本层、PLM 影响/解决版本、构建站修复清单、手册库目录名、构建名语法——全部程序按声明语法解析,等级”观察上的规则”)和人的声明(等级”声明”);模型读内容推断版本禁止。结构与声明冲突(目录说 10.8,某人声明 10.9):两者都留,等级决定显示顺序,不覆盖。
- 继承:绑定只记直接那条;视图按产品包声明的规则展开(现规则:不晚于目标线、不早于 min_line 的用例都算,沿用 min_line),展开项标”继承自 10.8(产品包规则)”;没有声明规则的不继承。
- 定不出版本 → 对象进产品线不分版本范围,
state = undeclared,标”版本未声明”,照常参与一切、单列计数、不进版本差;控制台每份文档一条待办(重复不再发、不推送),目录改好后下一次读到自动绑定。同一身份多版本目录 → 多条绑定,不复制。 - start_run 的问人保留一处:包声明”必须有版本”而 start_run 没给、结构也定不出 → 拒绝并列候选(C07 R[3])。
3. 使用记录、序号冻结、撤回(usage@1 / feeding-offset@1 / retraction@1)
- usage@1:
{object, run, line(运行目标), at}——Hub 观察到就记(事实);不算版本绑定。凡经 Hub 读的都在(必须回):运行里读过的对象全部出现在本次运行的喂入清单里,不是可选。 - feeding-offset@1:运行开始时冻结喂入层序号(只追加日志的位置),与锁根一起记进运行;重跑按同一序号复现。回归范围、巡检、查缺、看板、追溯一律读”锁定树苗 + 冻结序号之前的喂入层”。
- retraction@1:
{objects[] | runs[] | entries[], by: 管理员, at, reason 一行}——追加式,被撤回条目有效条件记失效,不删、留痕;吊销令牌账号的回注进撤回待办。唯一的事后纠正,不做事前审批。
4. 视图怎么读喂入层
- 对象清单走视图(index / facets),get_nodes 在关联节点旁附带对象引用(像现在的 contributions);不新增读取机制。
- 回归范围 / 巡检 / 查缺 / 看板 / 追溯:锁定树苗 + 冻结序号之前的喂入层;”版本未声明”单列计数、不进版本差;矛盾(contradicts)数单列;冲突(conflict)照常参与并单列。
- 未声明版本的对象命令照锁定版本的命令树核(封闭世界),不因未声明降级核验。
5. 读到即喂(触发点与复用)
程序投影由这些现有读取触发(复用 famx 包既有函数,不写新的解析):
| 触发点 | 投影 |
|---|---|
start_run 绑定的期望来源读取(检查声明 reads,6a36255) |
用例(cases.ts / cases-commands.ts / locate.ts)、缺陷(fixed-bugs.ts)按读到即填 |
| get_nodes 按引用读原件 | 同上 + documents.ts(目录行 → 绑定候选) |
| upload_file | 自由文本(fed-note@1,声明级可见性) |
| 同步里的构建清单(含 FAMX_PINNED_BUILDS 点名构建) | fed-build@1(sync.ts 已有投影,转喂入层) |
Hub 之外读到的(模型在 Circle 里自己看的)不触发;只有上传才算用到。
6. 过渡(决定 62:旧每构建根不动)
- 旧每构建根保留不动、不再新增用例索引;视图对旧根照旧。
- 新树苗路径上,视图先读喂入层;喂入层里这个版本没有任何用例时,照实报“这个版本的用例还没有被用到过”,给出口(用到即进来:下次运行读到即入层),不报错、不回退去整批生产。
knowledge-structure@1的 schema 草案进contracts/model.json的路径:与 seedling@1 并列,五类对象 + version-binding + usage/feeding-offset/retraction 三记录 + 视图闭集;生成走 gen:contracts。实现前不改 contracts,本页即草案。
顺序
- 本页审定(所有者过目)。
- contracts:knowledge-structure@1 schema + 词表”来源结构”档(gen:contracts 重生成)。
- Hub:喂入层存储与读到即喂投影、核验管线、冻结序号、视图改造。
- 包:knowledge-contribution 承接回注;famx 包函数转喂入投影(声明已去,函数在)。
- 客户端:Circle 提议格式与”必须回”清单。
Hub 接线与读取边界
- 写入由
Knowledge.feeding提供:observeSource、upload、prepare/appendPrepared、retract;模型提议复用回注槽的可选feeding字段,不新增模型调用。admit先核验整份数组,再在同一事务追加。 - 五类对象、绑定、使用与撤回均放在
claim@1的statement.data.feeding,保留 B01 根据、依据等级、实际操作者和原始来源记录身份。规范内容另存对象库。冻结序号取记录库追加顺序(允许空洞),与根一起写入运行、上下文和结果锁;序号不写进规范对象,不进根摘要。 - 视图读取走
FeedingReader.cut(product, offset, principal),原件权限逐条核对;null只表示无运行的当前视图。旧运行缺冻结序号时给缺失事实和另开运行的出口,不回填零或最新序号。旧每构建根仍走旧视图。 - 产品包声明
feeding.project、normalize_line、verify_command、classifications回调;Hub 不解析产品正文。工作流可以声明feeding.require_version、分类闭集及declared_line_parameter。运行目标只记使用;只有最后这个显式参数才记人的版本绑定。 - JSON / KityMinder 解析器未提供可证明的原始字节范围,因此喂入引文另支持
{reference: src 引用(含解析器与选择器), text: 逐字片段}。已有可证明字节跨度的引文格式继续支持;不猜跨度,不做文字折叠。 - 实际读取清单通过工具结果的
feeding_objects返回,原件喂入缺上下文或格式失败通过feeding_pending给缺失事实和下一步。原件保留原权限。管理员调用retract追加撤回;对象、运行、条目分别核对存在性,原始记录不删不改。账号停用或存在已吊销令牌的回注只登记核对待办,不自动裁决。
读触发投影的有界执行
- 每份原件整体交产品包投影,最多两次整文档调用(识别后带冻结命令树重投影);版本线按文档去重后,用现有沙箱批调用在一个进程内核对所有候选,不按用例、步骤或树苗逐个起进程。
- 纯投影按原件摘要、产品包摘要、原始外部身份、元数据摘要、冻结根与组成寻址缓存;并发同件合并,重读和重启复用已完成的整文档投影。权限、当次出处、版本绑定与使用记录仍分别核验登记,缓存不扩大权限,也不把不同元数据或不同组成混在一起。
start_run输入、期望来源、检查读取及原件get_nodes的读触发最多等 250 毫秒;未完成即回“投影进行中”,feeding_pending带缺失事实与下一步,feeding_objects先列实际读取的原件摘要。后台最多 2 件、排队最多 32 件;超出明确回尚未开始,不能静默丢弃。单次沙箱最多 5 秒,不重试墙钟超时;每份文档最多 1000 条对象,超限整份拒收。- 任务状态以追加记录保留。重启后缺完成回执就报未知,重读按原采集引用续做;不伪造完成,不推进运行冻结序号。元数据按连接器声明的 JSON 解析,不因其中有
root字段就识别成脑图。
原件采集身份与多来源
- 新运行的来源绑定分别冻结
artifact(本次返回的原件记录)、read_manifest(读取动作)与meta_artifact(同次元数据原件记录)。读取字节和后续检查优先沿这份绑定走;来源的内容摘要仍是对象身份,不替代采集记录身份。 - 生成件的业务出处取核验过的本次读取清单:清单必须确实列出该原件记录及其字节摘要,且当前读者有权读取。连接器按原件记录索引读取清单,不按全库的相同摘要反查、挑前一条或最新一条。脑图读取依赖目录树等多个外部对象,不能因此判“多个来源冲突”。
- 同内容可来自
agile:case、agile:mindmap等不同读取动作:规范用例对象摘要相等,出处观察分别追加并绑定各自读取动作;不同规范内容即使文档号、节点号相同也生成新身份,旧主张按来源修订的有效条件失效,历史原件和引文不改写。 - 旧生成件若只记录摘要、缺读取动作身份,记来源未声明并给重新读取的出口,不猜补一条历史出处,也不以“来源不唯一”阻断原始输入读取。
resource 的用例级结构提示
fed-case@1.resource_declaration 记录模板表身份、声明状态、原始解析值的 raw_json、已声明测试类型和结构违规。闭集外字面或字段形状错误只使该用例的标签字段记 undeclared,接受标签列表留空,附一条 advisory 违规及允许精确字面的修正清单;该用例和其余用例照常入层。原始值仍参与规范内容摘要,不会把两个不同的未声明值压成同一身份。有效标签按完全相等登记,接受列表去除完全相等的重复值;原始顺序和重复值保留在 raw_json 与身份输入中。历史对象没有这个可选字段时不回填、不改原件。
失败重试与读取上下文
持久投影和完成回执只复用成功结果,均绑定实际产品包摘要;进行中任务也按包摘要区分,并冻结所用包。升包后同一原件重新投影,旧包晚到的失败或结果不覆盖新包的待办、对象及当前进度,历史记录保留。
输入原件、目录元数据、锁定命令树的读取失败统一登记本次待办,说明阶段、摘要、采集记录和读取档位;不沿用旧的函数错误。树苗命令树只从已授权根的锁定组成取对应采集记录,通过实际启用的管理员核验身份解析;服务没有预设同步管理员时不再借普通运行者去读管理侧原件,也不向运行者授予原始命令树访问权。生成件已有运行读取授权时,喂入只复用运行冻结的那条采集记录;相同字节的未绑定副本、不可读元数据及保留中的来源仍不能替代或越权读取。