Repository navigation
LIM-2424: custom record, launch decision, Switch team, Halden fixture (stacked on #6) - #7
Conversation
…block From the Halden browser run on #7: - Conditions come from the owning team's conditions field only. Its reason for asking for changes is shown separately as "Why <team> asked for changes", never as a condition, so the amber "conditions not checked" badge appears only when real conditions exist. - Singular wording when there is one condition. - Drop the "Who decided" section: ProofStrip's "Who approved" tile already names both people with times. - Nav subtitles wrap instead of truncating at 1024 and 1440. Northstar unchanged: snapshot, test-flow and 72/72 UI files identical.
Founder hard lock, Thu Oct 22. Adds scripts/fixtures/halden-country-selection.json (fictional Halden Therapeutics; browser-checked on #7 at 1024 and 1440) and removes clinical-screening-window.json (Halverson), which it supersedes. test-all runs it through test-scenario: 57/57.
… for solo testers Founder ruling P1 #4, custom only: - The decision record adds a fourth status line, "Conditions: not confirmed yet", whenever its Conditions card shows. - The owner's approve panel shows "You asked for: ..." as a read-only reminder. - The "What was decided" summary lists the owning team's conditions. - Copy only, no data change. P1 #7: after a hand-off (propose, ask for changes, accept changes), the waiting team's Proposals card and Next decision view name who acts next and how to play that role. The new components/nextStep.ts returns null in Northstar.
…s, on the record, in MCP and in the agent directive Founder ruling P1 #3 (LIM-2422 fc5ff7ec): no contradictions. Until leadership approves the launch, every custom surface says the teams agreed and the launch is pending. No decision yet, or "not yet", both count as pending. - UI: the record badges read "Agreed by both teams · launch pending" (or "· launch approved"), on the teams' record (DecisionView), on leadership's record (OrgView) and in the header (Home). The strip reads "agreed · launch pending". - UI: the record headline no longer says "is now the shared plan" until the launch is approved. The owner's pre-approval title no longer says "make it the shared plan". - MCP align_get_accepted_plan: the text adds an "Agreed by both teams · launch pending/approved" line. While launch is pending, run_command, an existing string field, carries the pending sentence. No schema change, so the tools/list listing is unchanged. - Agent wake-up directive (custom): adds a "Launch: pending" line telling agents to plan only, or "Launch: approved by ...". Sean's REPLAN safety wording is unchanged. - Northstar paths are untouched. - Checked with lint, tsc and node --check only; no server until the Next.js upgrade. Carried onto #7 (f079f76), #7's record wins where both show conditions: - Record header: #7's amber "Agreed · conditions not checked" badge (real conditions only) beside the launch-pending status badge, which replaces #7's "Agreement reached". - Dropped the record's "Conditions: not confirmed yet" status line (#7's badge and Conditions section say it). - Dropped the "Conditions from <team>" bullet in the Proposals record summary (#7's record shows the conditions). - Conditions everywhere else (approve reminder, leadership's record) come from the conditions field only, never the reason for asking for changes, matching #7.
… conditions badge as the teams' record The "Conditions: not confirmed yet" line is dropped; #7's amber "Agreed · conditions not checked" badge shows beside the launch-pending status when there are real conditions, as on the teams' record.
… Switch team, deletion-day cutoff P1 (founder ruling 10-22, LIM-2422 fc5ff7ec, items 2-5) applied onto #7 @ 580b24c in one change; the six-commit history is on agent/LIM-2424-p1-tester-readiness. Overlaps with #7 resolved to one source in lib/labels.ts. - P1-3, one wording: agreedStatus(launchApproved) gives "Agreed, launch pending" or "Agreed, launch approved". components/launch.ts agreementStatus() delegates to it; the record headers (teams and leadership), the home strip and header, and the custom RATIFIED label use it. Agent surfaces follow leadership's launch decision: the ratify directive and align_get_accepted_plan / align_get_decision_record carry one "Status:" line, and the accepted-plan agreement has launch: pending | approved | not_applicable. The MCP output schema is unchanged (Northstar snapshot). - P1-4, conditions: marked once, by a "Not confirmed yet" badge in the Conditions box on both records (the header badge stays neutral; #7's "Agreed · conditions not checked" badge is gone), with a singular/plural note (conditionsUnconfirmedNote). The counter banner, directive and MCP say the same. Before a proposal the owning team sees "Waiting for <asking team>", not "Needs your judgment". - P1-2, Switch team (LIM-2437 bd53f6f6): a header "Switch team ▾" signs this team out and opens the chosen team's sign-in, preselected, passcode still required; the pill reads "Acting as <team>". ROLE_SWITCH on the sign-in screens and the /new passcode card; nextStepHint's "Next: <lead> …" ends with switchHint(team), so waiting screens have one next step. - P1-5: the hosted server closes at the end of ALIGN_DELETE_BY in Pacific time (it closed at 4 PM PT the day before); test-tenancy P1-5. - Tests: test-scenario P1-3; test-ui-loop P1-2, P1-2b (after a switch the asking team's approval of the owner's goal is 403, state unchanged; a wrong passcode on switch-back is refused), U5, U7, U8 (conditions marked once). Needs Sean: passcode required on every switch; the launch_decision wording on agent surfaces.
…fields capped at 300 with a plain message From Mini S1's hosted Halden rehearsal on #7 (relayed by iMac S1). - F1: the custom Details panel's "Next step" ("<owning> works to goal v2.1; <asking> does what it committed to") read as a go while the page says launch pending. nextWorkLine() shows "Waits for <leadership>'s launch decision. Then: …" until leadership approves. The stored next_work is unchanged (Northstar snapshot). The panel's decision badge uses agreementStatus(), so it says "launch approved" once decided. - F3: the propose and counter target fields take at most 300 characters, matching the server cap, and say "Keep the new target under 300 characters." at the limit instead of the server's raw field name.
Map the --al-* tokens onto the Liminal design-system values v6 uses: near-black page (#0a0a0b), layered frame surfaces, v6 ink levels, Liminal magenta accent (#cc24f5), and the canon watch/alarm/success colours. Truth-colour meanings are unchanged. The display stack becomes a local() Nineties Headliner @font-face with Anton as the fallback; no font files are added. Badges become tone-filled pills (border + tinted bg), buttons follow v6 .btn p/s/g, labels use v6 .lbl sizing. Exported names, props and text are unchanged.
Rebuild the proposal detail as the v6 thread: proposer bubble (current struck grey, proposed, why, in return, test pills), one bubble per counter version (amber, conditions as a numbered list marked not confirmed yet), the acknowledged bubble, and the ratified bubble. Each target version is shown once; the stepper, before/after block, repeated why/in-return sections and timeline are removed. Evidence and What changed upstream are collapsible. The owner answers with Accept / Accept if... (custom only) / Counter / Decline. Accept if... is the existing counter with the target unchanged and the single conditions field written one per line. Same API calls and payloads as before, except approval of STALE evidence now sends accept_untested after the explicit tick (the server refused it otherwise). Role-gated footers offer only actions the server accepts in each state; no withdraw, no try-to-ratify-anyway. test-ui-loop picks Counter before filling the renamed counter field.
allsmog
left a comment
There was a problem hiding this comment.
Review, PR #7 @ 1eb66cf (includes the launch route)
Status: changes requested, small. The launch route is sound on the points that matter. Two items from my look at f079f76 are still open, and there are a few Lows on the new code. Gate: scripts/test-all.sh 3247 on this head, all steps PASS (test-scenario 65/65 on all three fixtures, test-ui-loop 23/23, test-tenancy 136/136, Northstar snapshot and UI 72/72 identical to 850971e).
Launch route (app/api/proposals/[id]/launch/route.ts, lib/flow.ts:259-275): checked
- Leadership only (
forbidfor other actors), custom scenarios only (404 otherwise), and only on a RATIFIED proposal that has an acceptance (409 otherwise). - Workspace-scoped through
requireWsSession+who.mutate, so the M7x-align-workspacecheck applies. test-tenancy A6 proves B's leadership gets 404 on A's proposal with both trees unchanged. - JSON only, 4 KB cap,
decisionis an enum, note is text of at most 500 characters, and the audit records the decision and proposal id, never the note. launchApprovedreads the latest acceptance, so a decision on an older proposal never shows as approval for a newer agreement, and a new agreement starts as launch pending. Correct.- The hosted allowlist adds only
launchto the existing proposal-action pattern (proxy.ts:23), and test-tenancy's route list is updated to match. - The agent directive, the MCP summary and
run_commandall say launch is pending until leadership approves, and that conditions are not confirmed. Good: agents can't read "agreed" as "go". - The new copy is scoped to custom (
!L.northstarandcustomguards), andcustomStateLabelreturns undefined for Northstar.
Still open from f079f76
- Fictional label (required).
scripts/fixtures/halden-country-selection.jsonstill never says the company and scenario are fictional, and the company name shows on screen once it's loaded. One "Fictional company and scenario" line covers it. - Northstar nav (required). Removing
truncate(components/Home.tsx, nav subtitles) still applies to Northstar's shared nav. Scope it to custom, or drop "Northstar untouched" from the description.
Lows on the new code
- The launch route skips the same-origin check. Every other cookie-authenticated write goes through
bodyFor(JSON plus Origin matching Host, port included, the M4 rule). This route usesrequireJson+cappedJsondirectly. Requiring JSON already forces a CORS preflight, so the cross-site risk is small, but it's the only write route that departs from the rule. AddrequireSameOrigin(req), and add a cross-port case for it to test-tenancy. - No rate limit on launch decisions. Each call adds an audit row. The archive is now bounded, so this is cosmetic;
takeWorkspaceAction(who.ws, "launch")matches Restart and connect. - MCP
outputSchemadoesn't declareagreement.launch(lib/mcp/register.ts,AcceptedPlanOut). Structured readers learn the launch state only from the text inrun_command. If keeping the Northstar MCP baseline byte-identical is the reason, say so in a comment. - Leadership's team name goes into the agent directive unquoted (
lib/directives.ts, status line). Same class as the openquoted()newline gap on #6 (fix 4). When that lands, run team names through it too. - Deletion cutoff uses a fixed +32 h, which is midnight PST. Right for 2026-11-06, which falls after DST ends; during daylight time it would be 1 AM. Fine as is; worth a comment.
- The PR body's Tests section still cites head
f079f76. Update it for this head. - From before: numbered conditions split on every newline, and no test covers a counter with a reason but no conditions.
Merge recommendation
Not before #3 to #6 land (#6 has changes requested). On this PR, items 1 and 2 plus the same-origin line on the launch route, then it's ready from my side.
…is) and Decisions list Record: one status pill (agreementStatus; Northstar keeps Agreement reached), amber while conditions are open; Approved / Only proposed / Never tested columns; conditions marked once with CONDITIONS_UNCONFIRMED; reason shown as Why <team> asked for changes; launch line from components/launch.ts; who decided once (custom: ProofStrip Who approved; Northstar: owner-first card, no manual estimate); measured + verified tiles; Copy text; Move running work. Receipts: audit log, SpartaProof (custom: No sandbox runs in this scenario), coordination timer. New DecisionsView with All/Open/Accepted.
…eement.launch isn't in the MCP schema) Sean's review of #7 @ 1eb66cf, Lows: - testServerClosesAt: the fixed +32 h is midnight PST; during daylight time it is 1 AM. The test dates fall after DST ends. - AcceptedPlanOut: agreement.launch is deliberately not declared, so the tool listing (part of the Northstar snapshot) stays byte-identical; the schema isn't strict, so the field still reaches structured readers. Comments only.
Rail: + New conflict, then Your turn, Company goal (leadership only), Goals, Scenario Studio (disabled with its reason without sandbox runs), Decisions, Work, and the current user. Your turn is every role's landing view: waiting on you, waiting on others and changed today, from state only, statuses from lib/labels.ts and components/launch.ts. Switch team and Acting as unchanged. test-ui-loop: nav selectors renamed (Proposals, Next decision).
…Work old-plan sweep, setup sentence - GoalsView: company node, team nodes and dependency node; Everything/team lens dims the other side; selected-node strip with one real next step. Labels from labelsFor; custom wording from launch.ts. - BriefDrawer: Ways forward (work completed vs goal achieved, P0-P2 options, collapsibles). Custom shows no ranked options and no Studio link. - v6/ScenarioStudio (new): compares recorded runs only, Northstar only; custom says Not sandbox-tested. No run button. - v6/OldPlanWork (new): Work still on the old plan, not-built keep/re-scope/stop card, copy a nudge; GoalCascade. WorkMap shows both above the agent lanes. - ScenarioForm: live one-sentence preview above the unchanged stacked fields. - TeamLens, SpartaProof, EvidenceView: v6 restyle; depRelation reads dependencyId(s).
Conflict in components/ProposalsView.tsx: took W3's message thread, kept 820aa15's launch-aware status. The ratified message's custom badge uses agreementStatus(acc) (components/launch.ts) instead of the fixed AGREED_STATUS; StateBadge keeps customStateLabel from lib/labels.ts.
Conflict in components/DecisionsView.tsx (add/add): took W4's real Decisions list over W2's one-line placeholder.
- Scenario Studio renders components/v6/ScenarioStudio (W5); Run details
("evidence") keeps EvidenceView. W2's disabled Studio nav for scenarios
without a sandbox is unchanged.
- Work stays on WorkMap, which W5 completed: old-plan sweep, goal cascade,
then the agent lanes (WorkScreen is the same minus the lanes).
- Decisions renders W4's DecisionsView; the record's header gets a
"← Decisions" back link (Mini S3 4cddbad onBack pattern). "Move running
work" already goes to Work.
- Custom wording: Goals' missing-goal cards use the custom team name, and
WorkMap's "Confirmed by" uses labels' person names instead of a fixed
Product Director / Alex map (identical strings in Northstar).
…(iMac S3) (a) Northstar STALE approval. The checkbox now reads "The sandbox test no longer matches this plan. I'm approving it without a passing test." It still sends accept_untested: true. The server stores that approval as test_status UNTESTED plus a ratify_untested audit row; the Northstar record (header and copied text) and the ratified thread message now show STALE_APPROVAL_NOTE when that audit row exists for the proposal, alongside the existing "Sparta · not verified / Test status" tile. (b) Refusal demo restored. While a proposal waits on the owning team, the non-owner sees "Try to approve (only <owner> can)", with <owner> from labels (L.team.security). It POSTs the real /accept endpoint directly (not through props.run, so no global error banner and no refresh); on the server's 403 it shows "Handed back: only <owner> can approve this". The server refuses before any write, so nothing changes. (c) Why test-ui-loop's U4 selectors changed (merged from W3): the v6 review thread no longer shows the counter textarea by default. The owning team first picks an answer (Accept / Accept if... / Counter / Decline), and the ask-for-changes form appears only under "Counter". Its field was also renamed from "Or ask for changes" to "Ask for changes: your version of the target". So U4 now clicks "Counter" before filling that field. The checks U4 makes (the counter and its conditions reach the server) are unchanged.
The Northstar autopilot drove pre-v6 controls that no longer exist
("Proposals" nav, "Show impact", "Review priorities", "Acknowledge revised
terms", "Ratify my goal revision", "Evidence" nav). It now walks the v6 path:
Leadership "Approve and send to teams"; Product Goals -> "See ways forward"
-> "Test in Scenario Studio" -> "Add test results to the proposal" ->
"Send proposal to ..."; each team opens its proposal from its Your turn
card; Security answers with the Counter option and "Ask for changes",
Product accepts the changes, Security approves; Act 4 ends on Decisions
(the record) and Scenario Studio.
Also: nav matching uses the label's start (v6 nav items can carry a count
badge), the caption overlay no longer intercepts clicks (pointer-events:
none; it covered "See ways forward"), and AUTOPILOT_HEADLESS=1 runs it
without windows and exits non-zero on any missing step.
Checked headless with --fast --no-agent against a dev server: Acts 1 and 3
complete and policy moves to p-beta@1 under Security goal v2.1 (TESTED).
Act 2's mapping wait timed out there because no mapper is configured in a
bare dev server; Act 4 (Claude Code in tmux) was not run.
The v6 rail bolds the whole nav button, so span.font-semibold no longer exists and ui-snapshot crashed before writing any file. It now takes the first span's first line (the label; a count badge or the no-sandbox note never comes first), with the old selector kept as the first choice.
TryApprove called /accept without the workspace header, so after Switch
team in another tab a stale asking-team screen really approved as the owner.
Now it first re-reads /api/session (the header's source) and refuses on the
client, with no request, unless the signed-in role is still the waiting
non-owner in this page's workspace; the request then carries the workspace
exactly as act() does. ViewProps gains `workspace` ("northstar" or the /w
slug) for that.
test-ui-loop U5b/U5c: the owner sees no button; the asking team's click is
handed back (403) with state unchanged; a second asking-team tab with its
state polls blocked (a backgrounded tab) does not approve after the first
tab switches the browser to the owner: no accept request, state unchanged.
U5c fails with the session check removed (checked by hand).
In Northstar, leadership's + New conflict went to /setup, which replaces the shared demo store. Founder default (S1): hide it in Northstar for every role; custom scenarios keep it unchanged.
…ake it (S3 review) The button showed while a proposal was already open, where the attachment goes nowhere but the label still read Attached. It now renders only for the asking team while no proposal is open.
…at Work lists (S3 review) "Move running work → N items" became "See work still on the old plan (N)". N was counted separately in the record (every item under the replaced goal); it now comes from stillOnOldPlan() in v6/OldPlanWork.tsx, the same items the Work screen's headline counts.
…review) WorkMap polled /api/mappings every 3 s in every scenario (403s in /w custom workspaces) and showed automatic-linking copy that custom doesn't do. The lanes and their poll move into AgentLanes, mounted only in Northstar; custom Work shows the old-plan sweep and the goal cascade.
Conflict in components/Home.tsx, rail item body: took v6's rail (label only, the no-sandbox note), so 37ad24b's nav-subtitle line goes away with the subtitles. #7's company_note merged without conflict: under the company name in the custom header (now v6's header), on WorkspaceLogin and on NorthstarLogin. useAlign.ts (409 handled only for workspace_mismatch, api() errors carry code) and every server, script and fixture change from #7 are taken as they are; test-ui-loop.mjs merged cleanly (#7's CN4 checks and v6's U5b/U5c both present).
…S3 Low) Custom scenarios have no sandbox, so the rail no longer shows Scenario Studio there at all (it was disabled with a "No sandbox" note). Northstar keeps it. Also drops an unused variable in ui-snapshot.mjs (lint warning).
#7's L409 browser checks clicked the pre-v6 "Proposals" nav item. (a) now opens the proposal from Security's Your turn card ("Review the proposal"); (b) opens the composer with + New conflict, as test-ui-loop does. The checks themselves are unchanged.
allsmog
left a comment
There was a problem hiding this comment.
Re-approval, PR #7 @ 3cd7f8a (delta from bc67edf)
Status: approved. Three commits since my approval: 41fa4d6 (fixtures drop confirm; callers add it), 260a252 (company_note, /new notice wording), 3cd7f8a (my VT/FF/NEL Low). Gate: scripts/test-all.sh 3247 on this head, all steps PASS: test-scenario 73/73 on all three fixtures, test-ui-loop 25/25, test-tenancy 166/166, test-mcp, test-capture and test-mapper pass, Northstar snapshot and UI 72/72 identical to 850971e.
Checked
- Item 1, fictional label: still resolved, in a better form.
company_note("Example company (fictional), based on an anonymized real workflow.") is on all three fixtures and ondata/scenarios/example-custom.json. It shows under the company name in the custom header (components/Home.tsx) and on both sign-in screens, so anyone who sees "Halden Therapeutics" sees the label too. Halden's plan text is back to the locked wording. - Schema change.
company_note: text(200).optional()inside the strictScenarioInput(lib/scenario.ts), stored last inscenario_configand only when sent. Rendered as React text, so no markup path. - Public exposure. login-info and the anonymous
/api/state(viewFor,lib/flow.ts) addcompany_noteonly for custom workspaces that set one. That's the same tier as the company name, which is already public on the sign-in screen. Northstar's anonymous view is unchanged; test-b1 passes. - Agents never read it. No
company_noteinlib/mcp,lib/directives.tsorlib/policy.ts, so no new prompt-injection surface. confirmremoved from fixtures. Every caller I found adds it back:app/setup/page.tsx:51, test-b1, test-scenario, test-tenancy. No doc or script posts a fixture file directly.- VT/FF/NEL.
oneLineis now/[\r\n\v\f\u0085 ]+/g(lib/directives.ts:66).
Lows (non-blocking)
- The /new and /setup forms don't send
company_note(toBodyincomponents/ScenarioForm.tsxhas no field for it), so only API-loaded fixtures carry the label. That's fine for the locked fixtures. If testers ever rebuild Halden by hand, the label is lost. - Agents see
company("Halden Therapeutics") inalign_get_accepted_planwithout the label. That's harmless to an agent, but if agent transcripts get shown or shared, the fictional note won't be in them. - The /new notice says "You can request earlier deletion" but doesn't say how. Add a contact (an email address) so the promise has a path.
Merge recommendation
Unchanged: ready from my side. It lands as one unit with #3 to #6 after the pitch; main stays at e9ef581f for Friday. For go C, what's left is my Fly smoke test.
|
Sean: the head moved past your What v6 changes vs 3cd7f8a: client components, styles ( Re-baseline (last commit,
Behaviour changes to look at:
Gates at a54570f: Not run: the autopilot's Act 2 (mapping wait times out headless on a bare dev server, not confirmed against base) and Act 4 (tmux). |
Landing plan for the stack (#3 to #7)My approval is on #7 @
Two questions:
|
|
Correction to the tester date I gave earlier (iMac S1): the first testers are Tue Oct 27, not Mon Oct 26. The founder's tester sequence (LIM-2437 ac143caa, Thu ~4:20 PM) is: QA on the hosted build Sat Oct 24 to Mon Oct 26, go/no-go Mon after the 3 PM daily, Wave 1 (two testers) Tue Oct 27, Wave 2 Mon Nov 2 to Tue Nov 3, feedback by Wed Nov 11. I had cited an earlier tester email that this ruling superseded. So hosting has to be live by Sat Oct 24, for QA. The PR body is corrected. |
|
Final head for your review:
|
Review: PR #7 @
|
allsmog
left a comment
There was a problem hiding this comment.
Review, PR #7 @ a54570f (the 27 v6 commits on top of 3cd7f8a, now on main via #9)
Status: approved, with follow-ups. This approval includes my sign-off on the Northstar UI re-baseline (a54570f). Gate: scripts/test-all.sh 3247 on this head, all steps PASS: test-scenario 73/73 on all three fixtures, test-ui-loop 30/30, test-tenancy 166/166, test-mcp, test-capture and test-mapper pass, Northstar API snapshot and test-flow identical to 850971e, ui-northstar 125 files matching the new baseline.
I checked main @ 95c43be too: its tree is byte-identical to 3cd7f8a, so #9 landed exactly the approved commit.
Scope checked
- Client only:
components/,components/v6/,app/globals.css, and the test scripts. No changes underlib/orapp/api, so the server, auth and tenancy surface is the one I already approved. - No new
dangerouslySetInnerHTML,innerHTML,eval, fetch calls or external URLs.scripts/test-all.shandscripts/test-ui-northstar.share unchanged. - No weakened tests that I found. test-ui-loop gained U5b/U5c, and test-tenancy L409 follows the new way of opening a proposal.
- Still present: the Elsewhere notice, Switch team,
company_note, 409 reasons and the stale-tab guard (stronger now,TryApprove), the conditions-unconfirmed labels, and the launch decision.
What changes for Northstar (what I'm signing off on)
- Navigation: Next decision / Goals / Proposals / Evidence becomes Your turn / Goals / Scenario Studio / Decisions / Work for every role, and Leadership keeps Company goal. Every role lands on Your turn.
- Screens: Goals becomes a tree with a lens. Proposals become a message thread, with the step tracker and per-check table folded under Evidence. The record gets Summary / Receipts / How to read this. "+ New conflict" is hidden.
- Agent pane: the live agent pane and the 2/9 vs 9/9 at-a-glance cards no longer show before agreement. The agent's hold is visible only in Work.
Follow-ups (fix before the hosted QA on Sat Oct 24)
- Medium: the time-to-agreement clock no longer starts on its own. The server starts it only on
ceo_change_viewed(lib/flow.ts:30). On3cd7f8a, landing on Next decision fired it (DecisionView.tsx:96). On v6 it fires only on three clicks: the header pill (Home.tsx:571), Your turn's "See goals" (YourTurnView.tsx:254), or the CEO node in Goals (GoalsView.tsx:166). A Product user who goes straight to "Propose a change" never starts it, and the record then shows "Not started" (v6/record.tsx:139). Fix: markceo_change_viewedwhen Your turn shows the CEO change, asDecisionViewdid on mount. Add a test-ui-loop check that the record shows a measured time after the shortest path. - Medium: the baseline label is now false.
test/snapshots/ui-northstar-850971eholds thea54570ftext, and the gate prints "identical to 850971e (125 files)". Rename the folder to the v6 commit, updatescripts/test-ui-northstar.sh, and keep 850971e only for the API snapshot and test-flow, which really are unchanged. - Medium:
docs/DEMO_SCRIPT.mddescribes the old screens (lines 41, 57, 68, 103-104: Next decision, Proposals, Evidence). That's right for the pitch onmaintomorrow. Update it in this PR so it matches the UI once it lands. - Low: the "Receipts" tab (
v6/record.tsx:43) labels results thatEvidenceView.tsx:200says "aren't signed". Call it "Activity" or "Evidence". - Low: jargon in Northstar copy.
- "Clashes with KR2" (
GoalsView.tsx:64; it used to say "Clashes with the CEO's new requirement") and "KR2 changed today". - "P0/P1/P2" priorities in the brief (
BriefDrawer.tsx), which collide with "P0" incidents in Security's counter text. - Raw plan ids on the Studio result cards (
ScenarioStudio.tsx:44-45). - Developer copy: "Needs a decision field on work items. Not built yet." (
v6/OldPlanWork.tsx:120), andscripts/run-plan.shin Studio.
- "Clashes with KR2" (
- Low: leftovers.
- Goals "Open record" for Northstar goes to the Evidence screen (
GoalsView.tsx:92). - The record still says "read What to do next" and "opened Evidence" (
v6/record.tsx:184-186). - The proposal thread shows raw state chips ("ratified", "acknowledged").
WorkScreen(v6/OldPlanWork.tsx:145) is unused, and the pre-agreement branches ofDecisionViewandTodayViewcan no longer be reached.
- Goals "Open record" for Northstar goes to the Evidence screen (
Merge recommendation
Ready to merge from my side after the pitch, ideally with follow-ups 1 to 3 in. It isn't needed for Friday, since the pitch runs from main @ 95c43be. #8 rebases onto main once this lands.
|
@allsmog: thanks for the approval at Follow-ups are in #10 (
Correction: "the pitch runs from main @ 95c43be" isn't quite right. Friday's pitch uses a recorded video made at |
Follow-up to my approval @
|
…, composer after a decision Fixes three v6 regressions found in review of #7 (comment 6356535154), before tester QA: - Your turn: a "not_yet" launch decision is still pending, so leadership keeps "Decide the launch" (and its badge count) and the teams keep "Leadership decides the launch". Both cards now gate on launchState(acc) !== "approved" instead of on any launch decision existing. - Your turn starts the time-to-agreement clock when it shows the unresolved company change, as DecisionView did when it was the landing view (Sean's #7 follow-up 1). The shortest path no longer leaves the record "Not started". - "+ New conflict" and the "Propose a change" card open the composer after a ratified proposal, through a one-visit compose request in ViewProps, instead of reopening the decided thread. Tests: test-ui-loop U11 (clock started with no goals click), U12 (not_yet keeps the launch decision for leadership and the teams), U13 (composer after a ratified proposal). All four checks fail with the component fixes removed and pass with them. Sean's #7 follow-up 2: the Northstar UI baseline moves from test/snapshots/ui-northstar-850971e (which held a54570f's text) to test/snapshots/ui-northstar-v6, re-captured on a production build of this commit. The only changes against a54570f's capture are the clock now running (touchpoints, steps, time taken), in 21 run-details/record/goals files. 850971e stays the label for the API snapshot and test-flow. Gate: scripts/test-all.sh 3247, all 15 steps pass (test-ui-loop 34/34, test-tenancy 166/166, test-scenario 73/73 on all three fixtures, ui-northstar 125 files identical to the v6 baseline).
…code) From Sean's #7 review (items 4 to 6) and the review in comment 6356535154: - Record: the "Receipts" tab is now "Activity". The results aren't signed (EvidenceView says so), so "Receipts" overclaimed. - Goals (Northstar): "Clashes with KR2" is back to "Clashes with the CEO's new requirement", and "KR2 changed today" is "Requirement changed today", as in custom scenarios. - Goals (Northstar): "Open record" opens the decision record, not the old Evidence screen. - Record audit and touchpoint wording: "read Ways forward", "opened the test results", plus plain words for the actions the server writes (ratify_untested, reject, launch_approved, launch_not_yet). The dead "launch" key is removed. - Work: "Needs a decision field on work items. Not built yet." is now user copy ("Coming next: ..."), and the unused WorkScreen export is gone. Northstar UI baseline re-captured: exactly those four strings change (Activity, Clashes with the CEO's new requirement, Requirement changed today, the Coming next line), in 39 files. Nothing else. Left for a founder or Sean call (wording or design): P0/P1/P2 in the brief, raw plan ids on the Studio cards, raw state chips in the thread, scripts/run-plan.sh lines on the test-results screen, and removing the unreachable pre-agreement branches of DecisionView and TodayView. Gate: scripts/test-all.sh 3247, all 15 steps pass (ui-loop 34/34, tenancy 166/166, scenario 73/73 x3, ui-northstar 125 files identical to the new baseline).
…code) From Sean's #7 review (items 4 to 6) and the review in comment 6356535154: - Record: the "Receipts" tab is now "Activity". The results aren't signed (EvidenceView says so), so "Receipts" overclaimed. - Goals (Northstar): "Clashes with KR2" is back to "Clashes with the CEO's new requirement", and "KR2 changed today" is "Requirement changed today", as in custom scenarios. - Goals (Northstar): "Open record" opens the decision record, not the old Evidence screen. - Record audit and touchpoint wording: "read Ways forward", "opened the test results", plus plain words for the actions the server writes (ratify_untested, reject, launch_approved, launch_not_yet). The dead "launch" key is removed. - Work: "Needs a decision field on work items. Not built yet." is now user copy ("Coming next: ..."), and the unused WorkScreen export is gone. Northstar UI baseline re-captured: exactly those four strings change (Activity, Clashes with the CEO's new requirement, Requirement changed today, the Coming next line), in 39 files. Nothing else. Left for a founder or Sean call (wording or design): P0/P1/P2 in the brief, raw plan ids on the Studio cards, raw state chips in the thread, scripts/run-plan.sh lines on the test-results screen, and removing the unreachable pre-agreement branches of DecisionView and TodayView. Gate: scripts/test-all.sh 3247, all 15 steps pass (ui-loop 34/34, tenancy 166/166, scenario 73/73 x3, ui-northstar 125 files identical to the new baseline).
Sean's #7 integration-pass follow-up (Medium): ProposalsView tells the owner "<asking team> sees that you declined", but nothing showed it. DecisionsView filtered out REJECTED and Your turn skipped it, so after a Decline the asking team only got a fresh "Propose a change" card. - Decisions lists declined proposals: a "Declined" pill, "Declined by <owner> · <target>", the time of the reject audit event, and a Declined filter shown once there is one. A row opens the proposal. - Your turn: when the latest proposal was declined, the asking team's "Propose a change" card says "<owner> declined your last proposal." Test: test-ui-loop U14 (fresh fixture → propose → owner declines → the asking team's Your turn and Decisions both name the decline). It fails with the component change removed and passes with it. U10 now reads the agent's wake-ups before U14 replaces the scenario, which clears them. Gate: scripts/test-all.sh 3247, all 15 steps pass (ui-loop 35/35, ui-northstar 125 files unchanged against the v6 baseline).
Sean's #7 integration-pass follow-up (Medium): ProposalsView tells the owner "<asking team> sees that you declined", but nothing showed it. DecisionsView filtered out REJECTED and Your turn skipped it, so after a Decline the asking team only got a fresh "Propose a change" card. - Decisions lists declined proposals: a "Declined" pill, "Declined by <owner> · <target>", the time of the reject audit event, and a Declined filter shown once there is one. A row opens the proposal. - Your turn: when the latest proposal was declined, the asking team's "Propose a change" card says "<owner> declined your last proposal." Test: test-ui-loop U14 (fresh fixture → propose → owner declines → the asking team's Your turn and Decisions both name the decline). It fails with the component change removed and passes with it. U10 now reads the agent's wake-ups before U14 replaces the scenario, which clears them. Gate: scripts/test-all.sh 3247, all 15 steps pass (ui-loop 35/35, ui-northstar 125 files unchanged against the v6 baseline).
Builds the reviewed Align UX (Claude Design "Align App v6" / "Align Tool Concepts v2") into the custom-scenario screens testers use. Adds leadership's launch decision and in-app team switching, hard-locks Afshar's Halden test scenario, and carries every fix from Sean's #6 and #7 reviews. Northstar's API is unchanged; its UI text is re-baselined for v6 (Sean signs off). Draft; nothing merges before the pitch, and it lands as one unit.
Sessions contributed in turns under founder ruling "B" (5 open PRs, no new ones). Every push was a fast-forward, after iMac S3's review and iMac S1's
test-all.1. Decision record and Halden (iMac S1):
0d86ee6,b7aa7e4,f079f76conditionsfield only. The owner's reason shows separately ("Why asked for changes") and is never shown as a condition.scripts/fixtures/halden-country-selection.jsonand removes Halverson (clinical-screening-window.json).2. Leadership's launch decision (Mini S0):
5ef9ca9…580b24cPOST /api/proposals/[id]/launch: custom only, leadership only (403), RATIFIED with an acceptance (409). The body isapprovedornot_yetplus an optional note of at most 500 characters, which never goes into the audit log.Acceptance.launch_decision(data change), plus the OrgView launch UI.3. Wording, Switch team, deletion day (iMac S3):
580b24c..1eb66cf,820aa15labels.agreedStatus. Conditions are marked once ("Not confirmed yet").4. Sean's #7 review (iMac S1):
8635202,37ad24btruncateclass.5. Sean's #6 review fixes, rebased onto this head
3888e5e. Origin check on mapping decisions, sign-out and the launch route; launch rate limit; every agent-facing line and title goes throughquoted()/oneLine(), including the decision-record summary.c652cf0.useAlignreloads only onworkspace_mismatch; other 409s show their reason.4b7a255. Closed mode: afterALIGN_DELETE_BYevery request gets 410 and the purge still works.align-watchexits 1 on 401/403 with one line;agent-session.shprintsexpires_at.bc67edf. Includes Restart bumping the epoch before the state write, and HOSTING.md limits.6. Founder label and test-server notice (Mini S2):
260a252company_note(INPUT SCHEMA CHANGE): one founder-ruled label, "Example company (fictional), based on an anonymized real workflow.", on all three fixtures. It is shown in the custom header and on sign-in. Halden is back to its locked text apart from this label.7. Align App v6 screens (iMac S1 integration of 5 parallel builds; iMac S3 review):
3ef5cb0+ merged506668…a54570fTests at head
a54570f23298fa903b35a7f2b8b2f65d3d21e13bscripts/test-all.sh: all 15 steps pass (iMac S1 and iMac S3, each independently).Review state
bc67edf(01:30Z, Oct 23) and RE-APPROVED3cd7f8a(02:10Z). The head has since moved toa54570f(section 7): his ui-northstar sign-off and a re-approval are requested.hosted-tls/cert.pem, reported by Mini S3), which expires Fri Oct 23, 5:04 PM PT. That cert is not a Fly app or the pitch host. Founder tester sequence (LIM-2437 ac143caa): QA on the hosted build Sat Oct 24 to Mon Oct 26, go/no-go Mon after the 3 PM daily, Wave 1 testers Tue Oct 27.company_note, so a hand-rebuilt Halden loses the label; agents see the company without the label; "You can request earlier deletion" has no contact path (founder copy call).These results are regression-clean; Sean's review is the security gate.
Base: #6 (
agent/LIM-2424-pr5-adversarial-fixes).https://claude.ai/code/session_01WgVzmgWS6wETjetB3xmJ1q