From 97b124b6521f20ab37d5bfeb4fe8cb676ddad860 Mon Sep 17 00:00:00 2001 From: cjs1102 <180498659+cjs1102@users.noreply.github.com> Date: Wed, 21 Oct 2026 20:28:20 +0800 Subject: [PATCH 1/4] docs(readme): add external README, demo launcher, and seed fixture Rewrite README.md in English for external users, add a separate README.zh-CN.md, and include two local UI screenshots. Add the one-command tools/dev/demo-up.sh launcher, tools/dev/demo-seed.sh, and a 12-job synthetic fixture. Update the docs index, local demo guide, project state, and handoff with the implementation evidence and the capture no-retention check. Co-Authored-By: Claude Code --- README.md | 455 +++++++++--------- README.zh-CN.md | 211 ++++++++ docs/CLAUDE_CODE_HANDOFF.md | 17 + docs/PROJECT_DOCUMENTATION_INDEX.md | 32 +- docs/README.md | 5 +- docs/ai/project-state.md | 52 ++ docs/examples/demo-jobs.json | 190 ++++++++ .../active/0025-readme-and-usage.md | 29 +- docs/guides/local-demo.md | 32 +- docs/images/web-detail.png | Bin 0 -> 98860 bytes docs/images/web-status.png | Bin 0 -> 111207 bytes tools/dev/demo-seed.sh | 81 ++++ tools/dev/demo-up.sh | 198 ++++++++ 13 files changed, 1028 insertions(+), 274 deletions(-) create mode 100644 README.zh-CN.md create mode 100644 docs/examples/demo-jobs.json create mode 100644 docs/images/web-detail.png create mode 100644 docs/images/web-status.png create mode 100755 tools/dev/demo-seed.sh create mode 100755 tools/dev/demo-up.sh diff --git a/README.md b/README.md index c18bdb4..c86dcd0 100644 --- a/README.md +++ b/README.md @@ -1,271 +1,248 @@ # JobPilotAI -JobPilotAI 是一个基于 C++ 高性能后端架构的 AI 求职自动化平台:公开来源采集 + -人工采集 + 岗位导入/检索 + 投递管理 + AI 匹配。 +[English](README.md) | [简体中文](README.zh-CN.md) -> 本页只描述**当前真实能力**。未实现的部分在「未实现 / 非目标」一节明确列出。 +JobPilotAI is a self-hosted job-search workspace: a C++17 backend collects and +searches public job postings, explains matches deterministically, and tracks +applications. An optional AI worker provides task-based assistance; the core +workflow does not require an AI provider or API key. -## Quick Start (English) +| Job detail with an explainable match | Application status board | +|---|---| +| ![Job detail showing a rule-based match score and reasons](docs/images/web-detail.png) | ![Application status board with a resume upload and tracked applications](docs/images/web-status.png) | + +The screenshots show the local Web UI with synthetic demo data. The current UI +labels are in Chinese. -JobPilotAI runs locally with MySQL and Redis only, and **no AI provider key is -required**: deterministic `rule_v1` matching and `tailor_rule_v1` drafting work -without one, and a provider is optional and bring-your-own-key. +## Quick Start (English) -Prerequisites: Docker with the compose plugin, CMake ≥ 3.22, a C++17 compiler, -`pkg-config` plus the MySQL client development files, and Python 3 with pip (for -Conan 2). `tools/dev/bootstrap.sh` checks all of them and names whatever is -missing. +Prerequisites: Docker Engine with Compose v2, `curl`, and Python 3. The first +run builds the backend image, so Docker must be able to pull its base images and +complete that build. ```bash git clone https://github.com/cjs1102/JobPilotAI.git cd JobPilotAI - -tools/dev/bootstrap.sh # resolves the pinned Conan graph (service/conan.lock) -cmake --preset release # debug / asan / ubsan / tsan also work -cmake --build --preset release -j"$(nproc)" - -cp .env.example .env # fill MYSQL_ROOT_PASSWORD and MYSQL_PASSWORD -docker compose up -d # MySQL 8.0 + Redis 7 - -docker compose --profile app build backend # the service image (needs a registry) -docker compose --profile app up -d # ... now also the service on :8080 -curl -fsS http://127.0.0.1:8080/health - -tools/dev/demo-gate.sh # end-to-end gate: import -> search -> match -> tailor -> track +./tools/dev/demo-up.sh ``` -- The binary is `build/presets/release/service/jobpilot_service` (root entry) or - `service/build/presets/release/jobpilot_service` (service entry). -- `tools/dev/demo-gate.sh` starts an isolated compose project of its own — own - container names, host ports, volumes and database — and tears it down - afterwards, so it never touches an existing stack or its data. -- Database bootstrap and upgrades: [`database/schema/README.md`](database/schema/README.md). -- Contributors and AI agents: start at [`AGENTS.md`](AGENTS.md), then - [`docs/ai/`](docs/ai/) (workflow rules, current state) and the executed plans - under [`docs/exec-plans/`](docs/exec-plans/); [`docs/README.md`](docs/README.md) - is a short reading order. - -## Community +The launcher: -- Security policy and private reporting: [`SECURITY.md`](SECURITY.md). -- Build, test, PR and review workflow: [`CONTRIBUTING.md`](CONTRIBUTING.md). -- Code of Conduct is deferred until a reporting channel is available; see - `CONTRIBUTING.md`. +- checks Docker, Compose, `curl`, and Python; +- creates a `.env` with random MySQL and internal-token secrets only when + `.env` is missing, writes it with mode `0600`, and never prints the secret + values; an existing `.env` is left untouched; +- starts MySQL 8 and Redis 7, builds and starts the backend, and serves the Web + UI on port `8081` — through nginx when `nginx:1.27-alpine` is available, or + through the bundled Python static/proxy server otherwise; +- imports 12 synthetic jobs by default and prints a line such as + `DEMO_READY url=http://127.0.0.1:8081`. -## 最小 Web UI(0022) +Open the printed URL. The default backend is on `http://127.0.0.1:8080`. To +start without the sample jobs, pass `--no-seed`. Ports and the Compose project +name can be overridden with `DEMO_API_PORT`, `DEMO_WEB_PORT`, +`DEMO_MYSQL_PORT`, `DEMO_REDIS_PORT`, and `DEMO_PROJECT`. -`web/` is a native HTML/CSS/JS UI with no build step. The optional `web` compose -profile serves it with nginx and reverse-proxies `/api/*` and `/health` to the -existing C++ service (same origin, no CORS, P1 untouched): +Stop the stack with: ```bash -cp .env.example .env -docker compose up -d -docker compose --profile app build backend -docker compose --profile app --profile web up -d -# open http://127.0.0.1:8081 +docker compose --env-file .env -p jobpilot-demo --profile app --profile web down ``` -Flow: register/login → upload a resume (required before favourite) → search or -recommended jobs → explainable match → detail with original/apply links → -favourite → application status board. The UI never submits an application; it -only opens the original page for manual application. +Add `-v` only if you also want to delete the demo database and uploaded files. -If the host cannot pull `nginx:1.27-alpine`, the documented fallback runner -serves the same `web/` files and proxies the same paths: +### Build from source (optional) + +The one-command demo uses the containerized backend. To build and run the C++ +service directly, install a C++17 toolchain, CMake, `pkg-config`, and the MySQL +client development files, then: ```bash -python3 tools/dev/web_static_proxy.py \ - --root web --port 8081 --backend http://127.0.0.1:8080 +tools/dev/bootstrap.sh # resolves the pinned Conan graph +cmake --preset release +cmake --build --preset release -j"$(nproc)" ``` -Full walkthrough, troubleshooting and screenshot steps: -[`docs/guides/local-demo.md`](docs/guides/local-demo.md). Isolated smoke: -`tools/dev/web-smoke.sh` (prints `WEB_SMOKE_OK`). - -## 当前能力 - -### C++ 服务(`service/`,P1 网络层行为冻结) - -- 用户与鉴权:注册、登录、Redis 会话、`Authorization` 鉴权、`me`。 -- 画像与技能:登录用户的画像读写、技能增删改查。 -- 简历:上传、分页列表、文本版本生成、版本列表。 -- 岗位读取:公开岗位搜索与分页、岗位详情与技能要求、`rule_v1` 确定性推荐排名 - (薪资格式/技能硬过滤、分数明细、稳定分页)。 -- 申请链接(0020):列表、推荐、详情新增 `apply_url`(string|null)。仅当来源 - **显式提供**时非空(Lever/Ashby 的 `applyUrl`、nowcoder 原生岗的 - `redirectExternalUrl`);Greenhouse 与 nowcoder 聚合岗为 `null`,不从 - `source_url` 推导/拼接。 -- 投递:创建/列表/状态/统计,岗位与简历版本校验、重复投递保护、状态机。 -- 岗位导入(内部):`POST /internal/jobs/import`,token 保护、`source_url` 幂等 - upsert、事务内整组替换技能要求,批次 `1..100`。 -- 来源观测(内部):`POST /internal/jobs/source-sync`,`complete` 完整性语义、 - 消失宽限与重新出现、freshness 可见性(`fresh`/`aging`/`stale`/`closed`)。 -- AI 匹配(0013):公开 `POST /api/v1/ai/match` + `GET /api/v1/ai/tasks/{id}`, - token 保护的 `/internal/ai/tasks/*`,确定性 `match_rule_v1` 分数永不被告覆写。 -- 岗位列表可用性与入库质量(0015A):公开岗位搜索默认只返回 `clean` - (`AND j.review_status = 0`),`needs_review` 只进入内部 token 保护的复核面 - (`GET /internal/jobs/review-queue`、`POST /internal/jobs/review/{id}`、 - `POST /internal/jobs/review/backfill`);列表响应新增 `source_url`,并支持 - `education_max` / `job_nature` / `deadline_before` / `deadline_after` 过滤与 - `sort`(`created_desc` / `deadline_asc` / `education_asc`);描述长度按 UTF-8 - 字节硬上限 48 KiB,超限走可诊断的拒绝/复核,绝不静默截断。 -- 画像候选数据(0015 Phase A):`profiles.education_level` / `graduation_year` / - `campus_status` 三个可空列(NULL = 未知,无回填);简历 PDF 文本状态是**派生**值 - (`ok` / `text_empty` / `pdf_no_text` / `text_unavailable`),不新增列。 -- 可解释匹配(0015 Phase B):`rule_v1` 权重与分数口径不变; - `GET /api/v1/jobs?with_match=true` 的每行追加 7 个可加性键(`score` / - `score_version` / `matched_skills` / `missing_skills` / `reasons[]` / - `deal_breakers[]` / `deadline_urgency`),`GET /api/v1/jobs/recommended` 同样给出 - 这些匹配解释键;`with_match` 缺省时列表响应与旧版**逐字节一致**;`strict=true` 在 - 列表自身排序窗口内分页,`total` 为过滤后数量,窗口触顶时 `truncated=true`。 -- 简历定制产物(0015 Phase D):`tailor_rule_v1` 确定性中文 ATS 纯文本草稿 - (每条事实带来源标注,无法推导处是 `【请填写:…】`);机械事实门 - (`fact_check_status=2` 阻止确认);需登录的 `POST`/`GET /api/v1/resumes/artifacts`、 - `GET /api/v1/resumes/artifacts/{id}`、`POST /api/v1/resumes/artifacts/{id}/confirm`; - `confirmed_at IS NULL` = 草稿,确认只是状态变更。 - -### Python `source_adapters/` - -- **公开来源适配器(0012 / 0018)**:Greenhouse / Lever / Ashby,以及 - **nowcoder(牛客校招,0018)**,fixture 驱动,通过 - `POST /internal/jobs/source-sync` 发布观测;适配器从不直连数据库。 -- **nowcoder(0018)**:读取 `https://www.nowcoder.com/jobs/school/jobs` 的 - 免登录 SSR 列表(robots 允许 `/jobs/*`),支持 `` / `|` - 多板配置,板间最小间隔 5 秒;单次查询最多 20 条、无翻页、顺序有抖动,因此 - **始终 `complete=false`**——这是有界观测窗口,不是全量扫描。两种记录形态 - (原生岗 `ext` JSON、内推聚合岗 HTML description)均已归一化;不再依赖 - “聚合详情页无 SSR”的旧判断。来源登记与 2026-10-19 证据见 - [`source_adapters/README.md`](source_adapters/README.md)。 -- **0014 采集框架**:robots.txt 逐路径判定(fail-closed)、Crawl-delay 下限、 - 有界重试与退避、每次请求超时、诚实 User-Agent、charset 优先级 - (BOM > header > meta > utf-8)、HTML/JSON-LD/RSS/sitemap/JSON 解析、SSRF 守卫 - (含重定向目标与 DNS 复查)、响应体积上限、总请求预算与页数上限 - (触顶即 `complete=false`)、薪资只发布「月薪千元」可确定形态、F13 北京时间 - 截止时间归一化。 -- **人工采集(0014 Step 6,可用)**:浏览器书签小工具只读取当前已登录页面 - (无凭据、不发任何网络请求)→ 剪贴板 JSON;本机 publisher - `python -m jobpilot_sources publish-capture` 复用既有 - `POST /internal/jobs/import`(`source="manual"`),失败可诊断且绝不误报成功。 - -### Python 离线工具(`tools/`,仅标准库) - -- **只读岗位匹配报告(0015 Phase C,可选)**:`tools/job_report/render_report.py` - 只渲染公开接口**已经返回**的内容——不重新打分、不重新排序、不补数据、不写数据库、 - 不新增服务端接口——输出**单个自包含 HTML**(内联 CSS、无外部资源、无脚本);行序 = - API 返回顺序 + 位置 `rank`,每行保留原始岗位链接,没有 `reasons[]` 的行显示显式标记 - `无匹配理由`。`--input` 模式零网络 I/O,`--url` 模式只发一次带既有 Bearer token 的 - `GET`。用法见 [`tools/job_report/README.md`](tools/job_report/README.md)。 -- **禁止投递路径检查(0015 Phase D)**:`tools/checks/no_submission_path.py` - 全树扫描自动投递/自动提交类标识符与语义化路由,退出码 0 = 未发现(1 = 有发现)。 - -### 0014 关键契约(已实现并有测试) - -- **F13 截止时间**:中国招聘截止时间按北京时间(`Asia/Shanghai`,固定 UTC+8) - 解释,绝不用服务器本地时区;来源只给日期时按「北京正午 → UTC `04:00:00`」 - 存储并置 `deadline_date_only=true`,读回按北京日期渲染(不渲染成正午到期时刻); - 来源给了具体时刻则保留真实瞬时;类型未知保持 `NULL` 不臆造。权威约定见 - [`docs/03-database-design.md`](docs/03-database-design.md) §9.1。 -- **F14 人工优先**:`source-sync` 观测命中 `source='manual'` 行时整条跳过 - (不改任何列、不改 `source`、不动 freshness、不替换技能要求、不关闭), - 并在响应里给出 `skipped_manual` / `skipped_manual_urls`。 -- **既有库迁移**:`jobs` 新增 6 列(全部可空、无回填,含 - `deadline_date_only`)+ 0 索引;`docs/03` §9.4 的 ALTER 已在 pre-0014 库上实跑并 - 用同一套 schema 断言复验。 - -## 未实现 / 非目标(不要误读为已具备) - -- **国内来源只有 nowcoder(0018)一个,且是有界窗口**。0014 Step 5 的国聘/清华 - 结论仍是环境受限:国聘岗位列表只能通过客户端签名访问;清华列表主机 - `career.cic.tsinghua.edu.cn` 的 `robots.txt` 持续 503。0018 另行复核了牛客 - `/jobs/school/jobs`(免登录、robots 允许、SSR),并将其注册为 `nowcoder`; - 但单次最多 20 条、无翻页、顺序抖动,**`complete=false` 是强制的**,不得描述为 - “全量扫描”。其他国内来源仍未注册;当前 allowlist 为 - `greenhouse` / `lever` / `ashby` / `nowcoder`。证据: - [`source_adapters/README.md`](source_adapters/README.md) 的「来源登记表」、 - [`cn_source_probe_2026-10-09.json`](source_adapters/jobpilot_sources/tests/fixtures/cn_source_probe_2026-10-09.json) - 与 - [`cn_source_probe_2026-10-19.json`](source_adapters/jobpilot_sources/tests/fixtures/cn_source_probe_2026-10-19.json)。 -- **不自动化登录墙**:不做自动登录、绕 CAPTCHA、伪造 cookie/UA、代理池;登录墙岗位 - 只允许人工采集(书签小工具)。 -- **不做通用爬虫/自动投递**:没有通用 HTML 爬虫、没有自动投递、没有 RabbitMQ / - Gateway / SaaS RBAC。0015 的定制简历产物同样只有草稿与人工确认,**没有任何投递/ - 发送端点**(全树检查:`tools/checks/no_submission_path.py`)。 -- **0015 不做 LLM 措辞润色**:D6(ai_worker 的 `resume_optimize` 措辞通道)按所有者 - 决定延后(0015 计划 §17),`generator='rule_v1'` / `source_version='tailor_rule_v1'` - 是唯一生成器,不需要 AI key。 -- **截止时间不驱动生命周期**:`deadline` 只是展示字段,本阶段没有「过期自动关闭」 - 或过期提示;过期的岗位仍然可见(已知可见性限制)。 -- **书签小工具的发布链路已在真实采集样本上完成端到端验收(审核路径)**。离线测试(node + - fixture)覆盖提取逻辑;在真实登录墙岗位页(Edge)运行可生成 JSON,且未观察到书签发起的网络 - 请求——该请求侧观察是**一次运行的结果**,不构成形式化安全证明,「无网络请求、无凭据」 - 以代码与离线测试为准。`tools/dev/capture-acceptance.sh` 现在覆盖两条路径:干净样本必须 - 变成公开可见的岗位;被 0015A 预检路由到审核队列的真实样本则在隔离栈上完成 - dry-run → 导入 → 审核队列 → 数据库 → 公共可见性逐项断言(11 项,`CAPTURE_ACCEPTANCE_OK`), - 并且**不会**出现在公共列表、搜索或按 id 详情里。 - 该真实样本仍在审核队列中(`resolution=open`):它的 `company` 取到的是平台名、 - `description` 混入了导航/推荐岗位/页脚,因此需要人工复核后再决定是否公开——这类未经清洗的 - 真实岗位不应被当作可直接展示的数据。验证范围与限制见 - [`docs/exec-plans/completed/0014-china-campus-sources-and-manual-capture.md`](docs/exec-plans/completed/0014-china-campus-sources-and-manual-capture.md) - §19.6。 - -## 技术栈 - -### Backend - -- C++17、CMake、Conan - -### Infrastructure - -- MySQL 8.0、Redis 7、Docker Compose - -### Libraries - -- spdlog、yaml-cpp、nlohmann/json、hiredis、GoogleTest -- Python 侧(`source_adapters/`、`ai_worker/`):标准库 + PyYAML;`tools/` 仅标准库 - -## 项目结构 - -```text -JobPilotAI -├── backend/ # jobpilot_core:网络/HTTP、config/logging、DB、cache -├── service/ # jobpilot_service_core + 可运行服务与测试 -│ ├── config/config.yaml -│ ├── include/jobpilot/service/ -│ ├── src/ -│ └── tests/ -├── source_adapters/ # Python 采集:公开来源适配器 + 0014 框架 + 人工采集 -├── ai_worker/ # 0013 可选 AI worker(Python) -├── tools/ # 离线工具:0015 Phase C 只读岗位报表 + 禁止投递路径检查 -├── database/schema/ # MySQL 初始化脚本 -├── docs/ # 03 数据库 / 04 API / ADR / ExecPlan / ai agent 规则 -│ └── guides/local-demo.md # 0022 本地 Web UI 演示与故障排查 -├── web/ # 0022 原生 HTML/CSS/JS UI(无构建步骤) -├── docker/ # 0022 nginx 静态托管配置 -├── docker-compose.yml -├── CMakeLists.txt # 统一开发者入口(root preset) -├── CMakePresets.json -└── .env.example -``` +See [`docs/quality/README.md`](docs/quality/README.md) for presets, test levels, +and sanitizer runs. The binary is +`build/presets/release/service/jobpilot_service`. -## 构建与验证 +### Manual setup and the nginx fallback -依赖先由 `tools/dev/bootstrap.sh` 解析(完整流程见上面的英文 Quick Start): +If you prefer to manage the services yourself: ```bash -tools/dev/bootstrap.sh # 生成 service/build/conan_toolchain.cmake(已忽略提交) -cmake --preset debug && cmake --build --preset debug -ctest --preset release -L job # 受影响标签;L4 见 docs/ai/agent-workflow.md +cp .env.example .env # set MYSQL_ROOT_PASSWORD and MYSQL_PASSWORD +docker compose up -d # MySQL + Redis +docker compose --profile app build backend +docker compose --profile app --profile web up -d +``` -# 0015 Phase C 只读报表(标准库) -python3 -m unittest discover -s tools/job_report/tests -v +If `nginx:1.27-alpine` cannot be pulled, the same `web/` files can be served by +the Python standard-library runner: -# Python 采集与人工采集 -cd source_adapters && python3 -m unittest discover -s jobpilot_sources/tests -t . -python3 -m jobpilot_sources capture-bookmarklet --html # 人工采集小工具 +```bash +python3 tools/dev/web_static_proxy.py \ + --root web --port 8081 --backend http://127.0.0.1:8080 ``` -- 验证等级与何时测试:[`docs/ai/agent-workflow.md`](docs/ai/agent-workflow.md)。 -- 数据库契约:[`docs/03-database-design.md`](docs/03-database-design.md)。 -- API 契约:[`docs/04-api-design.md`](docs/04-api-design.md)。 -- 当前阶段与下一步:[`docs/ai/project-state.md`](docs/ai/project-state.md)。 +`tools/dev/demo-up.sh` performs this fallback automatically. See the +[local demo guide](docs/guides/local-demo.md) for troubleshooting. + +## Try the demo + +1. Register a local account. +2. Open the application status board, go to resume setup, and upload a PDF, TXT, + or Markdown resume. A resume version is required before a job can be + favourited. +3. Open the jobs view and search for `C++`; try the location, salary, education, + job-nature, and sort filters. +4. Open a result and read the match score, matched and missing skills, + `reasons`, and `deal_breakers`. Matching is deterministic and needs no AI + key. +5. Favourite the job. On the status board, move it through the application state + machine (favourite, to apply, applied, written test, interviews, offer) or + mark it rejected. +6. Use the apply-link button when an apply URL exists, otherwise use the + original-announcement button. These links open the original page in a new + tab; JobPilotAI does not fill in or submit an application. + +The demo user, resume, and jobs are local fixtures. Do not use real credentials +or personal resumes in a shared environment. + +## How to use + +### Collect or import jobs + +JobPilotAI reads public, login-free sources through Python source adapters: +Greenhouse, Lever, Ashby, and nowcoder for China campus listings. Adapters +publish observations through the token-protected internal API and never write +to the database directly. A manual-capture bookmarklet is available for pages +behind a login wall; it reads the page the user already has open and does not +send credentials or make network requests. A manual import endpoint also +accepts a JSON batch. + +The source adapters are documented in +[`source_adapters/README.md`](source_adapters/README.md), including the source +register, robots handling, and per-source limits. Treat a `complete=false` +observation as a bounded sample, not a full crawl. + +### Search, filter, and rank + +The public job list supports pagination, keyword search, salary and skill +filters, location and education filters, deadline filters, and sorting. Signed-in +users can request the recommended view. Only jobs that passed the intake quality +gate are visible publicly; rows that need review stay behind the internal +review surface. + +### Read the match explanation + +`rule_v1` is a deterministic ranking and explanation model. It returns a score, +matched and missing skills, additive `reasons`, `deal_breakers`, and deadline +urgency. There is no hidden LLM step in this path. The AI task pipeline is +optional and cannot overwrite the deterministic score. + +### Prepare a resume draft + +The resume tailor produces a deterministic plain-text ATS draft with source +annotations for each factual claim; unknown facts remain explicit placeholders. +A mechanical fact gate must pass before a draft can be confirmed. This is a +draft workflow, not an automatic application generator. + +### Track applications and apply manually + +Favourites and application status changes are recorded in the local database. +The backend enforces the status state machine. When it is time to apply, open +the original posting or the explicit apply link and complete the application in +the browser. There is no auto-submit, form-filling, or notification path. + +All demo data stays in local Docker volumes. Network access happens only when +you run a source adapter or configure an optional AI provider. + +## What's included + +- **Source ingestion** — public ATS adapters, a nowcoder campus source, manual + capture, JSON import, source observations, freshness, and an intake quality + gate. +- **Search and ranking** — keyword and structured filters, stable pagination, a + recommended view, and deterministic `rule_v1` scoring. +- **Explainable matching** — scores, matched and missing skills, reasons, + deal-breakers, and deadline urgency on the job list and detail pages. +- **Resume tailoring** — deterministic ATS drafts with source annotations and a + fact-check gate. +- **Application tracking** — favourites, a validated status state machine, + statistics, and a local status board. +- **Local Web UI** — native HTML/CSS/JavaScript with no build step, same-origin + `/api` and `/health` proxying, and a stdlib fallback when nginx is unavailable. +- **Optional AI worker** — a Python worker for task-based assistance; the core + product degrades gracefully without a provider key. +- **Operational tooling** — Docker Compose, a committed container image + definition, CI, sanitizer presets, benchmark harnesses, a release preflight, + and a check that no submission path exists. + +## Verification + +The release-readiness baseline recorded on 2026-10-21: + +- **312 C++ tests** through CTest. The Debug, ASan, and UBSan runs each + completed `312/312` with zero failures and zero sanitizer diagnostics. One + review-backfill test is skipped on the developer database and passes on the + isolated scratch database. +- **TSan**: 52/52 harness tests and 17/17 external-runtime tests, with zero + diagnostics. TSan does not cover the entire suite. +- **Python**: 481 source-adapter tests and 190 AI-worker tests pass in their + pinned environment. +- **CI**: the `ci` and `image` workflows were green on `main` after the + release-readiness merge. The image workflow builds the committed Dockerfile + and runs an end-to-end demo gate. +- **Benchmark** on a 4-vCPU host: 13.4–16.1k requests/second on `/health` and + 180–194 requests/second on the database-backed jobs endpoint. These are + host-specific measurements, not a service-level objective or a pass/fail + threshold. Environment and raw results are in + [`docs/benchmarks/README.md`](docs/benchmarks/README.md). + +## Limits and non-goals + +- **China source coverage is narrow.** nowcoder is the only registered China + campus source. It reads a bounded login-free list: at most 20 rows per query, + no pagination, and always `complete=false`. Other China sources are not + registered. +- **Some postings have no apply URL.** Greenhouse and nowcoder aggregated rows + do not expose a source-provided `apply_url`; the UI falls back to the original + announcement. It never derives or guesses an apply URL. Moka has not been + verified and is not registered. +- **Login walls are not bypassed.** There is no automatic login, CAPTCHA + bypass, cookie or user-agent spoofing, or proxy pool. Login-walled jobs use + manual capture only. +- **No automatic application.** There is no auto-apply, auto-submit, form + filling, or notification path. There is also no general-purpose crawler, + message queue, API gateway, or SaaS RBAC. +- **Deadlines are display-only.** An expired deadline does not automatically + close a job. +- **The UI is a local demo.** Authentication uses HTTP and browser + `localStorage`, not production authentication or TLS. +- **No legal conclusion.** Source terms, robots directives, and data-use rules + remain the operator's responsibility. + +## Documentation + +- [Documentation map](docs/README.md) and + [project documentation index](docs/PROJECT_DOCUMENTATION_INDEX.md) +- [Local Web UI guide](docs/guides/local-demo.md) +- [Architecture](docs/architecture/open-source-mvp.md) and + [architecture decisions](docs/adr/README.md) +- [API contract](docs/04-api-design.md) and + [database contract](docs/03-database-design.md) +- [Source adapters](source_adapters/README.md) and + [benchmarks](docs/benchmarks/README.md) + +## Contributing and security + +Read [`CONTRIBUTING.md`](CONTRIBUTING.md) before opening a pull request. Report +security issues privately as described in [`SECURITY.md`](SECURITY.md); do not +open a public issue for a vulnerability. A code of conduct is deferred until a +reporting channel is available. + +## License + +MIT. See [`LICENSE`](LICENSE) and [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md). diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 0000000..6db85e0 --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,211 @@ +# JobPilotAI + +[English](README.md) | 简体中文 + +JobPilotAI 是一个自托管的求职工作台:基于 C++17 后端采集和检索公开招聘信息, +以确定性规则解释岗位匹配,并跟踪求职进度。可选的 AI Worker 提供任务型辅助; +核心流程不需要配置 AI 服务商或 API Key。 + +| 带可解释匹配的岗位详情 | 申请状态板 | +|---|---| +| ![岗位详情,展示基于规则的匹配分数与理由](docs/images/web-detail.png) | ![申请状态板,包含简历上传与投递跟踪](docs/images/web-status.png) | + +截图展示的是使用合成演示数据的本地 Web UI,当前界面文案为中文。 + +## 快速开始 + +前置条件:Docker Engine 与 Compose v2、`curl`、Python 3。首次运行会构建后端 +镜像,Docker 需要能够拉取基础镜像并完成构建。 + +```bash +git clone https://github.com/cjs1102/JobPilotAI.git +cd JobPilotAI +./tools/dev/demo-up.sh +``` + +启动脚本会: + +- 检查 Docker、Compose、`curl` 和 Python; +- 仅在 `.env` 不存在时生成包含随机 MySQL 密码和内部令牌的 `.env`,权限设为 + `0600`,且不打印任何密钥值;已存在的 `.env` 不会被修改; +- 启动 MySQL 8 和 Redis 7,构建并启动后端,在 `8081` 端口提供 Web UI:可用 + `nginx:1.27-alpine` 时使用 nginx,否则使用仓库内置的 Python 静态文件/反向代理 + 服务; +- 默认导入 12 条合成岗位,并打印类似 + `DEMO_READY url=http://127.0.0.1:8081` 的地址。 + +打开打印出的地址即可。后端默认位于 `http://127.0.0.1:8080`。加上 `--no-seed` +可以不导入示例岗位。可通过 `DEMO_API_PORT`、`DEMO_WEB_PORT`、`DEMO_MYSQL_PORT`、 +`DEMO_REDIS_PORT` 和 `DEMO_PROJECT` 覆盖端口与 Compose 项目名。 + +停止演示环境: + +```bash +docker compose --env-file .env -p jobpilot-demo --profile app --profile web down +``` + +只有在需要同时删除演示数据库和上传文件时,才加 `-v`。 + +### 从源码构建(可选) + +一条命令演示使用的是容器化后端。如果需要直接构建并运行 C++ 服务,请先安装 +C++17 工具链、CMake、`pkg-config` 和 MySQL 客户端开发文件,然后执行: + +```bash +tools/dev/bootstrap.sh # 解析固定的 Conan 依赖图 +cmake --preset release +cmake --build --preset release -j"$(nproc)" +``` + +Preset、测试等级和 Sanitizer 运行方式见 +[`docs/quality/README.md`](docs/quality/README.md)。二进制位于 +`build/presets/release/service/jobpilot_service`。 + +### 手动启动与 nginx 回退 + +如果希望自行管理各服务: + +```bash +cp .env.example .env # 填写 MYSQL_ROOT_PASSWORD 和 MYSQL_PASSWORD +docker compose up -d # MySQL + Redis +docker compose --profile app build backend +docker compose --profile app --profile web up -d +``` + +如果无法拉取 `nginx:1.27-alpine`,可以用 Python 标准库运行器提供同一套 `web/` +文件: + +```bash +python3 tools/dev/web_static_proxy.py \ + --root web --port 8081 --backend http://127.0.0.1:8080 +``` + +`tools/dev/demo-up.sh` 会自动执行这一回退。故障排查见 +[本地演示指南](docs/guides/local-demo.md)。 + +## 体验演示 + +1. 注册一个本地账号。 +2. 打开 **申请状态板 → 简历设置**,上传 PDF、TXT 或 Markdown 简历。收藏岗位前 + 必须先有一个简历版本。 +3. 打开 **岗位**,搜索 `C++`,并尝试地点、薪资、学历、岗位性质和排序筛选。 +4. 打开一个岗位,查看匹配分数、命中与缺失技能、`reasons` 和 + `deal_breakers`。匹配是确定性的,不需要 AI Key。 +5. 收藏该岗位。在 **申请状态板** 中按后端状态机推进:收藏、待投递、已投递、 + 笔试、面试、Offer,或标记为拒绝。 +6. 有申请链接时点击 **打开申请链接**,否则点击 **打开原始公告**。链接只会在新 + 标签页打开原始页面,JobPilotAI 不会代填或提交申请。 + +演示用户、简历和岗位均为本地合成数据。不要在共享环境中使用真实凭据或个人简历。 + +## 使用方式 + +### 采集或导入岗位 + +JobPilotAI 通过 Python 来源适配器读取公开、免登录的来源:Greenhouse、Lever、 +Ashby,以及面向国内校招的 nowcoder。适配器通过受内部令牌保护的接口发布观测, +不直接写数据库。对于登录墙后的页面,可以使用人工采集书签小工具;它只读取用户 +已经打开的页面,不发送凭据,也不发起网络请求。此外还提供 JSON 批量导入接口。 + +来源适配器、来源登记表和每个来源的限制见 +[`source_adapters/README.md`](source_adapters/README.md)。`complete=false` 的 +观测应视为有界样本,而不是全量抓取。 + +### 搜索、筛选与排序 + +公开岗位列表支持分页、关键词搜索、薪资与技能筛选、地点与学历筛选、截止时间 +筛选和排序。登录用户可以查看推荐视图。只有通过入库质量门禁的岗位才会公开可见; +需要复核的记录保留在内部复核界面。 + +### 阅读匹配解释 + +`rule_v1` 是确定性的排序与解释模型,返回分数、命中与缺失技能、可加性的 +`reasons`、`deal_breakers` 和截止时间紧迫度。该路径没有隐藏的大模型步骤。 +AI 任务管线是可选的,且不能覆盖确定性分数。 + +### 生成简历草稿 + +简历定制功能会生成确定性的纯文本 ATS 草稿,每一条事实都带来源标注;无法推导 +的事实保留为显式占位符。草稿必须通过机械事实门禁才能确认。这是草稿工作流, +不是自动投递生成器。 + +### 跟踪投递并手动申请 + +收藏和投递状态变更会记录在本地数据库,后端会校验状态机。需要申请时,打开原始 +公告或显式提供的申请链接,在浏览器中手动完成申请。系统没有自动提交、代填表单 +或通知路径。 + +所有演示数据都保存在本地 Docker 卷中。只有运行来源适配器或配置可选 AI 服务商时 +才会发生网络访问。 + +## 已包含的能力 + +- **来源采集**:公开 ATS 适配器、nowcoder 校招来源、人工采集、JSON 导入、来源 + 观测、时效性与入库质量门禁。 +- **搜索与排序**:关键词与结构化筛选、稳定分页、推荐视图,以及确定性 + `rule_v1` 评分。 +- **可解释匹配**:列表与详情中的分数、命中与缺失技能、理由、否决项和截止时间 + 紧迫度。 +- **简历定制**:带来源标注和事实校验的确定性 ATS 草稿。 +- **投递跟踪**:收藏、经后端校验的状态机、统计信息和本地状态板。 +- **本地 Web UI**:原生 HTML/CSS/JavaScript,无构建步骤;同源代理 `/api` 和 + `/health`,nginx 不可用时自动回退到标准库服务。 +- **可选 AI Worker**:Python 任务型辅助;没有服务商密钥时核心产品仍可正常使用。 +- **工程与运维工具**:Docker Compose、已提交的容器镜像定义、CI、Sanitizer + Preset、基准测试、发布预检,以及禁止自动投递路径的检查。 + +## 验证情况 + +2026-10-21 记录的发布准备基线: + +- **312 个 C++ 测试**(通过 CTest)。Debug、ASan、UBSan 各完成 `312/312`, + 无失败且没有 Sanitizer 诊断。一个复核回填测试在开发数据库上跳过,在隔离的 + 临时数据库上通过。 +- **TSan**:测试框架 52/52,外部运行时 17/17,均无诊断。TSan 不覆盖完整测试集。 +- **Python**:来源适配器 481 个测试、AI Worker 190 个测试,在固定依赖环境中 + 全部通过。 +- **CI**:发布准备合并后,`main` 上的 `ci` 和 `image` 工作流均为绿色。镜像 + 工作流会构建已提交的 Dockerfile,并运行端到端演示门禁。 +- **基准测试**:在 4 vCPU 主机上,`/health` 为 13.4–16.1k 请求/秒,数据库支撑的 + 岗位接口为 180–194 请求/秒。这些是特定主机上的测量值,不是服务等级目标,也 + 不是通过/失败阈值。环境说明与原始结果见 + [`docs/benchmarks/README.md`](docs/benchmarks/README.md)。 + +## 限制与非目标 + +- **国内来源覆盖范围有限。** nowcoder 是目前唯一注册的国内校招来源,只读取 + 免登录的有界列表:单次查询最多 20 条,不翻页,且始终 `complete=false`。 + 其他国内来源尚未注册。 +- **部分岗位没有申请链接。** Greenhouse 与 nowcoder 聚合岗不提供来源侧的 + `apply_url`,界面会回退到原始公告。系统不会推导或猜测申请链接。Moka 尚未 + 验证,也未注册。 +- **不绕过登录墙。** 系统不做自动登录、验证码绕过、Cookie 或 User-Agent 伪造, + 也不使用代理池。登录墙后的岗位只能通过人工采集处理。 +- **不自动投递。** 没有自动申请、自动提交、表单代填或通知路径,也没有通用爬虫、 + 消息队列、API 网关或 SaaS RBAC。 +- **截止时间仅用于展示。** 截止时间过期不会自动关闭岗位。 +- **界面是本地演示。** 认证基于 HTTP 和浏览器 `localStorage`,不是生产级认证, + 也没有 TLS。 +- **不构成法律结论。** 来源条款、robots 指令和数据使用规则仍由运营者负责。 + +## 文档 + +- [文档地图](docs/README.md)与 + [项目文档索引](docs/PROJECT_DOCUMENTATION_INDEX.md) +- [本地 Web UI 指南](docs/guides/local-demo.md) +- [架构说明](docs/architecture/open-source-mvp.md)与 + [架构决策](docs/adr/README.md) +- [API 契约](docs/04-api-design.md)与 + [数据库契约](docs/03-database-design.md) +- [来源适配器](source_adapters/README.md)与 + [基准测试](docs/benchmarks/README.md) + +## 贡献与安全 + +提交 Pull Request 前请阅读 [`CONTRIBUTING.md`](CONTRIBUTING.md)。安全漏洞请按 +[`SECURITY.md`](SECURITY.md) 中的方式私下报告,不要创建公开 Issue。行为准则 +暂缓,待有可用的报告渠道后再补充。 + +## 许可证 + +MIT。见 [`LICENSE`](LICENSE) 与 [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md)。 diff --git a/docs/CLAUDE_CODE_HANDOFF.md b/docs/CLAUDE_CODE_HANDOFF.md index 9263b72..72ba8b1 100644 --- a/docs/CLAUDE_CODE_HANDOFF.md +++ b/docs/CLAUDE_CODE_HANDOFF.md @@ -169,6 +169,15 @@ Status vocabulary: `DONE` (works, verified) · `PARTIAL` · `FRAMEWORK_ONLY` · > is historical. 0019 recorded the 2026-10-19 dry-run: Greenhouse **232**, > Lever **10**, Ashby **167**, all `board_complete=True`; raw log > `build/0019/ats-live-smoke.log`. +> +> **Correction 2026-10-21 (0025), row 9:** the “real capture still +> `resolution=open`” sentence is historical. The 2026-10-21 check of the dev +> `jobpilot-mysql` database found **0** `job_review_items` (0 open), **0** jobs +> with `review_status <> 0`, and four jobs that are all DAO test fixtures +> (`source_url` `job-dao-*`), not the real capture. No real capture sample is +> retained in the dev database, so no reject/delete action applied. See +> `docs/ai/project-state.md` `## Active Plan (0025)` and +> `build/0025/capture-retention-check.txt` (ignored). ## 6. 已完成的重要工作(有证据的) @@ -218,6 +227,14 @@ Status vocabulary: `DONE` (works, verified) · `PARTIAL` · `FRAMEWORK_ONLY` · human should decide whether it becomes public (its `company` is the platform name and its `description` contains page chrome). + > **Resolved 2026-10-21 (0025):** the current dev database contains no real + > capture sample and no open review item; the four remaining jobs are DAO + > test fixtures. Nothing was retained, so there is no sample to reject or + > delete. This item is closed for the current environment; if a future real + > capture is imported, the no-retention rule still requires an explicit + > review decision (reject keeps the row for audit; deleting is a separate + > explicit action). + ## 8. 已知 Bug No confirmed, open functional bug is known at this baseline. For the record, the diff --git a/docs/PROJECT_DOCUMENTATION_INDEX.md b/docs/PROJECT_DOCUMENTATION_INDEX.md index 1263b10..ca3539e 100644 --- a/docs/PROJECT_DOCUMENTATION_INDEX.md +++ b/docs/PROJECT_DOCUMENTATION_INDEX.md @@ -1,9 +1,10 @@ # JobPilotAI Project Documentation Index -Maintained for the Claude Code handoff (2026-10-11). It answers one question per -document: **what is this, who should read it, and is it still true?** When a -document disagrees with the code, the row says so and the disagreement is -recorded in §12 instead of being silently "fixed". +Maintained for the Claude Code handoff; refreshed 2026-10-21 for the README and +demo tooling. It answers one question per document: **what is this, who should +read it, and is it still true?** When a document disagrees with the code, the +row says so and the disagreement is recorded in §12 instead of being silently +"fixed". Status vocabulary used below: @@ -16,7 +17,8 @@ Status vocabulary used below: ## 0. Reading order for a new contributor or agent -1. `README.md` — what the project is, how to run it. +1. `README.md` / `README.zh-CN.md` — what the project is, the one-command demo, + and how to use it. 2. `AGENTS.md` — the project's hard constraints, P1 freeze, task routing. 3. `docs/CLAUDE_CODE_HANDOFF.md` — the current state, gaps and the protocol for the first phase (the document you are likely to need next). @@ -32,7 +34,9 @@ Status vocabulary used below: | Path | Document | Purpose | Audience | Validity | Related code | |---|---|---|---|---|---| -| `README.md` | Project README | What the project is, English Quick Start, current capabilities, explicit non-goals, contracts (F13/F14), build/verify commands | Everyone, first file to read | `CURRENT` | whole repo | +| `README.md` | Project README (English) | What the project is, two screenshots, one-command Quick Start, demo flow, usage, verification, limits, community links | Everyone, first file to read | `CURRENT` (2026-10-21) | whole repo | +| `README.zh-CN.md` | Chinese README | Chinese mirror of the English README with the same sections, screenshots and commands; no mixed-language paragraphs | Chinese-speaking users and contributors | `CURRENT` (2026-10-21) | whole repo | +| `docs/images/` | README screenshots | `web-detail.png` (explainable match) and `web-status.png` (application board), both 1366×682 from the local UI with synthetic data | Everyone | `CURRENT` (2026-10-21; regenerated with the browser smoke after the temporary originals were removed) | `web/`, `tools/dev/web-smoke.sh` | | `AGENTS.md` | Project Guide | Hard constraints (dependency direction, P1 freeze, secrets, JSON/SQL/RAII rules), task routing, verification policy | Every agent/contributor | `CURRENT` | whole repo | | `.agents/skills/jobpilot-reactor-review/SKILL.md` | Reactor review skill | Mandatory checklist before touching `backend/{include,src}/jobpilot/{network,http}/` | Anyone changing the network layer | `CURRENT` | `backend/src/network`, `backend/src/http` | | `SECURITY.md` | Security policy | Supported versions, private reporting, local-demo boundaries, no-secrets policy, A history disclosure (facts only) | Everyone, release reviewer | `CURRENT` (2026-10-20) | `tools/checks/` | @@ -47,7 +51,7 @@ Status vocabulary used below: |---|---|---|---|---|---| | `docs/ai/README.md` | AI context router | Which document to read for which task; diff-first reading policy | Agents | `CURRENT` | — | | `docs/ai/agent-workflow.md` | Agent workflow and verification rules | Verification levels L1–L5, when a suite may run, harness prerequisites, one review per stage | Agents | `CURRENT` | `build/l4-0017/` (scratch harness) | -| `docs/ai/project-state.md` | Current project state (959 lines) | Stage-by-stage state, carried-forward items, what is genuinely open | Agents, maintainer | `CURRENT` (updated 2026-10-21) | whole repo | +| `docs/ai/project-state.md` | Current project state (1011 lines) | Stage-by-stage state, carried-forward items, what is genuinely open | Agents, maintainer | `CURRENT` (updated 2026-10-21) | whole repo | | `docs/ai/CURRENT_STATE.md` | Handoff verification report (2026-10-19) | Git/CI facts, §23 fact checklist, document-code conflicts, capability-matrix update; 2026-10-20 resolution note | Agents, maintainer, release reviewer | `CURRENT` (dated 2026-10-19; point-in-time report plus dated resolution note) | whole repo | | `docs/ai/archive/next-phase-plan-2026-10.md` | Archived next-phase plan | An earlier plan sketch; kept for context | Agents | `REFERENCE` (archived) | — | | `docs/ai/references/github_resources.md` | GitHub resource research | 655-line survey used for the open-source plan | Maintainer | `REFERENCE` | — | @@ -77,7 +81,7 @@ Status vocabulary used below: |---|---|---|---|---|---| | `docs/04-api-design.md` | API contract (1428 lines) | Every route, request/response, error codes, internal token contract, public visibility rule (updated 2026-10-11), source-registration contract, reserved-route markers and route counts (2026-10-20) | Anyone changing an API | `CURRENT` | `service/src/*/*_controller.cpp`, `service/src/router.cpp` | | `docs/03-database-design.md` | Database contract (834 lines) | Tables, columns, indexes, F13 deadline rule, 0015A quality status, current 13-table DDL, migration notes (§9.4) | Anyone changing the schema | `CURRENT` | `database/schema/0*.sql` | -| `docs/guides/local-demo.md` | Local Web UI demo guide | Dependencies, nginx/Python-fallback startup, demo flow, resume prerequisite, screenshots, troubleshooting, security boundary | Users, reviewers, maintainers | `CURRENT` (2026-10-20) | `web/`, `docker/nginx/`, `tools/dev/web-smoke.sh` | +| `docs/guides/local-demo.md` | Local Web UI demo guide | Dependencies, one-command launcher, nginx/Python-fallback startup, demo flow, resume prerequisite, screenshots, troubleshooting, security boundary | Users, reviewers, maintainers | `CURRENT` (2026-10-21) | `web/`, `docker/nginx/`, `tools/dev/demo-up.sh`, `tools/dev/web-smoke.sh` | | `database/schema/README.md` | Schema guide | How the schema files are ordered and applied | Anyone touching the DB | `CURRENT` | `database/schema/` | | `docs/06-coding-standard.md` | Coding standard | Naming, error handling, SQL, RAII, logging rules | Contributors | `CURRENT` | whole repo | | `docs/project-structure.md` | Project structure | Directory/module responsibilities | Contributors | `HISTORICAL` (Superseded banner) | — | @@ -90,7 +94,7 @@ Status vocabulary used below: | `docs/quality/test-overlap-audit.md` | Test overlap audit (0017-B) | Proof that the suite has no mergeable duplicate case; the 66 evaluated pairs; counts block read by the guard | Maintainer | `CURRENT` | `service/tests/`, `tools/checks/test_coverage_map.py` | | `docs/benchmarks/README.md` | Benchmark baseline | Recorded performance numbers and how to re-run them | Maintainer | `REFERENCE` (numbers age) | `build/` presets | | `docs/RELEASE_CHECKLIST.md` | Release checklist (333 lines) | The gate: automated checks, licence, secrets, publish-safety review, owner actions, dated evidence blocks | Release owner | `CURRENT` (dated blocks, refreshed 2026-10-11) | whole repo | -| `docs/examples/` | Example payloads | Synthetic fixtures used in docs | Contributors | `CURRENT` | — | +| `docs/examples/` | Example payloads | Synthetic fixtures used in docs, including `demo-jobs.json` (12 synthetic jobs imported by the one-command demo) | Contributors | `CURRENT` (2026-10-21) | — | ## 6. Execution plans @@ -103,6 +107,7 @@ Status vocabulary used below: | `docs/exec-plans/completed/0021-docs-reconciliation.md` | Completed plan 0021 | `docs/03`–`docs/04` reconciliation of DB-1/2/3 and API-1/2/3/4; dated handoff corrections; docs-only L0; merged at `d75b14e` after VERDICT-0021-closeout PASS | Agents, maintainer | `COMPLETED` (2026-10-20) | `docs/03`, `docs/04`, `docs/CLAUDE_CODE_HANDOFF.md` | | `docs/exec-plans/completed/0022-web-ui.md` | Completed plan 0022 | Minimal native Web UI: nginx static + same-origin proxy, auth, jobs/filter/match, detail/apply links, resume prerequisite, favourite and status board; Python fallback + Firefox smoke; merged at `38bd484` | Agents, maintainer | `COMPLETED` (2026-10-20) | `web/`, `docker/nginx/`, `tools/dev/web-smoke.sh` | | `docs/exec-plans/completed/0023-release-readiness.md` | Completed plan 0023 | Release readiness: security/contributing docs, Python locks, MariaDB client image, TSan first run, libbcrypt provenance, benchmark refresh, release-checklist state; merged at `539202f` after the exclusive benchmark rework | Agents, maintainer, release reviewer | `COMPLETED` (2026-10-21) | `SECURITY.md`, `CONTRIBUTING.md`, `Dockerfile`, `backend/benchmarks/` | +| `docs/exec-plans/active/0025-readme-and-usage.md` | Active plan 0025 | External-facing English README plus a separate Chinese mirror, two real UI screenshots, one-command demo launcher/seed, 12-job fixture, docs index/state; L0 + shell smoke, no L4 | Agents, maintainer, release reviewer | `ACTIVE` (implementation on `docs/readme-demo`; closeout pending) | `README.md`, `README.zh-CN.md`, `tools/dev/demo-up.sh`, `tools/dev/demo-seed.sh` | | `docs/exec-plans/completed/0001…0017A` | 20 archived plans | The history of every stage, each with its evidence, decisions and L4 results. Notable: `0014` (China sources + manual capture, 1264 lines), `0015`/`0015A` (tailoring, explainable matching, quality gate), `0016` (packaging, demo gate), `0017` (ops hardening, L4), `0017A` (the `published_at` contract gap) | Agents needing the "why" | `HISTORICAL` by definition, but each is the **authority for its stage's decisions** | the module named in each plan | ## 7. Ingestion, sources and tools @@ -142,10 +147,11 @@ Status vocabulary used below: | Path | Why it is needed | Suggested content | |---|---|---| -| `SECURITY.md` | Anything that becomes public needs a disclosure channel | Supported versions, how to report privately, no-secrets policy | -| `CONTRIBUTING.md` | External contributors need the rules — today they live inside `AGENTS.md`, which is agent-oriented | Build/verify commands, commit style, PR expectations, the P1 freeze | -| `CODE_OF_CONDUCT.md` | Optional for a small project; conventional for public repos | Standard contributor covenant | -| `docs/guides/` | Installation and local walkthroughs have no current home; `docs/08` is superseded and `README` is a Quick Start only | `local-demo.md`, `installation.md`, `web-ui.md` (future) | +| `CODE_OF_CONDUCT.md` | Optional for a small project; conventional for public repos | Standard contributor covenant; deferred until a reporting channel exists | + +`SECURITY.md`, `CONTRIBUTING.md` and `docs/guides/local-demo.md` were added after +this section was first written; they are tracked in §1 and §4 and are no longer +missing. ## 11. Handoff documents added on 2026-10-11 diff --git a/docs/README.md b/docs/README.md index b76a209..3943f95 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,8 +5,9 @@ the documents below are the contracts and the evidence behind it. ## To run it -1. [`../README.md`](../README.md) — Quick Start (English) plus the list of what - actually works today, and what deliberately does not. +1. [`../README.md`](../README.md) / [`../README.zh-CN.md`](../README.zh-CN.md) — + the one-command local demo, how to use it, what works today, and what + deliberately does not. 2. [`../database/schema/README.md`](../database/schema/README.md) — create a database, upgrade an existing one, verify it, and the isolation rule for demo and test data. diff --git a/docs/ai/project-state.md b/docs/ai/project-state.md index 02a17ef..a9fefb9 100644 --- a/docs/ai/project-state.md +++ b/docs/ai/project-state.md @@ -57,6 +57,12 @@ > Next stage: **0024 owner publication** (owner-only; no worker implementation). > The release-readiness work is merged; A history disclosure remains > accepted/no-rewrite. Wait for the owner’s 0024 instruction; do not start it. +> +> **2026-10-21 update — 0025 implementation in progress.** The plan-only PR #7 +> merged at `7acc58f`; the docs/tooling implementation is on branch +> `docs/readme-demo` and is **not merged yet**. The README rewrite, screenshots, +> one-command demo and the capture no-retention check are recorded in +> `## Active Plan (0025)` below. 0024 remains owner-only and has not started. Repository files and Git history are the cross-agent fact source. This concise state plus the active or most recent ExecPlan should be enough for a new Agent to @@ -231,6 +237,52 @@ libbcrypt upstream unresolved with SHA-256 manifest. PR image `39461251212` passed `Verify the MariaDB client linkage` (`MARIA_DB_LINK_OK`) + demo gate; main CI after merge is green (`ci` `39462589981`, `image` `39462589965`). +## Active Plan (0025) + +[`active/0025-readme-and-usage.md`](../exec-plans/active/0025-readme-and-usage.md) +— plan-only PR #7 merged at `7acc58f`; implementation is in progress on branch +`docs/readme-demo`, **not yet reviewed or merged**. Scope: external-facing +English README + separate `README.zh-CN.md`, two UI screenshots, one-command +`tools/dev/demo-up.sh`/`demo-seed.sh`, 12-job fixture, docs index/state. This is +docs + developer tooling only: no core/API/schema/CI/P1 change; L0 + shell smoke, +no L4. + +Evidence collected on the branch (2026-10-21): + +- **Screenshots**: `docs/images/web-detail.png` and `docs/images/web-status.png`, + both 1366×682 PNG. The planned `/tmp/0022-browser-final` originals were no + longer present, so they were regenerated with + `tools/dev/web-smoke.sh --browser firefox` (Python proxy fallback); the exact + original images are not recoverable. Both READMEs reference the new files. +- **README**: `README.md` is English and `README.zh-CN.md` is a separate Chinese + mirror; both have the language switch, two screenshots, one-command Quick + Start, demo flow, usage, verification, limits and community links. Stage + numbers are absent from both bodies. +- **Demo smoke** (isolated `jobpilot-demo-0025`; env + `/tmp/jobpilot-demo-0025.env`, later removed; ports 18180/18181/13326/16399; + backend image `jobpilot-backend:verify`, `DEMO_BUILD_BACKEND=0`): + `demo-up.sh` produced `DEMO_READY url=http://127.0.0.1:18181`, used the + Python proxy fallback because `nginx:1.27-alpine` was unavailable, and seeded + `total=12 created=12`. A second run preserved the `.env` byte-for-byte + (SHA-256 unchanged) and seeded `total=12 created=0 updated=12`; the page and + `GET /api/v1/jobs?page=1&page_size=20` remained reachable with `total=12`. + A `C++` keyword request returned 5 jobs. The generated `.env` was mode `0600`; + none of its generated secret values appeared in the launcher log. + `docker compose ... down -v` removed all containers, volumes and the network; + the temporary env file was deleted. Raw logs: `build/0025/` (ignored). +- **Capture sample / no retention**: the 2026-10-21 query against the dev + `jobpilot-mysql` returned `jobs_total=4`, `jobs_review_status_nonzero=0`, + `review_items_total=0`, `review_items_open=0`. All four jobs are DAO test + fixtures (`source_url` `job-dao-*`, source `manual`, `review_status=0`), not + a real capture. No real capture sample is retained in the dev database, so no + reject/delete action was applicable. The old handoff statement that the real + sample is still `resolution=open` now carries dated corrections in §5 row 9 + and §7 item 8. Raw output: `build/0025/capture-retention-check.txt` (ignored). + +Remaining for this branch: closeout request, owner-created PR/merge, and the +post-merge main CI verification. Do not archive the plan or mark this stage +completed until the owner merges it. + ## Current Stage - Architecture direction is now open-source first and self-hosted, with a diff --git a/docs/examples/demo-jobs.json b/docs/examples/demo-jobs.json new file mode 100644 index 0000000..4d85bad --- /dev/null +++ b/docs/examples/demo-jobs.json @@ -0,0 +1,190 @@ +{ + "jobs": [ + { + "company": "Example Systems", + "title": "C++ Backend Engineer", + "location": "Shenzhen", + "salary_min": 20, + "salary_max": 35, + "salary_currency": "CNY", + "description": "Build Linux backend services for a job platform. Work on HTTP APIs, data ingestion and observability.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-cpp-backend-1", + "apply_url": "https://example.invalid/apply/demo-cpp-backend-1", + "requirements": [ + { "skill": "C++", "level": 3 }, + { "skill": "Linux", "level": 2 } + ] + }, + { + "company": "Data Platform Labs", + "title": "Distributed Systems Engineer", + "location": "Shanghai", + "salary_min": 25, + "salary_max": 40, + "salary_currency": "CNY", + "description": "Design reliable services for distributed workloads. Focus on correctness, failure handling and data access.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-distributed-2", + "requirements": [ + { "skill": "C++", "level": 3 }, + { "skill": "MySQL", "level": 2 } + ] + }, + { + "company": "Northstar Quant", + "title": "C++ Trading Systems Engineer", + "location": "Beijing", + "salary_min": 30, + "salary_max": 50, + "salary_currency": "CNY", + "description": "Low-latency C++ services for market data and order routing. Linux and performance profiling are part of the daily work.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-trading-3", + "requirements": [ + { "skill": "C++", "level": 3 }, + { "skill": "Linux", "level": 3 } + ] + }, + { + "company": "Cedar Pay", + "title": "Backend Engineer, Payments", + "location": "Guangzhou", + "salary_min": 18, + "salary_max": 30, + "salary_currency": "CNY", + "description": "Build payment APIs and reconciliation jobs. The team values clear error handling and a small, auditable service surface.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-payments-4", + "apply_url": "https://example.invalid/apply/demo-payments-4", + "requirements": [ + { "skill": "C++", "level": 2 }, + { "skill": "MySQL", "level": 2 }, + { "skill": "Redis", "level": 1 } + ] + }, + { + "company": "Orbit Cloud", + "title": "Platform Engineer", + "location": "Hangzhou", + "salary_min": 22, + "salary_max": 38, + "salary_currency": "CNY", + "description": "Own platform services and developer tooling. Experience with Linux, containers and backend APIs is useful.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-platform-5", + "requirements": [ + { "skill": "C++", "level": 2 }, + { "skill": "Linux", "level": 3 } + ] + }, + { + "company": "Embedded Works", + "title": "Embedded Software Engineer", + "location": "Shenzhen", + "salary_min": 20, + "salary_max": 32, + "salary_currency": "CNY", + "description": "Develop embedded C/C++ software for connected devices. Work close to hardware, Linux and test automation.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-embedded-6", + "requirements": [ + { "skill": "C++", "level": 2 }, + { "skill": "Linux", "level": 2 } + ] + }, + { + "company": "Pixel Forge", + "title": "Game Backend Engineer", + "location": "Chengdu", + "salary_min": 18, + "salary_max": 30, + "salary_currency": "CNY", + "description": "Build game backend services for player state, matchmaking and leaderboards. Redis and latency matter here.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-game-7", + "requirements": [ + { "skill": "C++", "level": 2 }, + { "skill": "Redis", "level": 2 } + ] + }, + { + "company": "Meridian Data", + "title": "Database Infrastructure Engineer", + "location": "Shanghai", + "salary_min": 25, + "salary_max": 42, + "salary_currency": "CNY", + "description": "Operate and improve MySQL-backed services. Build safe migrations, query tooling and observability for data paths.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-database-8", + "requirements": [ + { "skill": "C++", "level": 2 }, + { "skill": "MySQL", "level": 3 }, + { "skill": "Linux", "level": 2 } + ] + }, + { + "company": "Packet Harbor", + "title": "Network Software Engineer", + "location": "Beijing", + "salary_min": 24, + "salary_max": 40, + "salary_currency": "CNY", + "description": "Work on TCP services, protocol handling and performance. The role is Linux-heavy and values careful resource ownership.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-network-9", + "requirements": [ + { "skill": "C++", "level": 3 }, + { "skill": "Linux", "level": 3 } + ] + }, + { + "company": "Bluefin Robotics", + "title": "C++ SDK Engineer", + "location": "Shenzhen", + "salary_min": 22, + "salary_max": 36, + "salary_currency": "CNY", + "description": "Design a C++ SDK used by robotics integrators. Focus on API stability, documentation and cross-platform builds.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-sdk-10", + "requirements": [ + { "skill": "C++", "level": 3 }, + { "skill": "Linux", "level": 2 } + ] + }, + { + "company": "Lumen Labs", + "title": "Backend Engineer, Growth", + "location": "Beijing", + "salary_min": 16, + "salary_max": 28, + "salary_currency": "CNY", + "description": "Build small backend services for growth experiments. Expect rapid iteration, clear metrics and careful data handling.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-growth-11", + "apply_url": "https://example.invalid/apply/demo-growth-11", + "requirements": [ + { "skill": "C++", "level": 1 }, + { "skill": "MySQL", "level": 2 } + ] + }, + { + "company": "Atlas Commerce", + "title": "Site Reliability Engineer", + "location": "Hangzhou", + "salary_min": 20, + "salary_max": 35, + "salary_currency": "CNY", + "description": "Keep commerce services reliable. Work with Linux, Redis, MySQL and service-level monitoring; C++ debugging is a plus.", + "source": "import", + "source_url": "https://example.invalid/jobs/demo-sre-12", + "requirements": [ + { "skill": "Linux", "level": 3 }, + { "skill": "C++", "level": 1 }, + { "skill": "Redis", "level": 2 } + ] + } + ] +} diff --git a/docs/exec-plans/active/0025-readme-and-usage.md b/docs/exec-plans/active/0025-readme-and-usage.md index 9dfb897..88c5de1 100644 --- a/docs/exec-plans/active/0025-readme-and-usage.md +++ b/docs/exec-plans/active/0025-readme-and-usage.md @@ -1,8 +1,8 @@ # ExecPlan 0025 — README and external usage guide -> 状态:**PLANNING(等待 VERDICT-0025-plan;批准前不改 README/图片/既有文档)** -> 分支:`docs/0025-readme-and-usage` -> 基线:`main@f788b06`(0023 merged;PR #6 `539202f`) +> 状态:**IMPLEMENTATION(closeout pending;计划已由 PR #7 合入)** +> 分支:`docs/readme-demo`(实施);计划原始分支 `docs/0025-readme-and-usage` +> 基线:`main@7acc58f`(计划 PR #7;0023 merge `539202f`) > 类型:**docs + developer demo tooling**(不碰 core/API/schema/CI);L0 + shell smoke,不跑 L4;不启动 0024。 ## 1. 背景 @@ -251,10 +251,21 @@ git diff --check ## 10. Progress ```text -P0 plan + REQUEST [x] 本文件;等待 VERDICT-0025-plan -P1 demo scripts + seed fixture [ ] 未开始 -P2 screenshots + README + one-command Quick Start [ ] 未开始 -P3 README.zh-CN [ ] 未开始 -P4 index/state [ ] 未开始 -P5 L0 + shell smoke + closeout [ ] 未开始 +P0 plan + REQUEST [x] 本文件;plan-only PR #7 merged at 7acc58f +P1 demo scripts + seed fixture [x] demo-up.sh / demo-seed.sh / 12-job fixture +P2 screenshots + README + one-command Quick Start [x] screenshots regenerated; README rewritten +P3 README.zh-CN [x] 独立中文镜像 +P4 index/state [x] docs index + project-state + handoff corrections +P5 L0 + shell smoke + closeout [~] smoke 完成;REQUEST-0025-closeout 待写 ``` + +Execution note (2026-10-21): the planned `/tmp/0022-browser-final/*.png` +originals were missing, so both screenshots were regenerated with +`tools/dev/web-smoke.sh --browser firefox` (Python proxy fallback). The exact +originals are not recoverable; the new files are 1366×682 and use the same +synthetic UI. The isolated launcher smoke used `jobpilot-demo-0025`, ports +18180/18181/13326/16399 and `jobpilot-backend:verify`; it printed +`DEMO_READY`, seeded 12 jobs, preserved `.env` on re-run, and the stack was torn +down with `down -v`. The capture no-retention check found 0 review items and +only DAO test fixtures; see `docs/ai/project-state.md` and the handoff +corrections. Closeout request is the only remaining step. diff --git a/docs/guides/local-demo.md b/docs/guides/local-demo.md index db3a988..22214c3 100644 --- a/docs/guides/local-demo.md +++ b/docs/guides/local-demo.md @@ -17,6 +17,16 @@ frontend. ## 启动(nginx 形态) +一条命令启动(缺少 `.env` 时生成随机密码,构建后端,启动 UI,并默认导入 +12 条示例岗位): + +```bash +./tools/dev/demo-up.sh +``` + +打开脚本打印的 `DEMO_READY` 地址即可;nginx 镜像不可用时脚本会自动回退到 +`web_static_proxy.py`。手动等价步骤: + ```bash cp .env.example .env # fill MYSQL_ROOT_PASSWORD and MYSQL_PASSWORD @@ -88,23 +98,23 @@ does not replace nginx in a deployment. 7. Reload the page: the resume version and applications persist; the token is re-validated with `GET /users/me`. -The sample dataset `docs/examples/job-import.json` uses `example.invalid` URLs; -they are intentionally fake. The UI does not derive an apply URL from -`source_url`. +The sample datasets `docs/examples/job-import.json` and +`docs/examples/demo-jobs.json` use `example.invalid` URLs; they are intentionally +fake. The UI does not derive an apply URL from `source_url`. ## 截图步骤(可选) Use synthetic/demo data only; do not put personal data in a screenshot. 1. Register a demo user, upload a synthetic resume, import - `docs/examples/job-import.json` through the internal token or use an - existing demo stack. -2. Capture **岗位列表** with a match score/reason, **岗位详情** with the - apply/original links, and **申请状态板** with at least one application. -3. Suggested filenames: `web-list.png`, `web-detail.png`, `web-status.png`. - The repository `.gitignore` ignores `*.png`; 0022 deliberately does **not** - add images to the README. Add owner-approved screenshots in a later change if - desired. + `docs/examples/demo-jobs.json` (or `job-import.json`) through the internal + token, or use an existing demo stack. +2. Capture **岗位详情** with the match explanation and **申请状态板** with at + least one application. +3. The two README screenshots are tracked at `docs/images/web-detail.png` and + `docs/images/web-status.png` (1366×682, synthetic data, regenerated with the + browser smoke). If you recapture them, keep the same filenames and update the + READMEs if the filenames change. 4. Use the browser/OS screenshot tool; do not include cookies, tokens, email addresses, or real resumes. diff --git a/docs/images/web-detail.png b/docs/images/web-detail.png new file mode 100644 index 0000000000000000000000000000000000000000..e2ed4aaeb969e9ee15778c45429681517537efcd GIT binary patch literal 98860 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

