Skip to content

Promote dev to main: research map redesign, trial polish, issue fixes #127 #129 #132 - #144

Merged
Yushangjinghong2 merged 58 commits into
mainfrom
dev
Sep 22, 2026
Merged

Yushangjinghong2 merged 58 commits into
mainfrom
dev

Conversation

@Yushangjinghong2

@Yushangjinghong2 Yushangjinghong2 commented Sep 21, 2026 •

Copy link
Copy Markdown
Collaborator

Promotes everything reviewed on dev since the last promotion (55 commits, PRs #140, #142, #143 and the Windows 0.1.8 release branch) into main. main keeps its own seven runtime-recovery commits from #139 and #141; the merge is conflict-free (git merge-tree clean) and the merged tree was linted and run through the full pytest suite locally before opening this PR.

Research map (PR #143, #142)

Connections read as a route instead of sparse dots; a card's overview tier follows the zoom, so zooming shows more rather than bigger; type and chrome are sized in quarter-octave zoom steps (zoomStep.ts) so a gesture scales one picture and text is re-set when the movement rests, restoring ~45 fps on a ten-task map. Ink-on-paper palette, brushed route strokes (brush.ts), a course row per card, one stylesheet frontend/web/src/map/design.css. A line says what it carries via POST /api/map-lines/{source}/{name} (argus/webapi/map_lines.py); a card gets a title and one sentence in the reader's language via POST /api/map-cards/{source}/{name} (argus/webapi/map_cards.py); both per-language length budgets, ending at a sentence or word. Task interiors read as stages (goal, plan, rounds, review, result) with tool activity folded into its round. A stopped project can still be explained; brief sections returned as objects are normalised before the schema check. Phones show the whole answer and cards named after their task. Documentation: docs/research-map.md.

Reviewer through native tools (#143)

The Reviewer submits its judgment with native review actions (argus/reviewer/tools.py, pi_review_tools.mjs) instead of parsed prose; the prose decision parser is removed; waiting and venue-acceptance semantics preserved; historical review failures stay distinct from scientific rejection. Prompt catalog and reviewer tests updated to the new contract.

Web trial polish (#143)

Per-message route as a segmented Auto / Task / Chat control in both composers (RouteSegment.tsx), request body unchanged; the preview panel's collapse button now closes it on desktop; sidebar Plugins row aligned with Skill library and Knowledge base; the unpaired landing shows the localized pairing hint instead of a fixed English error; the missing-project notice is localized; a phone with no project gets an Open menu button. Frontend tests updated (slashCompletion, mapComposerLifecycle, pluginLanding); frontend/web/dist rebuilt.

Issue fixes (#143)

Windows 0.1.8 release branch (#140), settings (0.1.7)

Session-safe UI, library guides, resources above sessions with Chinese library explanations, workspace diffs with original-text fallback, read-only view clarity, Windows newline handling in knowledge pages, isolated session drafts and desktop notifications; release inputs pinned and Hatchling editable hook included in the pinned Windows tools (.github/workflows), versions aligned for Windows 0.1.8, frontend identity regenerated. Settings: pick models from a list, one choice applies to every role, sidebar libraries folded. Release manifests and bundles rebuilt at each step (argus/release_manifest.json, frontend/tui/bundle, frontend/web/dist).

CI and tests

tests.yml runs lint then the whole suite as one job per push. The desktop identity test's Windows-path ownership assertion is platform-aware; the Windows installer preflight PowerShell probe has a 180 s bound instead of 40 s (cold start on hosted runners sat at the edge). On dev at f1f98a2: lint + tests green; desktop workflow green on windows-latest, macos-14 and macos-15-intel; PR description gate green.

🤖 Generated with Claude Code

Reconciliation with main (14a87fe)

main's #139/#141 landed with lint and an architecture ratchet failing (its tests workflow has been red since 2026-09-18). Merging main into dev carries the same three points, fixed here: argus/skills/stage_machine.py used typing.Any without importing it; argus/life/supervisor/_planning_cycle_intake.py kept an import whose only use moved to _planning_cycle_completion.py; tests/skills/test_research_idea_portfolio.py imported argus.team.pool unused. The runtime-incident store and runtime failure circuit read memory.root like the rest of the supervisor (their reader in _idle_cycle.py uses the same root), so MEMORY_ROOT_READS in tests/test_architecture_invariants.py is 81 with the reason recorded next to it. After this, dev contains main, and this PR is a fast-forward of main to dev.

lbx154 and others added 30 commits September 18, 2026 02:07
…what each role runs

On the trial host the operator picked gpt-6-astra and every call still went
to gemini: the quick picker writes ARGUS_SKILL_MODEL, but the twelve role
knobs had been pinned to gemini at setup and a role knob wins. The picker
now sends apply_to_roles, which releases the role pins so all roles follow
the shared choice (a pin set afterwards in the role table wins again;
ARGUS_SKILL_FIGURE_MODEL and ARGUS_SKILL_MAP_MODEL are not role pins and
stay). The panel lists what each role actually runs when it differs from
the chosen model, and the response reports the pins released and left.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…he page simple

The quick section now offers a select for the execution model and one for
the map model, built from the harness catalog plus models that answered on
this home in the last thirty days. Budgets, the advisor model, explanation
effort and raw configuration moved under Advanced. The knowledge and skill
libraries fold in the sidebar and remember the choice.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…fication

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The per-push check is now ruff plus pytest under xdist. The mypy type gate
moves to the on-demand extended workflow with a base revision input; it
cost a minute and most of this week's red runs on cosmetic mixin
declarations. The launcher console tests stub the release identity so they
no longer depend on an earlier test having warmed its cache, which the
parallel run exposed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 76af32665810b94806b974759a5ed1bda441cbe8)
Windows 0.1.8: session-safe UI, library guides and signed-release preparation
Three things seen on the stable web trial (s-54218bf4, 2026-09-18):

- On a narrow canvas a card of up to three steps stacks them in one column.
  The wide layout opened a question-and-answer card at 460px on a 390px
  screen, so the answer started off-screen. Longer cards keep the wide
  layout and pan as before.
- A turn started by picking an option on a choice card ("直接做") is titled
  by the task it carries out, which `manager.turn.started` already records,
  instead of by the option's label. HISTORY_VERSION 8 rebuilds stored cards.
- Inside the workbench shell the map no longer reserves the tab bar's height
  a second time, which left a blank band above the bar on a phone.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
map: a phone shows the whole answer, and a card is named after its task
The map looked unfinished in three ways (stable web trial, iclr-eval-v5):

- The order work happened in, which is every edge of a map without recorded
  dependencies, was drawn as sparse grey dots and read as noise. It is now a
  continuous slate line that strengthens toward the card it arrives at, with
  a small anchor where it leaves and a lighter swept arrowhead. The dash is
  kept for "related work", an association rather than a path. Step links
  inside an open card use the same line.
- Each card chose its overview tier from its own width, so one view mixed
  headed cards with bare grey tiles. The tier now comes from the zoom alone.
- Between overview and detail a card was its small layout magnified: 40px
  type, a title cut off under the toolbar, a footer spilling out of the
  frame. Type now lives in a band of screen sizes, so a larger card says
  more at the same size; content is clipped inside the card, and the title
  ends on a whole line that fits the card's height.

Chrome (hairline, corner, state rail, shadow) is measured on the screen, so
it is the same at every zoom. A card that keeps earlier parts shows a second
sheet behind it. Zooming into open canvas no longer enters detail mode with
no card in focus, which dimmed the whole map around nothing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Two things taken from the 0.1.3 map (the version PR #119 is built on), which
a later simplification had dropped: every card shows the course its task
ran, and the sheet has a head. Then a visual language for the whole map.

- The course: four marks on a task card (planned, carried out, reviewed,
  delivered), inked where the record holds a step of that kind. At overview
  they are four beads, so a whole map shows at a glance which tasks were
  reviewed and which stopped short; with room they carry icon and label.
- The head: a letterspaced kicker over the session's name, and one thin bar
  ahead of the status sentence that shows how the tasks divide.
- Ink on paper. The restraint is Apple's: whitespace, one frosted material
  for every control, hairlines, soft depth. The vocabulary is ink
  painting's: a paper ground with a felt grain, washes of diluted ink and
  far hills where coloured light drifted before, serif titles, and the
  mineral pigments of that tradition (malachite, indigo, vermilion,
  gamboge, ochre) spent only on state. Night ink is the dark theme.
- A route that is a path is drawn as a brush stroke: set down lightly,
  gaining weight, pressed once and lifted to a point. It shows where it is
  going along its whole length and needs no arrowhead. An association keeps
  its dashed line. `brushStroke` builds the outline from the route's samples,
  resampled by arc length.
- The legend gains the line most maps are made of, the order of work, and
  the dashed swatch's tooltip now describes the dashed line. The minimap and
  the deliveries button speak the same palette.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Seen on the stable web trial after the ink map went out. With the sidebar
open the overview runs at a lower zoom, and a card kept its course beads at
the cost of its title: task 02 read "Author…". And where the 0.1.3 map gave
every card a line of explanation, ours had none at overview, because the
excerpt was the last thing to be given any height.

A card now counts the whole lines it has room for and spends them in the
order a reader from outside the team needs: two lines of title, a line of
explanation, the course beads, then more of each. The explanation at
overview is the task's own (the generated summary, else its objective, else
the tidied record). The notice that an execution ended short of the goal
reads the same on every such card and filled the map with one repeated
sentence; it stays on the larger card, where the state mark already carries
it at overview.

The team branch pill joins the sheet: paper, hairline, pigment rail, serif.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
lbx154 and others added 28 commits September 20, 2026 10:38
…rder

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Relation labels were hidden below half scale, and a map is normally read at
0.1 to 0.3. So what connects two tasks ("模型集成前置", "同一计划") was only
ever seen by zooming in on the line itself, and the map read as having no
stated relations at all. The 0.1.3 map behaved the same way; this is not a
regression, it was never visible.

- Labels are placed through the overview in twentieth-step zoom buckets, and
  give way only below 0.05 where cards are down to a title. Placement still
  drops a label that fits nowhere, so none is laid over a card.
- A label that states a relation (a dependency, related work, a changed
  plan) claims its place before one that only says two tasks share a study.
- A stated relation is a small slip of paper on the line; the order of work
  is a quiet annotation, so a map of chronological edges is not a row of
  identical chips. Type stays inside the box the collision pass reserves.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…abels

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Zooming the redesigned map ran at a quarter of the frame rate it had before
the redesign (12 fps against 50 in the same harness). Three things did it,
all mine:

- Type and card chrome were sized against the live zoom, so every card was
  laid out again on every frame. They are now sized against the zoom in
  quarter-octave steps, and a moving map keeps the step it had: a gesture
  scales one picture and text is set again when the movement rests, or once
  the picture has drifted two steps small or three large.
- The live zoom was published as an inherited custom property, which restyled
  the whole map each frame whether or not anything read it. Only the step is
  published now.
- The ink washes carried a 36px blur on large drifting layers, the grain and
  the night hills used blend modes and filters, and every label and panel had
  a backdrop blur. Washes get their softness from the gradient, grain and
  hills are drawn in their own colours, labels are plain paper, and the
  frosted panels turn to paper while the map moves.

Every line at overview read "same study". A line that can only name its kind
now says so when the reader points at one of its tasks, and the lines that
have something to say are asked for it: POST /api/map-lines takes the pairs
the map draws and has the map model write, once per map, what one task handed
the next, or nothing where the records show no connection. A note annotates
an existing line and never adds one or changes its kind, so the layout does
not depend on it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… line notes

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The notes were gated on the project still running, like card explanations.
A finished map is the one that gets read, and its lines are written once, in
one small call, so the gate only kept them from ever appearing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…shed projects

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Inside a task, every stretch of tool activity had become a card of its own
("40 steps of work", "said what comes next"), so a one-round task was twelve
cards, the stages of the work (goal, round, review, changes asked for, next
round, result) were lost among them, and the links between cards, which name
a relation only between adjacent stages, had nothing left to say but "then".
The map from before that change (PR #119's base) read better for exactly
this reason: one card per stage, a named relation on every link.

- Tool activity is folded into the round of work or review it happened in.
  The round's card says how many actions it holds; opening it lists them
  after the round's own record, without repeating what that record says.
  Where there is no round (a single-agent turn) consecutive stretches are
  one step.
- A round still under way is titled and summarised by the latest thing its
  agent said.
- A failed tool call is marked on its line and no longer turns the whole
  step red; being put on the plan and being taken up are moments, so a
  finished task no longer shows them as "in progress".
- Steps are named by their stage (task goal, work started, this round's
  work, review passed / another pass asked for, changes asked for, result of
  the work) and links by their relation, with wording for entering a round,
  a review followed straight by the next round, and a task taken up again.
- A column that continues a round says which part it holds.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…k interior

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
PR #119's map read well at a glance because every card carried a written
title and a sentence. Since then the explanation of a task is written only
when a reader opens it (it grew into a full lesson, and costs accordingly),
and not at all once the project's daemon has stopped, which on a trial is
every project. So the cards showed the planner's own text: an imperative
English title, the first words of a specification, and the state of the
execution said three times.

- POST /api/map-cards has the map model write, in one small request per map,
  a short title and a sentence or two per task, from the task's goal and the
  last record its work left (a task's `summary` is as often a harness note).
  About 3.5k tokens and half a cent for ten tasks with gemini-3.8-flash. The
  full explanation stays on demand and takes over the card once it exists.
- With words on it, a card no longer prints the specification under the
  title, and says its state once, on the chip. An explanation written before
  an execution ended short of its goal still may not head the card; the
  map's words, written knowing how it ended, may. A reader's own turns keep
  the reader's words.
- A step's detail no longer shows harness instructions ({"wait_for": ...})
  or raw JSON arguments, and lists eight actions with a count of the rest
  instead of all hundred.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
An explanation is written only for what a reader opens. It was also held back
whenever the project's daemon was not running, which is when a map is read
most: on a trial every project is stopped, so opening a card never produced
an explanation at all. Writing one is a separate read-only turn and needs no
daemon, so the hook no longer asks; nothing is written for a card that is
merely on screen or focused, as before.

Trying it on a stopped project with gemini-3.8-flash showed the writing then
failing about half the time: the model returns a section of the reader brief
as an object of named parts ({"name", "restriction", ...}), the way `concept`
is shaped, where the schema asks for one text. The brief already tolerated
one such shape, but only after the schema check had rejected it. The shape is
now put right before the schema sees it (the model's own paragraphs, joined
in its own order; the schema's length limits still apply), and anything else
still fails as an invalid brief.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…opped projects

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
They were already written in the interface's language and kept per language,
but their limits were sized for Chinese and applied by cutting: an English
reader got "Formulate three long-context LLM researc" as a title and "Method
contract an" beside a line.

- Titles, sentences and line phrases have per-language limits, and the prompt
  asks for the length in that language only (sixteen characters or eight
  words; ten characters or a two-to-three-word noun phrase) and says to write
  in the reader's language whatever language the records are in.
- The schema is wider than what is shown, so one overlong phrase does not
  throw away every other card's words; text that overruns is ended at a
  sentence, clause or word, never inside a word or a number ("38.31%").
- A line's pill is wide enough for an English phrase, and its width estimate
  matches the bold serif it is set in. Relations stated by an explanation get
  the same per-language label length.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…words

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…mand

Stop generating explanation snapshots and redundant relation evidence. Keep cached explanations and old questions readable, and retain task records only when a reader asks about a selected explanation. Preserve click-to-read generation and expose preparation failures without silently rewriting explanations.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 072ba9df-603c-4f3e-bcb7-59385fd508ef
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 072ba9df-603c-4f3e-bcb7-59385fd508ef
…e tools

Keep historical review failures distinct from scientific rejection and link final delivery. Remove zoom-dependent card text collapsing. Replace live reviewer prose parsing and the extra interpretation call with native review actions, preserving waiting and venue acceptance semantics. Refresh release metadata and bundled frontends.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 5f36246b-910c-4964-99da-28bf7892c6a2
- Replace the native route <select> in the conversation and map composers
  with a segmented radiogroup (RouteSegment); request body unchanged
  (route_override only sent for task/chat).
- Drop the redundant 'Enter to send' hint in the map composer toolbar.
- Collapse button on the preview panel now also resets the mobile preview
  state, so it closes on desktop after opening via the Files button.
- Rebuild frontend/web/dist.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…, phone menu on empty landing; fix stale reviewer tests

- Plugins entry uses the shared sidebar row so its hover fill matches Skill
  library and Knowledge base.
- The unpaired landing shows the localized pairing hint instead of the
  fixed English error message; the missing-project notice is localized.
- A phone with no project yet gets an Open menu button on the landing.
- Migrate two reviewer tests to the native review-action contract that
  the previous commit introduced (prose STATUS lines are no longer parsed).
- Desktop: the Windows-path ownership assertion is platform-aware, since
  same_path only folds verbatim prefixes on Windows.
- Rebuild frontend/web/dist.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Retiring a route and then revising its goal claim left the ledger failing
check with route_goal_stale forever, even with a replacement route on the
current statement. A retired route is history of an attempt against the
claim as it then stood. Validation now checks a retired route's goal
against every recorded claim version (kind, id and content hash), while an
active route must still target the current version. An unknown id or a
wrong digest on a retired route is reported as route_goal_unknown.

Tests: kernel cases for superseded goal, active stale goal, blank reason,
unknown id, wrong hash, retired self-dependency; the public CLI
retire/revise/replace round trip from the issue.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A new Copilot CLI session killed by the turn-cap watchdog before its
terminal result left thread_id null, so priced receipts could not be
reconciled and admission stayed blocked as if the budget were exhausted.

A new session now gets a pre-allocated UUID passed as --session-id (when
the executable advertises the flag), bound to the call before spawn and
recorded on the agent.io.start row. Watchdog kill, idle timeout, process
failure and a missing terminal result all return that identity; resumed
calls keep their original identity and never get a replacement. An early
session.start or terminal result whose sessionId differs from the bound
identity fails closed: thread_id is cleared, the turn stays failed and the
conflict is recorded. Identity never implies completion. Failed calls with
unreachable usage carry an explicit accounting_pending cause
(lost_session_identity / session_identity_conflict) in the refusal text.

Tests: 14 runner-level and 7 adapter-level cases with mocked subprocess
boundaries; the suite stubs the --help probe so no test spawns Copilot.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tion (#132)

After ENOSPC left a truncated record spliced onto a later one, the usage
reader skipped the malformed line and admission proceeded. The reader now
reports malformed physical lines as UsageJournalIntegrityError instead of
dropping them; reserve_call_budget and cost_admission_reason refuse with
accounting_integrity: corrupt_accounting_journal (file and line) before any
transport, and the global read no longer treats one project's corruption
as ignorable. Blank lines stay benign; a partial final line is tolerated
only while another writer holds usage.lock. Reconciliation refuses to
rewrite a journal that contains malformed lines, leaving the bytes intact.
A failed unknown-cost settlement writes a durable marker under
cost-control.failed/ that blocks admission as unresolved liability across
PID exit and restart until an acknowledgement or a later settled receipt
retires it. No zero-cost rows or synthetic completions are created.

Out of scope, still open in the issue: the prepare/review/apply recovery
transaction, durable waiting, continuation ownership, acknowledgement
audit ordering.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…imeout

The first powershell.exe start on a hosted Windows runner takes close to
40 s cold, so the 40 s subprocess bound made the first test in this file
fail intermittently (three of the last four runs on this branch). The
bound now only guards against a hang.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
map: connections read as a route, and zoom shows more instead of bigger
main's #139/#141 landed with lint and an architecture ratchet failing; after
merging main into dev the same three points remain:
- argus/skills/stage_machine.py used typing.Any without importing it.
- argus/life/supervisor/_planning_cycle_intake.py kept an import whose only
  use moved to _planning_cycle_completion.py.
- tests/skills/test_research_idea_portfolio.py imported argus.team.pool unused.
- The runtime-incident store and the runtime failure circuit read
  memory.root like the rest of the supervisor (their reader in _idle_cycle.py
  uses the same root), so MEMORY_ROOT_READS is 81 with the reason recorded.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
main's #139/#141 added life.runtime.incident.detected/recovered/escalated to
the event catalog; dev's exhaustive event renderer had no case for them, so
the merged tree failed tsc in the desktop build. They join the runtime
failure circuit events in the bookkeeping fallback group. Regenerate the
renderer coverage fixture and rebuild the web dist and TUI bundle.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@Yushangjinghong2
Yushangjinghong2 merged commit 9250116 into main Sep 22, 2026
6 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants