Repository navigation
[Feat] Add the five-stage Jev content desk with a draft Omni worker path - #96
Draft
hsliuustc0106 wants to merge 1 commit into
Draft
hsliuustc0106 wants to merge 1 commit into
hsliuustc0106 wants to merge 1 commit into
Conversation
The desk ingests RSS and fixture posts, screens keep or drop, waits for a human pick, fact-checks the picked drafts, and records a publish decision without posting. OMNI_BASE_URL sends short /v1/systemone prefills to a draft StartLux worker; PPLX is an optional fact-check URL. Unset, the lexical rule runs offline so CI does not need a worker. Co-authored-by: Hongsheng Liu <liuhongsheng4@huawei.com>
Birfy
reviewed
Oct 26, 2026
Birfy
left a comment
Collaborator
There was a problem hiding this comment.
Review (Birfy): comment only, draft
Head 46e74be1, merge base is current main (9b20b98). I re-ran it locally on that head: ruff check clean, pytest -q 1160 passed, 130 skipped, 250 subtests passed, matching the PR. CI is green. The two gates do what the description says: human_publish.executed is always [], auto_publish is always false, and a missing --picks stops at the pick gate.
Points to address before this leaves draft:
- The System1-Omni worker PRs are merged now, so the "draft" framing is stale. InferMatrixLab/system1-omni #164 (StartLux, merged 2026-10-25 07:21 UTC), #166 (PPLX, 07:22 UTC) and #165 (Clef, 08:15 UTC) all landed after this branch was cut.
worker_record()still writes"draft": True, "merged_required": False, andomni_client.py,docs/content-workflow.mdand the recipe README say "draft worker" throughout (46 mentions of "draft" ins1a/content+ the doc, though some mean the article draft). Please point at the merged commits (dd7bfd0,f18b8a6,a41e379) or a pinned system1-omni tag, and drop thedraft/merged_requiredfields or make them reflect the actual state. - No Jev path despite the title.
s1a/contentnever importsbuild_modelor anything ins1a/decision_models;--backendisauto | rule | omni, and the Omni workers are StartLux and PPLX. So "the five-stage Jev content desk" can't run on Jev, Laya or Cua. Either route the screen and fact-check questions through the existing decision-model factory (the ticket_router pattern the description cites, so--model jev|laya|cuaworks and you get the shared validation and provenance for free), or retitle and say in the docs that Jev is not wired yet. - Repo naming. The new code and docs link
InferMatrixLab/system1-omni, while the README and the rest ofdocs/useThinkFlowLab/system1-omni(GitHub redirects, it's the same repo). Pick one across the repo, or note the rename in the CHANGELOG, so readers don't think there are two Omni projects. - Evidence for leaving draft. The fixture run is, as the PR says, a wiring check: the lexical rule matches the labels by construction. Before ready-for-review, a short live run of the screen step against a serving StartLux worker on the 50 labeled items (choice accuracy and p50 latency), plus the recording the repo asks for, would give reviewers a real number.
Small: smoke-evidence.json is committed but the full report is under gitignored runs/. Fine, but say in the recipe README how to regenerate the evidence file so it doesn't drift.
Not approving while draft. Nothing here blocks the design; (1) and (2) are what I'd want fixed first.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Required human contributor answers
Answers are taken from the task that asked for the diagram “我现在的 Jev 工作流” / “Jev 做筛选,人做决定”, and from the follow-up that set the agents×omni split. They are not a new rationale.
What outcome are you trying to achieve?
Answer: A supported five-stage content workflow in system1-agents: ingest RSS and Twitter/X (or fixtures), Jev screens, a person picks 3–5 items, Jev fact-checks, and a person decides whether to publish. Add an agents×omni demo path for the screen and fact-check steps. Do not auto-publish.
What is the highest-leverage variable for that outcome?
Answer: The agreed split, built on the existing ticket_router /
s1a decidepattern rather than a new tool loop. system1-agents owns orchestration, RSS/X ingest (or fixtures), the human pick gate, and the human publish gate. system1-omni only provides HTTP workers for the screen and fact-check classify/score steps.How will this work move that variable rather than create busywork?
Answer: A small client points at a configurable Omni serve base URL, so draft workers can be used without merging system1-omni #164–#166. The default worker is StartLux Instant 4B (#164). Fact-check can switch to PPLX (#166). Clef (#165) stays off the hot path. When
OMNI_BASE_URLis unset, a local/fixture decider runs so CI stays offline. About 50 labeled items record choice and score against labels. A Public231-C1-style latency gate is documented for later and is not attached.Who is the customer or user, and what do they actually need?
Answer: The person in that desk diagram. Jev screens and fact-checks. The person picks what to research and decides whether to publish.
After answering the four questions: is a PR needed at all to achieve this outcome?
Human decision and rationale (or explicit source reference): Yes. The task asked to add this path in system1-agents, open a PR, and not merge it.
For a bug fix: link actual observed failure evidence.
Evidence: Not applicable. This adds a workflow. It does not fix a reported failure.
Why
There is no runnable path for the five-stage desk. Jev can answer an enumerated choice, and
ticket_routeralready batches that kind of decision, but nothing ingests a feed, stops for a person, fact-checks a draft, and records a publish decision without posting. A shared tool-loop agent would keep acting after each choice, so the two human gates would not be able to stop the run.How
The desk is a separate command,
python -m s1a.content. It is not aSPECagent, sos1a list, the smoke agent list, and the MCP tool list stay as they are.Review order:
s1a/content/workflow.py— stage order and the two gates.human_publish.executedis always[].auto_publishis always false.s1a/content/omni_client.py— shortPOST /v1/systemoneprefills. StartLux sendsthink_mode: never. PPLX sendsthinking: {"enabled": false}and needs its own URL. Clef is refused. No retries. Error text does not include the response body.s1a/content/rules.py— offline lexical baseline used when no Omni URL is set. Labels are stripped before the decider sees an item.s1a/content/ingest.py— RSS 2.0 and Atom from a file or an opt-in URL. X is a JSONL fixture. The unconfigured adapter does not callapi.x.comand does not readX_BEARER_TOKEN.s1a/content/__main__.pyands1a/content/latency.py— CLI exits and the unattached latency hook.tests/test_content_workflow.pyandrecipes/content-workflow/.--backend autouses Omni only whenOMNI_BASE_URLis set. Otherwise it uses the lexical rule. Explicit--picksand--publishwin over hooks. Hooks win over--allow-unsafe-skip-gates. That flag invents a pick and holds every item. It still does not publish.Authored Python is 2,044 added lines (
s1a/content1,511,tests/test_content_workflow.py533) and 0 deleted lines. The full diff is 2,502 insertions and 1 deletion, including docs and the fixture. That is under the 3,000-line authored-code threshold.What
s1a/contentand CLIpython -m s1a.content run/latency-report.recipes/content-workflow: 50 labeled items (32 keep / 18 drop, 8 drafts), pick and publish files, local RSS and X fixtures.docs/content-workflow.md, plus rows in the recipe index, agents, capabilities, configuration, skills, README,.env.example, and CHANGELOG Unreleased.OMNI_BASE_URL(and, for PPLX,OMNI_FACTCHECK_BASE_URL) only when a draft worker is already serving. No new dependency. No new MCP tool.s1a decidedoes not gain a score question.Verification
Commands run on this branch before the commit, parent
9b20b989d919bc69227f81bc0ec571ca56925586:uv run ruff format --check . && uv run ruff check . && uv run ty check— passeduv run pytest -q— 1160 passed, 130 skipped, 250 subtests passed.scripts/smoke.sh—smoke: ok. The agent list is still the existing nine names; this path is not aSPECagent.CHANGELOG.mdanddocs/content-workflow.mddescribe the command, the gates, and the unattached latency hook.Fixture command (rule profile, no decision socket):
OMNI_BASE_URL= OMNI_API_KEY= uv run python -m s1a.content run \ --items recipes/content-workflow/items.jsonl \ --picks recipes/content-workflow/picks.json \ --publish recipes/content-workflow/publish.json \ --backend rule \ > runs/recipes/content-workflow/report.jsonThe recipe verifier printed
n01 -> supported score 2 decision publish,n02 -> unsupported score 0 decision publish,n03 -> needs_human score 1 decision hold,n04 -> supported score 2 decision hold,screen 50 / 50, andVerified the fixture workflow; nothing was published. The same command without--picksexited 2 withhuman pick gateon stderr. Counts are inrecipes/content-workflow/smoke-evidence.json. The full report stays under gitignoredruns/. The lexical rule matches these labels by construction. That is a wiring check, not a quality result for Jev, StartLux, or PPLX.Not run: a live StartLux or PPLX worker,
s1a decideagainst Jev, and any latency ceiling.latency_gate.attachedis false. No p50 is pinned. StartLux’s recorded Public231 number is a different workload and is not this fixture’s budget.Demo / evidence
executed: [], and the answering model, request id, and base URL from the same run.recipes/content-workflow/items.jsonl(sha25651828b6671f507e4ce635d90a43420b1855fde864c43dfc17c072e3ba983f064) → lexical screen of 50/50 against labels, human pickn01–n04, fact-check of those four drafts against their stored claims, human decisions frompublish.jsonincludingpublishon an unsupported item →human_publish.executedis[]andauto_publishis false. Recorded at2026-10-25T02:08:22Zon parent9b20b98, in the working tree that added the recipe. Re-run on this head (46e74be10f00ee437517d3580701caeb23ca615f) to refresh the note. Mock StartLux (think_mode: never) and PPLX (thinking.enabled: false) transports are covered intests/test_content_workflow.pyand do not open a worker socket.46e74be10f00ee437517d3580701caeb23ca615f, base9b20b989d919bc69227f81bc0ec571ca56925586. No System1-Omni commit, checkpoint, or worker was used. The client names draft workers only: StartLux Instant 4B, modelStartLux-Decision-v1.1-4B-Instant, system1-omni #164; optional fact-check modelperplexity-ai/pplx-decider-v1.1-27b, system1-omni #166. Clef #165 is refused. Neither draft has to be merged. CI on this head was not observed at submit time.