@L}pMqmeOVUwx%*=grDn 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�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

ZU*F*r=8Mu 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 literal 0 HcmV?d00001 diff --git a/docs/images/web-status.png b/docs/images/web-status.png new file mode 100644 index 0000000000000000000000000000000000000000..608df42b57c7cba411a5ca32791b39e008ae2f56 GIT binary patch literal 111207 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 E0CY}TJOBUy literal 0 HcmV?d00001 diff --git a/tools/dev/demo-seed.sh b/tools/dev/demo-seed.sh new file mode 100755 index 0000000..e2e4c91 --- /dev/null +++ b/tools/dev/demo-seed.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +# Seed a running demo stack with synthetic jobs (10-20, including C++ backend). +# +# Usage: +# tools/dev/demo-seed.sh +# DEMO_ENV_FILE=/tmp/demo.env DEMO_API_PORT=18080 tools/dev/demo-seed.sh +# +# The import is idempotent on source_url; re-running updates the same rows. +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +ENV_FILE="${DEMO_ENV_FILE:-$ROOT/.env}" +FIXTURE="${DEMO_JOBS_FILE:-$ROOT/docs/examples/demo-jobs.json}" + +if [ ! -f "$ENV_FILE" ]; then + echo "demo-seed: $ENV_FILE is missing; run tools/dev/demo-up.sh first" >&2 + exit 2 +fi +if [ ! -f "$FIXTURE" ]; then + echo "demo-seed: fixture not found: $FIXTURE" >&2 + exit 2 +fi + +# Load the generated/compose env. DEMO_INTERNAL_TOKEN wins over a stale/empty +# value in the file only for this invocation; the file is never modified. +set -a +# shellcheck disable=SC1090 +. "$ENV_FILE" +set +a + +API_PORT="${DEMO_API_PORT:-${JOBPILOT_BACKEND_HOST_PORT:-8080}}" +TOKEN="${DEMO_INTERNAL_TOKEN:-${INTERNAL_API_TOKEN:-}}" +BASE="http://127.0.0.1:${API_PORT}" + +if [ -z "$TOKEN" ]; then + echo "demo-seed: INTERNAL_API_TOKEN is empty; set it in $ENV_FILE or DEMO_INTERNAL_TOKEN" >&2 + exit 2 +fi + +TMP="$(mktemp -d)" +trap 'rm -rf "$TMP"' EXIT + +for _ in $(seq 1 60); do + if curl -fsS --max-time 2 "$BASE/health" >/dev/null 2>&1; then + break + fi + sleep 0.5 +done +curl -fsS --max-time 2 "$BASE/health" >/dev/null || { + echo "demo-seed: backend is not healthy at $BASE/health" >&2 + exit 1 +} + +echo "demo-seed: importing $FIXTURE through $BASE/internal/jobs/import" +CODE="$(curl -sS -o "$TMP/import.json" -w '%{http_code}' -X POST \ + "$BASE/internal/jobs/import" \ + -H 'Content-Type: application/json' \ + -H "X-Internal-Token: $TOKEN" \ + -d @"$FIXTURE")" +if [ "$CODE" -ge 400 ]; then + cat "$TMP/import.json" >&2 + echo "demo-seed: import returned HTTP $CODE" >&2 + exit 1 +fi + +python3 - "$TMP/import.json" <<'PY' +import json +import sys + +body = json.load(open(sys.argv[1])) +created = int(body.get("created", 0)) +updated = int(body.get("updated", 0)) +total = int(body.get("total", 0)) +rejected = int(body.get("rejected", 0)) +needs_review = int(body.get("needs_review", 0)) +assert total >= 10, body +assert created + updated <= total, body +assert rejected == 0, body +assert needs_review == 0, body +print("DEMO_SEED_OK total=%d created=%d updated=%d" % (total, created, updated)) +PY diff --git a/tools/dev/demo-up.sh b/tools/dev/demo-up.sh new file mode 100755 index 0000000..0fee912 --- /dev/null +++ b/tools/dev/demo-up.sh @@ -0,0 +1,198 @@ +#!/usr/bin/env bash +# One-command local demo: MySQL/Redis -> backend -> UI -> seed -> URL. +# +# tools/dev/demo-up.sh +# +# It creates a random .env only when .env is missing, never prints the secret +# values, and falls back to tools/dev/web_static_proxy.py when the nginx image +# is unavailable. The default is to seed 12 synthetic jobs; --no-seed opts out. +# +# Useful overrides for tests or an existing stack: +# DEMO_PROJECT, DEMO_ENV_FILE, DEMO_API_PORT, DEMO_WEB_PORT, +# DEMO_MYSQL_PORT, DEMO_REDIS_PORT, DEMO_BACKEND_IMAGE, +# DEMO_BUILD_BACKEND=0, DEMO_INTERNAL_TOKEN +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" + +PROJECT="${DEMO_PROJECT:-jobpilot-demo}" +ENV_FILE="${DEMO_ENV_FILE:-$ROOT/.env}" +API_PORT="${DEMO_API_PORT:-8080}" +WEB_PORT="${DEMO_WEB_PORT:-8081}" +MYSQL_PORT="${DEMO_MYSQL_PORT:-3306}" +REDIS_PORT="${DEMO_REDIS_PORT:-6379}" +SEED=1 + +while [ "$#" -gt 0 ]; do + case "$1" in + --no-seed) SEED=0; shift ;; + --no-build) DEMO_BUILD_BACKEND=0; shift ;; + -h|--help) + sed -n '2,18p' "$0" + exit 0 + ;; + *) + echo "demo-up: unknown argument: $1" >&2 + exit 2 + ;; + esac +done + +say() { printf '\n=== %s ===\n' "$1"; } +fail() { echo "demo-up: $*" >&2; exit 1; } + +command -v docker >/dev/null 2>&1 || fail "Docker is not on PATH" +docker compose version >/dev/null 2>&1 || fail "Docker Compose v2 is not available" +command -v curl >/dev/null 2>&1 || fail "curl is not on PATH" +command -v python3 >/dev/null 2>&1 || fail "python3 is not on PATH" + +gen_secret() { + if command -v openssl >/dev/null 2>&1; then + openssl rand -hex 24 + else + python3 -c 'import secrets; print(secrets.token_hex(24))' + fi +} + +if [ ! -f "$ENV_FILE" ]; then + say "create $ENV_FILE" + mkdir -p "$(dirname "$ENV_FILE")" + umask 077 + cat > "$ENV_FILE" </dev/null 2>&1 || fail "backend image $IMAGE is not available" +fi + +say "start backend" +compose --profile app up -d +for _ in $(seq 1 60); do + if curl -fsS --max-time 2 "$API/health" >/dev/null 2>&1; then + break + fi + sleep 1 +done +curl -fsS --max-time 2 "$API/health" >/dev/null || { + compose logs --tail=60 backend || true + fail "backend did not become healthy at $API/health" +} +echo "backend health: $API/health" + +say "start Web UI" +WEB_MODE="nginx" +if ! compose --profile app --profile web up -d > "$ROOT/build/demo-web-up.log" 2>&1; then + WEB_MODE="python-proxy" + echo "nginx web profile unavailable; falling back to web_static_proxy.py" +fi +if [ "$WEB_MODE" = "nginx" ]; then + for _ in $(seq 1 20); do + if curl -fsS --max-time 2 "$WEB/" >/dev/null 2>&1; then + break + fi + sleep 0.5 + done + if ! curl -fsS --max-time 2 "$WEB/" >/dev/null 2>&1; then + WEB_MODE="python-proxy" + compose --profile web stop web >/dev/null 2>&1 || true + echo "nginx web service did not become reachable; falling back to web_static_proxy.py" + fi +fi + +if [ "$WEB_MODE" = "python-proxy" ]; then + # A failed compose up can still leave a created web container behind; stop + # it so the Python fallback can bind the same host port. + compose --profile web stop web >/dev/null 2>&1 || true + if [ -f "$ROOT/build/demo-web-proxy.pid" ]; then + old_pid="$(cat "$ROOT/build/demo-web-proxy.pid" 2>/dev/null || true)" + [ -n "$old_pid" ] && kill "$old_pid" >/dev/null 2>&1 || true + fi + nohup python3 "$ROOT/tools/dev/web_static_proxy.py" \ + --root "$ROOT/web" --port "$WEB_PORT" --backend "$API" \ + > "$ROOT/build/demo-web-proxy.log" 2>&1 & + echo $! > "$ROOT/build/demo-web-proxy.pid" + for _ in $(seq 1 30); do + if curl -fsS --max-time 2 "$WEB/" >/dev/null 2>&1; then + break + fi + sleep 0.5 + done + curl -fsS --max-time 2 "$WEB/" >/dev/null || { + cat "$ROOT/build/demo-web-proxy.log" >&2 || true + fail "web fallback did not become reachable at $WEB" + } +fi + +if [ "$SEED" = "1" ]; then + say "seed demo jobs" + DEMO_ENV_FILE="$ENV_FILE" DEMO_API_PORT="$API_PORT" \ + DEMO_INTERNAL_TOKEN="$TOKEN" \ + "$ROOT/tools/dev/demo-seed.sh" +fi + +say "ready" +echo "DEMO_READY url=$WEB" +echo "env=$ENV_FILE project=$PROJECT backend=$API" +if [ "$WEB_MODE" = "python-proxy" ]; then + echo "web_proxy_pid=$(cat "$ROOT/build/demo-web-proxy.pid")" + echo "web_proxy_log=$ROOT/build/demo-web-proxy.log" +fi +echo "stop: docker compose --env-file $ENV_FILE -p $PROJECT --profile app --profile web down" From 94e61020ee04d6c252a89dcbd3606bb87f6ad3c6 Mon Sep 17 00:00:00 2001 From: cjs1102 <180498659+cjs1102@users.noreply.github.com> Date: Wed, 21 Oct 2026 20:29:19 +0800 Subject: [PATCH 2/4] docs(readme): clarify ingestion ownership and close the plan checklist Describe Python source adapters as the collectors and the C++17 backend as the search/ranking/explanation layer. Mark the closeout request as written while keeping the owner PR and merge pending. Co-Authored-By: Claude Code --- README.md | 9 +++++---- README.zh-CN.md | 6 +++--- docs/exec-plans/active/0025-readme-and-usage.md | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c86dcd0..d7d1476 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,11 @@ [English](README.md) | [简体中文](README.zh-CN.md) -JobPilotAI is a self-hosted job-search workspace: a C++17 backend collects and -searches public job postings, explains matches deterministically, and tracks -applications. An optional AI worker provides task-based assistance; the core -workflow does not require an AI provider or API key. +JobPilotAI is a self-hosted job-search workspace: Python source adapters collect +public job postings, a C++17 backend searches and ranks them, explains matches +deterministically, and tracks applications. An optional AI worker provides +task-based assistance; the core workflow does not require an AI provider or API +key. | Job detail with an explainable match | Application status board | |---|---| diff --git a/README.zh-CN.md b/README.zh-CN.md index 6db85e0..46e92b1 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -2,9 +2,9 @@ [English](README.md) | 简体中文 -JobPilotAI 是一个自托管的求职工作台:基于 C++17 后端采集和检索公开招聘信息, -以确定性规则解释岗位匹配,并跟踪求职进度。可选的 AI Worker 提供任务型辅助; -核心流程不需要配置 AI 服务商或 API Key。 +JobPilotAI 是一个自托管的求职工作台:Python 来源适配器采集公开招聘信息, +C++17 后端负责检索、排序、确定性匹配解释和投递跟踪。可选的 AI Worker 提供 +任务型辅助;核心流程不需要配置 AI 服务商或 API Key。 | 带可解释匹配的岗位详情 | 申请状态板 | |---|---| diff --git a/docs/exec-plans/active/0025-readme-and-usage.md b/docs/exec-plans/active/0025-readme-and-usage.md index 88c5de1..95e3475 100644 --- a/docs/exec-plans/active/0025-readme-and-usage.md +++ b/docs/exec-plans/active/0025-readme-and-usage.md @@ -256,7 +256,7 @@ P1 demo scripts + seed fixture [x] demo-up.sh / demo-seed.sh / 12-job fixture P2 screenshots + README + one-command Quick Start [x] screenshots regenerated; README rewritten P3 README.zh-CN [x] 独立中文镜像 P4 index/state [x] docs index + project-state + handoff corrections -P5 L0 + shell smoke + closeout [~] smoke 完成;REQUEST-0025-closeout 待写 +P5 L0 + shell smoke + closeout [x] smoke 完成;REQUEST-0025-closeout 已写;owner PR/merge 待办 ``` Execution note (2026-10-21): the planned `/tmp/0022-browser-final/*.png` From 16e9d9c86f6b884177a7ea3f6292e11b59b71d33 Mon Sep 17 00:00:00 2001 From: cjs1102 <180498659+cjs1102@users.noreply.github.com> Date: Wed, 21 Oct 2026 20:30:34 +0800 Subject: [PATCH 3/4] docs(state): record capture sample deletion and refresh evidence Record that the raw real-capture JSON was deleted, that no copy remains under /home/dev or /tmp, and that the dev database has only DAO test fixtures. Refresh the handoff corrections, project-state line count, and plan progress. Co-Authored-By: Claude Code --- docs/CLAUDE_CODE_HANDOFF.md | 25 +++++++++++-------- docs/PROJECT_DOCUMENTATION_INDEX.md | 2 +- docs/ai/project-state.md | 14 ++++++++--- .../active/0025-readme-and-usage.md | 6 +++-- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/docs/CLAUDE_CODE_HANDOFF.md b/docs/CLAUDE_CODE_HANDOFF.md index 72ba8b1..25ddf36 100644 --- a/docs/CLAUDE_CODE_HANDOFF.md +++ b/docs/CLAUDE_CODE_HANDOFF.md @@ -174,10 +174,13 @@ Status vocabulary: `DONE` (works, verified) · `PARTIAL` · `FRAMEWORK_ONLY` · > `resolution=open`” sentence is historical. The 2026-10-21 check of the dev > `jobpilot-mysql` database found **0** `job_review_items` (0 open), **0** jobs > with `review_status <> 0`, and four jobs that are all DAO test fixtures -> (`source_url` `job-dao-*`), not the real capture. No real capture sample is -> retained in the dev database, so no reject/delete action applied. See -> `docs/ai/project-state.md` `## Active Plan (0025)` and -> `build/0025/capture-retention-check.txt` (ignored). +> (`source_url` `job-dao-*`), not the real capture. No real capture row exists +> in the dev database, so no review-row reject/delete action applied. A raw +> real-capture file at `/home/dev/capture-acceptance.json` (6846 bytes, SHA-256 +> `1a625a3be8a42008c8def2b31740551c6d12b3bf57bdb001400d6499162f58d0`) was +> found outside the repository and deleted on 2026-10-21; no remaining copy was +> found under `/home/dev` or `/tmp`. See `docs/ai/project-state.md` +> `## Active Plan (0025)` and `build/0025/capture-retention-check.txt` (ignored). ## 6. 已完成的重要工作(有证据的) @@ -228,12 +231,14 @@ Status vocabulary: `DONE` (works, verified) · `PARTIAL` · `FRAMEWORK_ONLY` · name and its `description` contains page chrome). > **Resolved 2026-10-21 (0025):** the current dev database contains no real - > capture sample and no open review item; the four remaining jobs are DAO - > test fixtures. Nothing was retained, so there is no sample to reject or - > delete. This item is closed for the current environment; if a future real - > capture is imported, the no-retention rule still requires an explicit - > review decision (reject keeps the row for audit; deleting is a separate - > explicit action). + > capture row and no open review item; the four remaining jobs are DAO test + > fixtures. The raw real-capture JSON at + > `/home/dev/capture-acceptance.json` was deleted and no copy remains under + > `/home/dev` or `/tmp`; no review-row reject/delete applied because no row + > existed. Redacted acceptance logs remain as evidence. This item is closed + > for the current environment; if a future real capture is imported, the + > no-retention rule still requires an explicit review decision (reject keeps + > the row for audit; deleting is a separate explicit action). ## 8. 已知 Bug diff --git a/docs/PROJECT_DOCUMENTATION_INDEX.md b/docs/PROJECT_DOCUMENTATION_INDEX.md index ca3539e..d59e40f 100644 --- a/docs/PROJECT_DOCUMENTATION_INDEX.md +++ b/docs/PROJECT_DOCUMENTATION_INDEX.md @@ -51,7 +51,7 @@ Status vocabulary used below: |---|---|---|---|---|---| | `docs/ai/README.md` | AI context router | Which document to read for which task; diff-first reading policy | Agents | `CURRENT` | — | | `docs/ai/agent-workflow.md` | Agent workflow and verification rules | Verification levels L1–L5, when a suite may run, harness prerequisites, one review per stage | Agents | `CURRENT` | `build/l4-0017/` (scratch harness) | -| `docs/ai/project-state.md` | Current project state (1011 lines) | Stage-by-stage state, carried-forward items, what is genuinely open | Agents, maintainer | `CURRENT` (updated 2026-10-21) | whole repo | +| `docs/ai/project-state.md` | Current project state (1017 lines) | Stage-by-stage state, carried-forward items, what is genuinely open | Agents, maintainer | `CURRENT` (updated 2026-10-21) | whole repo | | `docs/ai/CURRENT_STATE.md` | Handoff verification report (2026-10-19) | Git/CI facts, §23 fact checklist, document-code conflicts, capability-matrix update; 2026-10-20 resolution note | Agents, maintainer, release reviewer | `CURRENT` (dated 2026-10-19; point-in-time report plus dated resolution note) | whole repo | | `docs/ai/archive/next-phase-plan-2026-10.md` | Archived next-phase plan | An earlier plan sketch; kept for context | Agents | `REFERENCE` (archived) | — | | `docs/ai/references/github_resources.md` | GitHub resource research | 655-line survey used for the open-source plan | Maintainer | `REFERENCE` | — | diff --git a/docs/ai/project-state.md b/docs/ai/project-state.md index a9fefb9..94b6313 100644 --- a/docs/ai/project-state.md +++ b/docs/ai/project-state.md @@ -274,10 +274,16 @@ Evidence collected on the branch (2026-10-21): `jobpilot-mysql` returned `jobs_total=4`, `jobs_review_status_nonzero=0`, `review_items_total=0`, `review_items_open=0`. All four jobs are DAO test fixtures (`source_url` `job-dao-*`, source `manual`, `review_status=0`), not - a real capture. No real capture sample is retained in the dev database, so no - reject/delete action was applicable. The old handoff statement that the real - sample is still `resolution=open` now carries dated corrections in §5 row 9 - and §7 item 8. Raw output: `build/0025/capture-retention-check.txt` (ignored). + a real capture. No real capture row exists in the dev database, so no + review-row reject/delete action applied. A raw real-capture file at + `/home/dev/capture-acceptance.json` (6846 bytes, SHA-256 + `1a625a3be8a42008c8def2b31740551c6d12b3bf57bdb001400d6499162f58d0`) was + found outside the repository and was **deleted on 2026-10-21**; a search of + `/home/dev` and `/tmp` found no remaining copy. Redacted acceptance logs under + `build/0017a/` and `build/capture-0017/` remain as evidence and contain no raw + payload. The old handoff statement that the real sample is still + `resolution=open` now carries dated corrections in §5 row 9 and §7 item 8. + Raw DB output: `build/0025/capture-retention-check.txt` (ignored). Remaining for this branch: closeout request, owner-created PR/merge, and the post-merge main CI verification. Do not archive the plan or mark this stage diff --git a/docs/exec-plans/active/0025-readme-and-usage.md b/docs/exec-plans/active/0025-readme-and-usage.md index 95e3475..e712569 100644 --- a/docs/exec-plans/active/0025-readme-and-usage.md +++ b/docs/exec-plans/active/0025-readme-and-usage.md @@ -267,5 +267,7 @@ synthetic UI. The isolated launcher smoke used `jobpilot-demo-0025`, ports 18180/18181/13326/16399 and `jobpilot-backend:verify`; it printed `DEMO_READY`, seeded 12 jobs, preserved `.env` on re-run, and the stack was torn down with `down -v`. The capture no-retention check found 0 review items and -only DAO test fixtures; see `docs/ai/project-state.md` and the handoff -corrections. Closeout request is the only remaining step. +only DAO test fixtures; the raw real-capture file +`/home/dev/capture-acceptance.json` was also deleted, with no copy found under +`/home/dev` or `/tmp`. See `docs/ai/project-state.md` and the handoff +corrections. Closeout request is written; owner PR/merge remains. From aff6a07bfa88a320e929abddbc2e8bd2818beef0 Mon Sep 17 00:00:00 2001 From: cjs1102 <180498659+cjs1102@users.noreply.github.com> Date: Wed, 21 Oct 2026 20:31:07 +0800 Subject: [PATCH 4/4] docs(state): redact the capture path in tracked documentation Use $HOME/user-home wording so the release local-path check stays clean while keeping the deletion evidence and hash intact. Co-Authored-By: Claude Code --- docs/CLAUDE_CODE_HANDOFF.md | 8 ++++---- docs/ai/project-state.md | 4 ++-- docs/exec-plans/active/0025-readme-and-usage.md | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/CLAUDE_CODE_HANDOFF.md b/docs/CLAUDE_CODE_HANDOFF.md index 25ddf36..46b99f6 100644 --- a/docs/CLAUDE_CODE_HANDOFF.md +++ b/docs/CLAUDE_CODE_HANDOFF.md @@ -176,10 +176,10 @@ Status vocabulary: `DONE` (works, verified) · `PARTIAL` · `FRAMEWORK_ONLY` · > with `review_status <> 0`, and four jobs that are all DAO test fixtures > (`source_url` `job-dao-*`), not the real capture. No real capture row exists > in the dev database, so no review-row reject/delete action applied. A raw -> real-capture file at `/home/dev/capture-acceptance.json` (6846 bytes, SHA-256 +> real-capture file at `$HOME/capture-acceptance.json` (6846 bytes, SHA-256 > `1a625a3be8a42008c8def2b31740551c6d12b3bf57bdb001400d6499162f58d0`) was > found outside the repository and deleted on 2026-10-21; no remaining copy was -> found under `/home/dev` or `/tmp`. See `docs/ai/project-state.md` +> found under the user home or `/tmp`. See `docs/ai/project-state.md` > `## Active Plan (0025)` and `build/0025/capture-retention-check.txt` (ignored). ## 6. 已完成的重要工作(有证据的) @@ -233,8 +233,8 @@ Status vocabulary: `DONE` (works, verified) · `PARTIAL` · `FRAMEWORK_ONLY` · > **Resolved 2026-10-21 (0025):** the current dev database contains no real > capture row and no open review item; the four remaining jobs are DAO test > fixtures. The raw real-capture JSON at - > `/home/dev/capture-acceptance.json` was deleted and no copy remains under - > `/home/dev` or `/tmp`; no review-row reject/delete applied because no row + > `$HOME/capture-acceptance.json` was deleted and no copy remains under the + > user home or `/tmp`; no review-row reject/delete applied because no row > existed. Redacted acceptance logs remain as evidence. This item is closed > for the current environment; if a future real capture is imported, the > no-retention rule still requires an explicit review decision (reject keeps diff --git a/docs/ai/project-state.md b/docs/ai/project-state.md index 94b6313..97c3a83 100644 --- a/docs/ai/project-state.md +++ b/docs/ai/project-state.md @@ -276,10 +276,10 @@ Evidence collected on the branch (2026-10-21): fixtures (`source_url` `job-dao-*`, source `manual`, `review_status=0`), not a real capture. No real capture row exists in the dev database, so no review-row reject/delete action applied. A raw real-capture file at - `/home/dev/capture-acceptance.json` (6846 bytes, SHA-256 + `$HOME/capture-acceptance.json` (6846 bytes, SHA-256 `1a625a3be8a42008c8def2b31740551c6d12b3bf57bdb001400d6499162f58d0`) was found outside the repository and was **deleted on 2026-10-21**; a search of - `/home/dev` and `/tmp` found no remaining copy. Redacted acceptance logs under + the user home and `/tmp` found no remaining copy. Redacted acceptance logs under `build/0017a/` and `build/capture-0017/` remain as evidence and contain no raw payload. The old handoff statement that the real sample is still `resolution=open` now carries dated corrections in §5 row 9 and §7 item 8. diff --git a/docs/exec-plans/active/0025-readme-and-usage.md b/docs/exec-plans/active/0025-readme-and-usage.md index e712569..c3e3e71 100644 --- a/docs/exec-plans/active/0025-readme-and-usage.md +++ b/docs/exec-plans/active/0025-readme-and-usage.md @@ -268,6 +268,6 @@ synthetic UI. The isolated launcher smoke used `jobpilot-demo-0025`, ports `DEMO_READY`, seeded 12 jobs, preserved `.env` on re-run, and the stack was torn down with `down -v`. The capture no-retention check found 0 review items and only DAO test fixtures; the raw real-capture file -`/home/dev/capture-acceptance.json` was also deleted, with no copy found under -`/home/dev` or `/tmp`. See `docs/ai/project-state.md` and the handoff +`$HOME/capture-acceptance.json` was also deleted, with no copy found under the +user home or `/tmp`. See `docs/ai/project-state.md` and the handoff corrections. Closeout request is written; owner PR/merge remains.