Mark

核对结论与准备优先级

第一阶段的判断保持不变:简历具有值得进入 Go 后端技术面的工程信号。第二阶段确认了多个核心机制确实存在,也发现部分措辞比实际实现更强。对校招来说,能把已实现能力、失败窗口和改进方向分开说明,比继续增加术语更有价值。

以下优先级针对简历和面试准备,不是已经执行的项目修复计划。

1 应优先修正的四类表述

优先事项 核对到的事实 建议怎么说
Flostra 的事件恢复 有全局 Redis Stream 追加,但每次执行的 Replay 从 Redis List 读取;SSE 输出没有标准 id/Last-Event-ID 续传协议 “Redis 短期事件回放与 SSE 重连重放,前端利用事件序号处理重复”;不要把它说成精确的 Stream 游标续传
Nyauth 的邮件租约 默认一次认领 20 条、串行发送、租约两分钟且无续租;SMTP 成功但本地未记 sent 仍可能重复 “SKIP LOCKED 并发认领、租约回收及持有者条件回写”;删去无条件的“防重复执行”承诺
Gline 的损坏恢复与去重 不完整尾记录自动截断;完整 CRC 不匹配拒绝恢复。幂等范围是同项目、同批次身份、同规范载荷 “WAL 不完整尾记录恢复,同批次重试不重复落库”;不扩大为任意损坏恢复或重采集去重
Agent 实习的验收保证 历史 r11 的 CTest 案例与当前声明式 expectation 流不同;当前存在空 expectation 可比较为 consistent 的门槛缺口 “在限定构建、观测与测试范围内进行程序化差分验收”;避免声称已经完整证明任意重构行为等价或所有当前路径均严格 fail-closed

直接源码入口:Flostra 回放SSE 输出Nyauth 邮件分派Gline WAL 恢复expectation 比较expectation Schema

Agent 当前 generated E2E 入口还有 enforceScope:false,它传入工作流编写阶段;Refactor Agent 自身仍走默认范围校验。既不能说所有 Agent 都没有限制,也不能说该演示入口验证了所有 Subagent 都受范围约束。见 E2E 入口

2 已经有代码支持的核心亮点

Nyauth

授权码、严格 S256 PKCE、OIDC ID Token、RS256/JWKS、客户端管理都有具体实现。Refresh 的 Lua 将轮换与 access 元数据登记合到原子边界;PostgreSQL 邮件事务也有明确入口。可以主讲“一次性消费”和“可恢复发信”,但同时要解释 family 重放撤销、Redis 故障与 SMTP 重复窗口。

Flostra

执行记录与 Outbox 同事务、SKIP LOCKED 认领、RabbitMQ 持久消息与 Confirm、Attempt/Worker 条件校验、Watchdog、显式幂等 Redrive 都有实现。当前版本已经修正历史记录中“结果事件非持久、主路径不论结果是否发布都 ACK、未知完成状态默认成功”的问题,面试准备不能沿用旧批评。

同时,控制面状态校验不等于 Worker 在执行前获得排他授权;CompleteAttempt 的租约截止时间语义,也不能用理想设计替代实际代码。

Gline

WAL 把待发送载荷与采集 checkpoint 关联持久化,事务 ACK、规范载荷 hash 和租户复合约束形成了清楚的可靠性链路。文件身份、轮转、keyset 和错误分类提供了足够多的 Go 实现细节,适合在面试中证明自己能写代码和推演故障。

refactorSubagent

宿主控制状态转移、版本化 Artifact、双 Worktree、工具范围 hook、依赖注册与构建/测试编排都有对应实现;本地保存了 libuv 拒绝与 trim 接受的历史记录。它适合作为 Agent 工程经历,但“原型支持哪些门槛”与“当前所有路径已可靠验收”需要分开。

3 不宜回避的实现限制

