Skip to content

LIM-2424: custom record, launch decision, Switch team, Halden fixture (stacked on #6) - #7

Merged
liminalshruti merged 27 commits into
mainfrom
agent/LIM-2424-v6-custom-record
Oct 23, 2026
Merged

liminalshruti merged 27 commits into
mainfrom
agent/LIM-2424-v6-custom-record

Conversation

@liminalshruti

@liminalshruti liminalshruti commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

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, f079f76

  • Conditions come from the owning team's conditions field only. The owner's reason shows separately ("Why asked for changes") and is never shown as a condition.
  • Multi-line conditions are numbered; the duplicate "Who decided" section is gone.
  • Halden hard lock (founder, LIM-2438): adds scripts/fixtures/halden-country-selection.json and removes Halverson (clinical-screening-window.json).

2. Leadership's launch decision (Mini S0): 5ef9ca9 … 580b24c

  • New route POST /api/proposals/[id]/launch: custom only, leadership only (403), RATIFIED with an acceptance (409). The body is approved or not_yet plus an optional note of at most 500 characters, which never goes into the audit log.
  • New field Acceptance.launch_decision (data change), plus the OrgView launch UI.
  • The record, the MCP accepted-plan output and the agent directive say "launch pending" until leadership approves.

3. Wording, Switch team, deletion day (iMac S3): 580b24c..1eb66cf, 820aa15

  • One agreement wording from labels.agreedStatus. Conditions are marked once ("Not confirmed yet").
  • In-app Switch team (founder ruling): signs out and opens the chosen team's sign-in. Each team still needs its passcode.
  • Deletion-day cutoff enforced; F1/F3 fixes from the hosted Halden rehearsal.

4. Sean's #7 review (iMac S1): 8635202, 37ad24b

  • Item 1: a "fictional" label on Halden (now superseded by section 6). Test F17: a reason-only counter stores the rationale and no conditions.
  • Item 2: the nav-subtitle wrap applies to custom only; Northstar keeps its original truncate class.

5. Sean's #6 review fixes, rebased onto this head

  • Fixes 2+4 (Mini S1): 3888e5e. Origin check on mapping decisions, sign-out and the launch route; launch rate limit; every agent-facing line and title goes through quoted()/oneLine(), including the decision-record summary.
  • Fix 1 (Mini S0): c652cf0. useAlign reloads only on workspace_mismatch; other 409s show their reason.
  • Fixes 3+5 (Mini S2): 4b7a255. Closed mode: after ALIGN_DELETE_BY every request gets 410 and the purge still works. align-watch exits 1 on 401/403 with one line; agent-session.sh prints expires_at.
  • Lows (Mini S3): bc67edf. Includes Restart bumping the epoch before the state write, and HOSTING.md limits.

6. Founder label and test-server notice (Mini S2): 260a252

  • company_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.
  • /new notice uses the ruled text (deletion by November 13, 2026), rendered once.

7. Align App v6 screens (iMac S1 integration of 5 parallel builds; iMac S3 review): 3ef5cb0 + merge d506668 … a54570f

  • New rail: Your turn, Goals, Scenario Studio (Northstar only), Decisions, Work, plus "+ New conflict" (custom only). The proposal is a review thread; the decision record has tabs; Goals has a tree with a team lens; Work shows what's still on the old plan.
  • "Try to approve (only can)" refusal demo, with a client-side session check and the workspace header. The STALE approval wording and record note.
  • Client components, styles and test scripts only.

Tests at head a54570f23298fa903b35a7f2b8b2f65d3d21e13b

scripts/test-all.sh: all 15 steps pass (iMac S1 and iMac S3, each independently).

  • frozen, lint, typecheck, syntax: pass
  • Northstar API snapshot identical to 850971e; test-flow identical
  • test-scenario 73/73 on example, Halden and partner-program
  • test-ui-loop 30/30
  • test-mcp, test-capture, test-mapper: pass
  • test-tenancy 166/166
  • ui-northstar re-baselined to 125 files (needs Sean's sign-off)

Review state

  • Sean APPROVED bc67edf (01:30Z, Oct 23) and RE-APPROVED 3cd7f8a (02:10Z). The head has since moved to a54570f (section 7): his ui-northstar sign-off and a re-approval are requested.
  • Before go C: Sean's Fly smoke test. Still open: the sign-out token note (LIM-2437) and the Mac mini's local QA proxy cert (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.
  • Sean's new Lows (not blocking): /new and /setup can't send 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).
  • Autopilot Act 2 (headless mapping wait) and Act 4 (tmux) were not run on v6.

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

liminalshruti added a commit that referenced this pull request Oct 22, 2026
…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.
liminalshruti added a commit that referenced this pull request Oct 22, 2026
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.
@liminalshruti liminalshruti changed the title LIM-2424: custom decision record says who decided and flags open conditions (stacked on #6) LIM-2424: custom record flags real conditions; Halden fixture (stacked on #6) Oct 22, 2026
liminalshruti added a commit that referenced this pull request Oct 22, 2026
… 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.
liminalshruti added a commit that referenced this pull request Oct 22, 2026
…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.
liminalshruti added a commit that referenced this pull request Oct 22, 2026
… 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.
liminalshruti added a commit that referenced this pull request Oct 22, 2026
… 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.
liminalshruti added a commit that referenced this pull request Oct 22, 2026
…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.
@liminalshruti liminalshruti changed the title LIM-2424: custom record flags real conditions; Halden fixture (stacked on #6) LIM-2424: custom record, launch decision, Switch team, Halden fixture (stacked on #6) Oct 22, 2026
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 allsmog left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 (forbid for 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 M7 x-align-workspace check applies. test-tenancy A6 proves B's leadership gets 404 on A's proposal with both trees unchanged.
  • JSON only, 4 KB cap, decision is an enum, note is text of at most 500 characters, and the audit records the decision and proposal id, never the note.
  • launchApproved reads 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 launch to 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_command all 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.northstar and custom guards), and customStateLabel returns undefined for Northstar.

Still open from f079f76

  1. Fictional label (required). scripts/fixtures/halden-country-selection.json still 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.
  2. 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 uses requireJson + cappedJson directly. 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. Add requireSameOrigin(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 outputSchema doesn't declare agreement.launch (lib/mcp/register.ts, AcceptedPlanOut). Structured readers learn the launch state only from the text in run_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 open quoted() 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.
liminalshruti added a commit that referenced this pull request Oct 23, 2026
…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 allsmog left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 on data/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 strict ScenarioInput (lib/scenario.ts), stored last in scenario_config and only when sent. Rendered as React text, so no markup path.
  • Public exposure. login-info and the anonymous /api/state (viewFor, lib/flow.ts) add company_note only 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_note in lib/mcp, lib/directives.ts or lib/policy.ts, so no new prompt-injection surface.
  • confirm removed 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. oneLine is now /[\r\n\v\f\u0085

]+/g (lib/directives.ts:66).

Lows (non-blocking)

  • The /new and /setup forms don't send company_note (toBody in components/ScenarioForm.tsx has 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") in align_get_accepted_plan without 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.

@liminalshruti

Copy link
Copy Markdown
Collaborator Author

Sean: the head moved past your 3cd7f8a approval. It now carries the Align App v6 screens: a54570f23298fa903b35a7f2b8b2f65d3d21e13b (fast-forward; iMac S3 reviewed it, including a 192-view browser walk at 1440 and 1024). Two asks: sign off the ui-northstar re-baseline, and re-approve the head.

What v6 changes vs 3cd7f8a: client components, styles (app/globals.css) and test scripts only. No app/api, lib/, proxy.ts or data file changes. Nothing from agent/align-v2 (#8): 8405c8f and 07e5cf6 are not in it, and git grep ALIGN_V2 finds 0.

Re-baseline (last commit, a54570f): ui-northstar goes from 72 to 125 files.

  • 94 nav views per stage and role: your-turn, goals, scenario-studio, decisions, work, plus leadership's company-goal. The old next-decision, proposals and evidence nav views are gone.
  • 31 deep screens that are now pinned: the proposal review (11), the decision record (3) and run details (17).
  • The refusal demo "Try to approve (only Security can)", the STALE checkbox label and the "approved without a passing test" record note are all in the snapshot text.
  • The Northstar API snapshot, test-flow stdout and the MCP checks are byte-identical (not re-baselined).

Behaviour changes to look at:

  1. "Try to approve" re-reads /api/session and refuses on the client unless the viewer is still the waiting non-owner. The request carries the workspace, so a stale tab after Switch team can't approve. Covered by test-ui-loop U5b/U5c.
  2. STALE approval: the checkbox says the sandbox test no longer matches the plan; the record shows the note. (Still inferred from the ratify_untested audit row, which is trimmed at 1000 rows. Storing it on the acceptance is a server change, yours if you want it.)
  3. "+ New conflict" is hidden in Northstar, so it can't replace the shared demo. In custom, Scenario Studio is hidden and Work doesn't poll /api/mappings.
  4. 33ffab9: test-tenancy L409 changes navigation clicks only (the "Proposals" nav is gone); no assertion changed.

Gates at a54570f: test-all 15/15 (iMac S1 and iMac S3, each independently): scenario 73 x3, ui-loop 30/30, tenancy 166/166, ui-northstar 125.

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).

@allsmog

allsmog commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Landing plan for the stack (#3 to #7)

My approval is on #7 @ 3cd7f8a, and that head carries every fix from my #3, #5, #6 and #7 reviews. Proposal for landing it:

  1. Friday: the pitch runs from main @ e9ef581f. Nothing merges before it. main has no branch protection, so this holds only because we hold it.
  2. After the pitch: retarget LIM-2424: custom record, launch decision, Switch team, Halden fixture (stacked on #6) #7 to main and squash-merge it as one commit. That's one diff, one gate run and one revert point. Then close LIM-2424: L0 multi-workspace (Mode L) + hosted-mode draft #3, LIM-2424: agents work with a custom scenario's agreement (CPSec loop) #4, LIM-2424: PR #3 review fixes (local + hosted) and agent connection for local workspaces #5 and LIM-2424: fix every finding from the adversarial review of #5 (stacked on #5) #6 as superseded by LIM-2424: custom record, launch decision, Switch team, Halden fixture (stacked on #6) #7, each with a link. Merging bottom-up would mean landing intermediate heads that still carry review findings (LIM-2424: L0 multi-workspace (Mode L) + hosted-mode draft #3 and LIM-2424: fix every finding from the adversarial review of #5 (stacked on #5) #6 are still changes-requested on their own heads).
  3. Your approval on LIM-2424: custom record, launch decision, Switch team, Halden fixture (stacked on #6) #7 before the squash. The squashed diff includes my code from LIM-2424: agents work with a custom scenario's agreement (CPSec loop) #4 and LIM-2424: PR #3 review fixes (local + hosted) and agent connection for local workspaces #5, which I can't approve myself. One approval from you on LIM-2424: custom record, launch decision, Switch team, Halden fixture (stacked on #6) #7, once it targets main, covers that.
  4. Goal-bound agent sessions for Claude Code and Codex (behind ALIGN_GOAL_SESSIONS=1) #8 (Align v2) stays out of this landing. After LIM-2424: custom record, launch decision, Switch team, Halden fixture (stacked on #6) #7 is on main, I'll rebase Goal-bound agent sessions for Claude Code and Codex (behind ALIGN_GOAL_SESSIONS=1) #8 onto main and it gets its own review.
  5. Hosted test: before the first tester, I do a live smoke test on Fly from LIM-2424: custom record, launch decision, Switch team, Halden fixture (stacked on #6) #7's head (or main after the squash). It covers sign-in, the closed-mode 410, and a dry run of the purge, including the fly machine run fallback.

Two questions:

  • Test date: is the first hosted tester Mon Oct 26 or Tue Oct 27? This PR's body says Tue Oct 27; my notes say Mon Oct 26.
  • TLS certificate: the body says "the hosted TLS certificate expires Fri Oct 23, 5:04 PM PT". Which host is that? No Fly app exists yet per HOSTING.md. If the pitch touches it, it expires Friday afternoon.

@liminalshruti
liminalshruti requested a review from allsmog October 23, 2026 02:54
@liminalshruti
liminalshruti changed the base branch from agent/LIM-2424-pr5-adversarial-fixes to main October 23, 2026 03:04
@liminalshruti

Copy link
Copy Markdown
Collaborator Author

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.

@liminalshruti

Copy link
Copy Markdown
Collaborator Author

Final head for your review: a54570f23298fa903b35a7f2b8b2f65d3d21e13b (iMac S1). I won't push to #7 again unless you ask.

@liminalshruti

Copy link
Copy Markdown
Collaborator Author

Review: PR #7 @ a54570f23298fa903b35a7f2b8b2f65d3d21e13b (the 27 v6 commits now on main)

Automated code review, high effort, read-only. Checked = I read the code at this head and confirmed it. Unchecked = reviewer finding not yet confirmed. Context: main is 95c43be (Sean-approved 3cd7f8a). This PR's remaining delta is the v6 work and needs Sean's sign-off.

Fix before tester QA (Sat)

  1. Checked. A "not_yet" launch decision hides leadership's re-decide prompt. components/YourTurnView.tsx:139 gates on !acc.launch_decision, and lib/flow.ts:265 accepts not_yet. After "not yet", the launch is still pending, but leadership's Your turn says "Nothing waiting on you" and the badge drops to 0. Line ~182 hides the teams' "Leadership decides the launch" card the same way. Fix: gate on launchState(acc) !== "approved".
  2. Unchecked. The time-to-agreement timer no longer starts on its own. Landing changed from decision to turn (components/Home.tsx:312). DecisionView fired mark("ceo_change_viewed"); YourTurnView doesn't. touch() drops actions while started_at is unset, so the record's measured tile can read "Not started" with 0 touchpoints.
  3. Unchecked. "+ New conflict" opens the old decided proposal (components/Home.tsx:428). After any ratified proposal, ProposalsView shows the latest non-rejected proposal and no composer. The "Propose a change" card on Your turn does the same.

Lower

  1. components/DecisionsView.tsx:64: every row opens go("decision"), which renders acceptances.at(-1), so older acceptances can't be opened.
  2. components/v6/record.tsx:193: actionWords has a launch key the server never writes. launch_approved, launch_not_yet, ratify_untested and reject show as raw verbs.
  3. components/TeamLens.tsx:171: still hardcodes "New requirement, added today". The changedToday(g) ? … : … ternary is copied about 8 times; one helper would stop this recurring.
  4. components/GoalsView.tsx:21: depStage returns "accepted" whenever any acceptance exists, ignoring the dependency's status, so it can disagree with Your turn.
  5. Duplication in components/v6/*: Pill is in kit.tsx (text-amber-700) and record.tsx (var(--al-warn)); Collapsible, Chip and Lbl are in kit and thread; there are four initials helpers; WorkScreen is unused; two different components are both named OldPlanWork; and conditions are split on \n in three places (only conditionLines() handles \r\n).

@allsmog allsmog left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 under lib/ or app/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.sh and scripts/test-ui-northstar.sh are 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)

  1. 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). On 3cd7f8a, 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: mark ceo_change_viewed when Your turn shows the CEO change, as DecisionView did on mount. Add a test-ui-loop check that the record shows a measured time after the shortest path.
  2. Medium: the baseline label is now false. test/snapshots/ui-northstar-850971e holds the a54570f text, and the gate prints "identical to 850971e (125 files)". Rename the folder to the v6 commit, update scripts/test-ui-northstar.sh, and keep 850971e only for the API snapshot and test-flow, which really are unchanged.
  3. Medium: docs/DEMO_SCRIPT.md describes the old screens (lines 41, 57, 68, 103-104: Next decision, Proposals, Evidence). That's right for the pitch on main tomorrow. Update it in this PR so it matches the UI once it lands.
  4. Low: the "Receipts" tab (v6/record.tsx:43) labels results that EvidenceView.tsx:200 says "aren't signed". Call it "Activity" or "Evidence".
  5. 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), and scripts/run-plan.sh in Studio.
  6. 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 of DecisionView and TodayView can no longer be reached.

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.

@liminalshruti

Copy link
Copy Markdown
Collaborator Author

@allsmog: thanks for the approval at a54570f. The founder ruled to merge #7 as you approved it and land the follow-ups separately, so #7's head stays a54570f. Nothing was pushed to this branch.

Follow-ups are in #10 (62a4c30e3db3ba8d1d67d2cc5f889ad2ded20f2d, stacked on this branch). Please review:

Correction: "the pitch runs from main @ 95c43be" isn't quite right. Friday's pitch uses a recorded video made at e9ef581f, and that pre-merge tree is tagged pitch-baseline-e9ef581. Please don't run a live Northstar demo from post-merge main expecting the old screens.

@allsmog

allsmog commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Follow-up to my approval @ a54570f: integration pass

The second review lens finished after I approved, and I also drove the app once with scripts/autopilot.mjs (headless, --fast --no-agent) on this head. No blocking defects, and the approval stands. There's one confirmed regression to fix before QA, one more Medium, and two Lows.

Follow-up 1 (timer) is confirmed by running it. The autopilot drove Act 3 to RATIFIED with one acceptance, and afterwards data/state.json has timer.started_at: null and no touchpoints. After a full demo on v6, the record shows "Not started" for time to agreement. Please treat this one as required before the hosted QA on Sat Oct 24.

(The autopilot's Act 2, re-matching sessions to the new goals, timed out here. It times out the same way on 3cd7f8a, so it isn't from this PR.)

  1. Medium: a declined proposal has no screen. The Proposals nav item is gone (Home.tsx:27-34). Decisions lists only open proposals and acceptances (DecisionsView.tsx:34 filters out REJECTED), and Your turn skips REJECTED too (YourTurnView.tsx:15). The review screen still tells the owner that the asking team "sees that you declined" (ProposalsView.tsx:794). In practice, after a Decline the asking team gets a fresh "Propose a change" card with no mention of the decline. The server keeps the REJECTED state and its audit row; the UI just doesn't show them. Fix: list declined proposals in Decisions, or show the decline on Your turn, so the copy at :794 is true.
  2. Low: TryApprove calls api() directly (ProposalsView.tsx, the accept call), not act(). A 401 session-ended or a 409 workspace_mismatch therefore shows as inline text, without sign-out or the Elsewhere notice. The 403 path is correct and tested (U5b/U5c). Route it through act(), or handle those two codes.
  3. Low: Decisions opens the latest record for every accepted row (DecisionsView.tsx:64 → DecisionView renders the latest acceptance). This only matters once a workspace has more than one acceptance. I found no UI path that creates a second one today.

Coverage note: custom scenarios now show Goals, Work and Decisions for the first time, and the gate doesn't snapshot those screens. The reviewer ran a one-off sweep that checked every custom screen, for every role, at each stage from fresh through launch, with no Northstar wording, undefined or empty screens. Worth adding a custom UI snapshot to the gate.

@liminalshruti
liminalshruti merged commit 696c6b3 into main Oct 23, 2026
allsmog pushed a commit that referenced this pull request Oct 23, 2026
…, 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).
allsmog pushed a commit that referenced this pull request Oct 23, 2026
…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).
allsmog pushed a commit that referenced this pull request Oct 23, 2026
…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).
allsmog pushed a commit that referenced this pull request Oct 23, 2026
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).
allsmog pushed a commit that referenced this pull request Oct 23, 2026
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).
liminalshruti added a commit that referenced this pull request Oct 31, 2026
Server-truth cites re-pointed from 237268f to 02f0e1f where files moved
(goals.ts, register.ts); changes/approval/policy/validate unchanged. D1
records the new hold/release directives and that approve still publishes
immediately (changes.ts:217); mechanism waits on Sean (Monday #7, #9).
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.

2 participants