Skip to content

flows: the first 0.5.225 matrix run — 8 flows promoted from drafts, 13 stay with reasons - #133

Open
emooreatx wants to merge 12 commits into
mainfrom
flows/matrix-0.5.225
Open

emooreatx wants to merge 12 commits into
mainfrom
flows/matrix-0.5.225

Conversation

@emooreatx

Copy link
Copy Markdown
Contributor

Now that VERSION is 0.5.225, the drafts floored at it can run.

Moved to testing/flows/ (8): People (two_node), receipt (two_node), wallet, provision accord holder, notes to self, network content (two_node), share contact code, household members. Four floors flipped from unreleased to >=0.5.225 after every tag each flow drives was found in the client source. Three flows needed fixing to be green on an ordinary run (a camera-only button on desktop; a list a bare node never renders; a roster that doesn't exist on a household-less node).

Stay in drafts (13), each with the reason in its CSD §5 line and the drafts README: 5 whose state tags are built by interpolation (ReadFailureBlock, ConfirmSheet) and invisible to the flow-load tag check — a test fix, not a flow fix; 7 whose first screen is flow-only with no nav hop (would be cannot-start on every leg; each line says how to enter it from the hub); 1 known red upstream (chat, CIRISServer#698).

Loader: 9 flows bound to their CSDs. pytest 431 passed. Every CSD validates; route gate at baseline; gates 0.

A five-platform run on this branch is the promotion evidence: whatever is green on the matrix promotes to testable in a follow-up.

🤖 Generated with Claude Code

https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM

…/flows

Of the 21 CSDs carrying "Spec complete and flow written", eight drafts move
up to run on the five-platform matrix: csd-005, 006, 008, 047, 057, 068,
092, 101. Floors that were `unreleased` flip to `>=0.5.225` only where every
tag the flow drives is found in client/shared/src by test_flows' rule
(008, 047, 092, 101; also 033, 046, 048, 049, which stay for navigation).
Each first screen has a nav_map hop or is Contacts; each loads with
run_flows.load_flows and passes the seeded-flow tag test.

Three drafts were fixed so an ordinary run can go green: csd-005's scan
button is gated on there being a camera (desktop renders `${tag}_status`
and no button), csd-092's close step no longer expects `contacts_list` on
a bare node, csd-101's first step accepts the roster's empty shape.

Held, with the reason in each CSD's §5 line and the drafts README:
- floor left `unreleased`, tags built by interpolation with an
  interpolated head (`${tagPrefix}_not_on_this_node`, ConfirmSheet's
  `sheet_$tagPrefix` / `${tagPrefix}_fact_$i` / `btn_${tagPrefix}_*`),
  invisible to test_flows' grep: 032, 036, 040, 045, 100;
- first screen flow-only (no hop; cannot-start on every leg): 033, 046,
  048, 049, 069, 081, 090;
- known red on released nodes (CIRISServer#698): 091.

testing/flows/README.md gains a table of what runs; drafts/README.md now
states the per-file reason and the tag-check blind spot in place of the
stale "#97 not on main" sections.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

emooreatx and others added 11 commits September 29, 2026 11:46
Every cannot-start on the 0.5.225 matrix run (36588619656) — wallet,
provision-accord-holder, household-members, network-content on both desktop
legs, and notes-to-self on macOS — was one race: `CIRISApp.openTab` runs with
the `circleNow` the last composition captured, so a tab clicked before the
frame after the circle click has recomposed opens the OLD circle's tab. Just
me's Rules tab has no Wallet row, its Safety tab has one card and opens
ChildSafety directly, its People tab opens Contacts directly — each reported
as "hop tag 'nav_epistemic_X' never appeared … on 'CircleTab'". A node client
signs in under Neighbours (`defaultCircle`), which is why macOS lost
`circle_agent -> tab_chats` to Rooms as well.

The client now publishes the circle and tab the shell stands in on `/state`
(`circle`, `tab`; the rail's selected state is only a background colour, so
nothing in `/tree` could say). The runner waits for the shell to say a circle
or tab hop landed before clicking the next one, always walks the hop even when
the screen is already showing (Contacts sits in every circle's People tab, and
the previous flow left the shell wherever it left it), and lists what was on
screen when a hop tag never appears — the evidence that named this cause was
missing from every cannot-start line. An older client without the fields is
walked unverified.

Local Linux desktop leg, node v0.5.217, after this: all nine flows reach their
first screen.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM
…nup:`)

`people`, `csd_005_people` and `csd_006_receipt` failed on both desktop legs
of run 36588619656 with `card_contacts_add` / `contacts_list` /
`contacts_row_<peer>` "never appeared", and every one of their on-screen
lists carried `btn_contact_code_close` and `contact_code_error`: csd_092 had
opened the contact-code card — which replaces People's body while open, and
whose open state lives in the view model — and stopped at its failed second
step with the card still up. The ordering (session → fixture-free flows →
two_node → fixture flows) was already right; the leak was inside the screen.

A flow may now declare `cleanup:` — actions run after its steps, pass, fail or
crash. Only the flow knows what it opened; the runner guarantees the closing
runs. A cleanup that fails is recorded in the outcome's detail and the
per-flow JSON, never as the verdict; a target already gone is nothing to
close. csd-092 and csd-005 (whose last step opens the same card) close it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM
csd_092 failed on both desktop legs: `contact_code_error` text "Could not get
your contact code." does not contain "0.5.218 or newer". The client was right
— a bare 404 maps to `ContactCodeState.NodeTooOld` and the card draws "This
node can't make a contact code yet. It needs ciris-server 0.5.218 or newer."
as the error's BODY, which is CSD-092's `error:` contract — but `StateBlock`
registered its tag with the title alone, so the tree could not show the words
the person reads. `ListState.automationText` now joins message, body and
detail, one per line, and the block registers that.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM
Run 36588619656 logged `contact … reachable_nodes=0` on both sides and then
`awaiting_peer` for the whole 150 s on every leg. The fixture waited for the
peer's owner KEY to be known, which lands before the owner→node BINDING;
CIRISServer#699 measured that a contact added while `reachable_nodes=0` keys a
pair room whose bodies read `not_granted` for good, and that re-asking until
it is >= 1 before the room fixes it (3/3 reproduced, 2/2 fixed).

CIRISServer `FSD/TOPOLOGY.md` (chore/adopt-edge-v33) §2.5 defines the
relation: `reachable(A, q) >= n` is "POST /v1/contacts on A for q reports
reachable_nodes >= n (q's owner→node binding held on A at federation scope)";
§3 rule 5 needs one of q's nodes announced, which the fixture's announce is;
§2.3 keeps scoped content to directly-attached peers (CC 5.4.6), which the
peer dialling the leg's node satisfies. No read route answers the predicate,
so `add_contact` re-asks the idempotent POST every 5 s, bounded
(`reachable_wait`, 120 s), and records what it waited on and for how long in
`values.notes`. Cited in the module docstring.

Local Linux leg, node v0.5.217: reachable_nodes=1 after 10 s (3 asks) on the
leg's node, at once on the peer. The room still does not key on the released
line (awaiting_peer after 150 s) — the KeyPackage does not cross between two
unconferred 0.5.217 nodes, as the README already records; the contact, its
row and its five-fact receipt are seeded, and csd_005 / csd_006 pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM
…sleeping 2 s

Windows, run 36588619656: `wizard did not advance past 'you'; on screen:
['btn_next', 'setup_step_indicators', 'step_indicator_join_federation',
'step_indicator_you']`. The app log shows Next clicked with canProceed=true,
the fed-ID auto-minted on Next (`POST /v1/self/identity`), and the node still
minting when the fixture judged — two seconds after the click, with the form
already torn down for the next step. The wizard was working; the fixture's
clock was fixed. `_advanced` now polls (screen, active step) for up to
ADVANCE_TIMEOUT (90 s); a step that truly stalls is still reported by name.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM
…river's reason

With the hop verified, csd_047 reached LayerGlobalCommons for the first time
and failed `click 'tile_federation_content' did not succeed`: the Content tile
is the last row of the hub's grid, composed below the fold, and `/click`
refuses a composed-but-off-screen element (CIRISClient#33). The helper
answered a refusal with False and threw the reason away; the remedy the client
ships for exactly that (`/scroll`) went unused. The session fixture's wizard
had learned this rule (`_reach`); the flow helper had not.

`SyncFlowHelper` now scrolls the target into view on an off-screen refusal —
down to the bottom, then up, bounded — and keeps the driver's last reason,
which the runner appends to "did not succeed".

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM
`/click` returns before the frame that applies it, so an `expect` read in the
same instant sees the screen the click is leaving. On the local Linux leg
(2026-09-29, run 2) three flows failed exactly there — csd_057's back
(`card_wallet_balance` still on screen), csd_092's close (`contact_code_error`
still on screen), csd_006's sheet close (`sheet_receipt` still on screen) —
after their clicks had succeeded. The runner now re-reads the expect every
quarter second until it holds or EXPECT_SETTLE_S (2.5 s) runs out; a condition
that never holds still fails, in that long. The same rule `navigate` already
states for hops: an assertion made in the instant of a click is a race, not a
test.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM
csd_068 reached its screen for the first time on the local Linux leg and
failed `input into 'input_provision_holder_usb_path' did not succeed`: the
key-id, USB-path and PIN fields carried `input_*` tags and nothing subscribed
to them, so `/input` had nothing to apply to (CIRISClient#30). They were three
of check_ui_drivable.py's baseline debt. Declared beside the dispatch, as
SetupScreen does; the baseline drops from 142 to 139 and a source test pins
the three.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM
csd_057's last step clicked `btn_wallet_back` and csd_068's
`btn_provision_holder_back`; neither was on screen on the local Linux leg.
WalletPage draws its own arrow only when it runs outside the shell in a wide
window, and the card sits in a seven-card tab, so the shell draws the back a
person sees (`btn_nav_back`, CirclesShell). Both flows press that; CSD-057 §4
step 6 says so.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM
The gallery job of run 36588619656 died on `unrecognized arguments: --shots`
and warned "gallery build failed; the raw artifacts are still attached", so no
gallery has ever built. The script takes the artifacts directory positionally
and the step passed it as a flag. The parser is now a function the workflow
test parses the step's argv with, so the two cannot drift again; the step also
appends the table to the job summary.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM
The §5 lines of the eight CSDs and the flow README rows say what passed,
skipped and failed on the Linux desktop leg run locally the way
five-platform-live-qa.yml runs it (scratch ports and homes, node v0.5.217,
`--flows testing/flows`, the two-node fixture). None has run on the other four
legs since the fixes; the stages stay `building`.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155SkTGdbwnSnR6tWBqJvUM

This branch has not been deployed

No deployments
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.

1 participant