主题 面试时应该知道的具体限制 本次证据层级
Nyauth 刷新故障 部分 Redis 错误被压成 invalid_grant,客户端可能把依赖故障误作凭据无效 已核对控制流;未做 Redis 断连复现
Nyauth 退出 Shutdown 协程与 Run/main 的等待关系不完整,不能据调用 Shutdown 就宣称完整优雅退出 已核对控制流;未发信号复现
Flostra 派发 mandatory=false 时 Confirm 不能单独证明消息被目标队列接收 已核对发布参数与官方语义;未删除队列测试
Flostra DAG 不等深数据汇合可能过早运行;gather 异常结果未逐项检查 源码可推导风险;未运行故障复现
Flostra 事件 多次 Redis 写无共同事务;List 有保留期;Hub 满可能丢事件;跨 Attempt 的序号需要额外处理 已核对代码;未做浏览器故障验收
Flostra 安全 部分事件字段脱敏不覆盖所有终态结果;静态 Secret、传输与 Worker 能力是不同边界 只读检查,未读取秘密或做利用测试
Gline 容量 pending 载荷也占内存,逻辑 spool 上限不等于物理磁盘上限;长行/批次字节边界仍需加强 已核对实现;未做磁盘写满与内存压测
Gline 退出 Server 只等待两个后台 Worker 中一个结果后关闭 store 已核对控制流;未做延迟退出复现
Agent 当前门槛 expectation 允许空数组;独立状态机未像 CTest 路径那样完整重算证据对比 已核对比较器、Schema 与状态机;未执行当前 E2E

这些限制不意味着每个功能都无价值,也不意味着面试时应主动把项目讲成问题清单。建议先说明核心链路,再在被追问到保证范围时给出准确边界。若面试官问“你会先改什么”,优先选择能明显补齐当前承诺的缺口。

4 如何选择主项目

面试方向 主讲候选 次项目 重点准备
通用 Go 业务后端 你最熟悉的 Flostra 或 Nyauth Gline 事务、接口、资源管理、故障时间线、手写代码
平台与任务系统 Flostra Gline 控制面与执行面、重试边界、状态围栏与恢复
认证与安全平台 Nyauth Flostra OAuth/OIDC 信任、令牌生命周期、撤销与多实例
Agent 工程平台 refactorSubagent Flostra 工具执行边界、验收证据、非确定性、状态与恢复
数据采集或 Go 工程细节 Gline Nyauth 文件系统、WAL、网络错误、协议、数据库幂等

选择依据应是本人熟悉程度与岗位职责。没有亲自做过某模块,就不为了匹配岗位把它放成“独立负责”的主卖点。

5 练习顺序

第一轮,先把事实校准。 修正上面的四类表述,补齐个人贡献、使用规模、实习关系和验证记录。为每个项目准备一段 90 秒介绍和两条失败时间线。

第二轮,练最容易追深的链路。 Nyauth 练“并发刷新后为什么成功 token 仍被撤销”;Flostra 练“Confirm 成功后进程崩溃”和“旧 Worker 回写”;Gline 练“数据库已提交但 ACK 丢失”和“短尾恢复”;Agent 练“测试通过为什么不等于行为等价”。

第三轮,把原理写成代码。 独立写拓扑排序、取消工作池和条件更新 SQL,不看参考答案。面试官改变条件时,先修改契约,再修改实现。

第四轮,按 90 分钟流程模拟。 每轮只深挖一个主项目,用另一个项目做交叉验证。回答卡住时记录“缺知识、缺事实、缺证据、表达过长”中的哪一种,针对原因复习。

**如果只有一天:**优先修正事实措辞,练主项目两条故障时间线,再完成一题并发手写和 Go/SQL 基础复述。不要尝试一天内背完全部追问。

6 本次检查快照

对象 路径与 HEAD 检查边界
Nyauth E:/Proj/nya,68de309 当前源码、测试与 Compose 关键拓扑;已有未跟踪文档保留
Gline E:/Proj/gline-full,81600c3 包含当前未提交源代码;Agent、Server、协议、迁移和测试定义
Flostra Go 控制面 E:/Proj/Flostra/gback,9751cd1 包含当前未提交源代码;没有用 jback 替代
Flostra Python Worker E:/Proj/Flostra/backend,550d9ea 与执行、消息、节点调度和安全边界相关的源码
Flostra 前端 E:/Proj/Flostra/frontend,fc46177 当前事件恢复和执行详情相关源码;未读取本地秘密配置
Agent 实习 E:/Proj/refactorSubagent,a9de1cf 当前门禁/工作流源码和已保存历史 E2E 产物
地质大队实习 对应代码暂未找到 仅根据简历设计技术问答,未核实实现细节

检查日期为 2026-09-07。工作区包含未提交改动,HEAD 不能单独代表本次读到的全部内容;引用行号随后续编辑可能移动。

本次对项目进行了只读检查,没有修复代码、重启服务、运行付费 Agent E2E、执行项目全量测试、部署或提交。项目既有测试的存在与历史记录,均未写成本次运行通过。独立手写题运行了 go test -race ./...go vet ./...,两项通过。

协议与语言问题使用了 Go、PostgreSQL、Redis、RabbitMQ、IETF、OpenID 等一手文档,链接放在相关答案旁。过去的项目记录只用于选择核查方向;当前实现结论以本次读取为准。