383 Commits
Author SHA1 Message Date
jason.woltje f12021c6d7 fix: dev local owner mode requires the named instance's data-root marker 2026-11-06 12:10:11 -06:00
jason.woltje 4638c07fcc style(webui): council fixes for type, surfaces, targets and focus (ui slice 1) 2026-11-06 11:52:47 -06:00
jason.woltje 7a67db9c41 style(webui): match the dashboard reference palette, type and header (ui slice 1) 2026-11-06 11:28:26 -06:00
jason.woltje b73e55b794 feat: dev-only local owner mode for named loopback instances 2026-11-06 11:23:36 -06:00
jason.woltje 9d3eb9e115 fix(webui): fence in-flight request misses on an observed state (#797)
A mosaic-request-state for an id now advances that id's own generation on every thread retaining it, so a 404 still in flight from before the observation cannot record the miss afterwards. Generations are pruned with the misses to retained rows. Adds a held-404 regression that fails on 16384bb12.
2026-11-06 11:15:15 -06:00
jason.woltje 67c1bcd891 feat(webui): dashboard shell, navbar, sidebar and logo (ui slice 1) 2026-11-06 11:14:54 -06:00
jason.woltje 16384bb120 fix(webui): retry missing requests on thread open and observed state (#797) 2026-11-06 11:06:04 -06:00
jason.woltje 97d670da94 fix(bus): name task evidence gaps and stop request polling (#797) 2026-11-06 10:49:33 -06:00
jason.woltje 6b84fe136e fix(webui): order same-key files settles by commit, not start 2026-11-06 09:35:25 -06:00
jason.woltje 86383a9d1e fix(webui): retain files content across redraws 2026-11-06 09:19:17 -06:00
jason.woltje 521b34bdd7 Merge feat/mvp3-project-archive-r9 (e75c33947) into integrate/mvp3-ux-1106 2026-11-06 07:50:10 -06:00
jason.woltje e75c339470 fix(webui): withdraw request writes when a refresh resolves archived
A same-thread refresh kept the last resolved live controls until the session and history reads finished. When the fresh project lookup finds the project archived or the archive state unknown, withdraw the unguarded thread controls and remount the request panel fenced before those reads.
2026-11-06 07:15:31 -06:00
jason.woltje 4c85d37842 Keep resolved archive state during thread refresh 2026-11-06 06:40:45 -06:00
jason.woltje 5bf07f35f0 fix(webui): retain archive state on failed refresh 2026-11-06 06:19:40 -06:00
jason.woltje 2511e79673 fix(webui): give archive controls the shared button treatment (#797) 2026-11-06 06:13:21 -06:00
jason.woltje 51892cf95a fix(webui): suppress writes on archived projects 2026-11-06 05:26:42 -06:00
jason.woltje 8c3f48113f fix(webui): restrict writes when archive state is unknown 2026-11-06 04:48:14 -06:00
jason.woltje 526d3e3b7d fix(webui): keep threads readable when archive lookup fails 2026-11-06 03:44:44 -06:00
jason.woltje 2cc938328c fix(webui): use integration routes for archived navigation 2026-11-06 03:41:23 -06:00
jason.woltje 6a655a5cbb Merge commit '5255e4e74171cb0f640a2fcd83c77806b5b6f3d6' into feat/mvp3-project-archive-r4
# Conflicts:
#	BUILD-LOG.md
#	docs/SESSIONS.md
#	packages/bus/tests/request-continuation.test.mjs
#	packages/webui/src/public/chat.js
#	packages/webui/src/public/index.html
#	packages/webui/src/serve.mjs
#	packages/webui/tests/browser.test.mjs
2026-11-06 03:32:15 -06:00
jason.woltje 1c33c342bc fix(archive): fence new execution and preserve archived reads (#797) 2026-11-06 01:51:08 -06:00
jason.woltje 3e21d239b3 feat(bus): owner project archive and unarchive (#797)
Jason's owner report 2026-11-06: no way to archive or delete projects.
Archive is the reversible half; delete stays out of scope because project
and run records are write-once evidence.

- project.archive / project.unarchive: human-only (project.create's gate
  minus the tester carve-out; tester, user and agent refused). State is the
  latest row of a new append-only project_archives journal (3s->3t, additive;
  the rows are the audit trail), so projects itself never changes and nothing
  is deleted. Repeats refuse project-already-archived / project-not-archived.
- project.list hides archived projects until {includeArchived:true}, which
  flags each with archived:true; a user still lists granted projects only.
- While archived, thread.create, thread.send, room.open and room.send refuse
  project-archived; every existing record stays readable and unarchive
  restores everything.
- Console: new public/project-archive.js (+css) and project-archive-http.mjs
  routes (chatHTTP's write fence); chat.js gains two one-line hooks,
  index.html one script and one link tag; styling only through the shell's
  .project-archive-control / .project-archived-filter hooks.
- CLI: mosaic project archive|unarchive <name-or-id> and list --archived.
- stack-release COUNTED/LISTED gain project_archives (schema order); schema
  step-count pins and migration fixtures updated for 3t.

bus 1601/1601 (Node 24; Node 26 has the pre-existing project-file socket
stall), webui 582/582, plugins 132/132, cli 1191/1194 (two pre-existing
load flakes of the row253 C4 and land_work families; both pass isolated and
the base commit's full suite fails four of the same family).
2026-11-05 23:50:51 -06:00
jason.woltje 3c55f5b25d fix(webui): tolerate a room whose project is not in the loaded list (#797)
The room context event read project.repo without a guard, so a room
outside the loaded project list threw and failed the room load.

Gate: full WebUI with the editor build required, 633/0 on the second
run. The first run failed I1 inbox in decide-browser.test.mjs once;
three isolated runs each on this tree and on 5a346825b passed 9/0.
2026-11-05 23:24:32 -06:00
jason.woltje b64773956e fix(webui): keep remote draft, room context and drawer focus across polls (#797) 2026-11-05 23:18:04 -06:00
jason.woltje 70443895e4 feat(webui): preserve drawer session context (#797) 2026-11-05 22:35:41 -06:00
jason.woltje 6eee6b64ce feat(webui): connect W15 slices (#797) 2026-11-05 22:29:12 -06:00
jason.woltje 89b0de91f3 Merge feat/ux816-w15-project-remote-r2 (18df6e049) into integrate/w15-slices
# Conflicts:
#	packages/bus/src/broker.mjs
#	packages/bus/tests/console-decide.test.mjs
#	packages/bus/tests/request-console.test.mjs
#	packages/webui/src/cli.mjs
#	packages/webui/src/serve.mjs
2026-11-05 22:08:48 -06:00
jason.woltje 59602c9105 Merge feat/ux816-w15-files-r2 (551acdf3d) into integrate/w15-slices 2026-11-05 22:08:28 -06:00
jason.woltje 07ea16d390 Merge feat/ux816-w15-inbox (7a2dc5bad) into integrate/w15-slices
# Conflicts:
#	packages/webui/src/public/bus.js
2026-11-05 22:08:28 -06:00
jason.woltje 307dad8713 Merge feat/ux816-w15-requests (ea0b67654) into integrate/w15-slices 2026-11-05 22:08:13 -06:00
jason.woltje 316004ee4c Merge feat/ux816-w15-conversations (cecfcdd20) into integrate/w15-slices 2026-11-05 22:08:13 -06:00
jason.woltje 18df6e049c feat(webui): enable owner project remote save (#797) 2026-11-05 22:04:07 -06:00
jason.woltje 551acdf3d3 feat(webui): list verified draft workspace names (#797) 2026-11-05 21:52:26 -06:00
jason.woltje 3fd82b0840 feat(webui): W15 shell rail, drawer and Projects nav (#797) 2026-11-05 21:50:48 -06:00
jason.woltje ea0b676541 feat(webui): update request presentation (#797) 2026-11-05 21:23:14 -06:00
jason.woltje cecfcdd201 feat(webui): add project conversation surfaces (#797) 2026-11-05 21:18:46 -06:00
jason.woltje 191061a9e7 feat(webui): add W15 shell candidate (#797) 2026-11-05 21:15:36 -06:00
jason.woltje 7a2dc5bad1 feat(webui): show decision origin and receipt evidence (#797) 2026-11-05 21:13:45 -06:00
jason.woltje 59801efe4d feat(webui): add safe reviewed file text view (#797) 2026-11-05 21:12:47 -06:00
jason.woltje e9271841f3 fix(webui): enable factory chat and recover accurate states (#1843)
Enable CLI and WebUI channels in the Case 1 starter. Explain channel
refusals, preserve in-memory drafts, and distinguish failed reads from
successful empty data. Keep room refusal state through failed refreshes
and restore session controls after catalog recovery.

Integrates reviewed source commits 5558fe020 and a1ba9cd56. Independent
review R2 approved both recovery fixes; append-only records preserve
controller and implementation evidence.
2026-11-04 17:27:22 -06:00
jason.woltje 51525a31d6 test(lifecycle): cover three delivery paths and crash recovery (#1839) 2026-11-04 14:47:45 -06:00
jason.woltje 81e54bf4d8 feat(bus): attach requests to existing approved products (#1839) 2026-11-04 13:52:36 -06:00
jason.woltje aa9b91d88b feat(bus): record reviewed delivery and let the owner fetch the artifact (#1839) 2026-11-04 13:31:14 -06:00
jason.woltje 48ec9721d1 feat(console): move the model proxy page into Settings (#803) 2026-11-04 12:32:59 -06:00
jason.woltje 68bef84fa7 feat(console): show the PRD draft and revoke an approved snapshot (#1839) 2026-11-04 11:54:11 -06:00
jason.woltje 0244917e64 fix(console): map Task 4's mode refusal and read its draft shape in the request routes (#1839)
The bus refuses a stale mode revision as request-mode-revision-conflict, so the Console route maps that
code to 409 instead of request-mode-stale and request-mode-unchanged, which no bus emits. The mode copy and the
request-mode-changed wait label describe Task 4's project-level change. The draft route relays Task 4's
{ candidate, prd, requirements } reply when its candidate names the request, and maps prd-candidate-required to 409.
2026-11-04 11:21:43 -06:00
jason.woltje 4e79eaace1 fix(console): check the owner-to-PM edge on every intake control, refuse request URLs without SSO, bound the browser waits (#1839)
Review r1 of lifecycle Task 3.

C1: the four owner controls (answer, attach, mode, cancel) inserted and routed a
human-to-PM message without the messaging policy check message.send makes. The
shared writer now reads the current human-to-PM edge inside the control's
transaction, before it inserts or routes anything, and refuses with
message-sender-refused. The refusal rolls back the journal row, the human.input
event, the message and a withdrawn selection decision. The cancel withdrawal
checks the same edge. Regression tests close the edge after the question and
cover all four controls, then reopen it and prove the same call lands once.

I1: serve.mjs read sso.publicOrigin for a request URL when the Console ran
without --sso (or in preview mode), which ended the process on an unauthenticated
GET /api/requests/r1. A request route now answers through requestHTTP with no
transports and no SSO fields: unavailable on a read, read-only on a write, 405
for the wrong method. Listener tests cover GET and POST without SSO and in
preview mode, named and loopback, and the process keeps serving.

M1: the browser test waiter allowed about 3 s and reload() could run out its loop
without failing. Waits are now deadline-bound at 15 s and name the expression,
and reload() waits for the new document's own ready flag and the mounted chat,
and throws if it never gets there. The no-repost and stored-answer assertions of
the lost-answer case are unchanged.

Migration 3p-3q is unchanged.
2026-11-04 11:21:43 -06:00
jason.woltje eb551b1f89 feat(console): choose a request mode, answer questions and confirm attachment with buttons (#1839)
The owner handles a new request from the Console: pick the mode (new
autonomous, new guided or an existing project), answer the project
manager's questions and confirm an attachment, with no copy-to-terminal
step.

Bus: 3p->3q append-only migration widens the request_events kinds. The PM
asks one question with request.question. The owner-only
request.answer.console, request.attach.console, request.mode.console and
request.cancel.console join the two console reads in CONSOLE_VERBS. An
answer is an attributed human.input linked to its question and request,
recorded once per op and never a PRD approval. An attach pick makes the PM
propose that project as a confirmation decision; nothing is mapped on the
pick. A mode change takes the expected revisions and leaves the bound plan
as evidence. Cancel keeps a created project.

Console: request-http.mjs serves GET /api/requests/:request, /projects and
/draft and POST /answer, /attach, /mode and /cancel with the signed-in
owner, same-origin and bounded-body checks of the decision routes.
requests.js draws the panel under the owner's chat message, answers the
mode decision through the existing confirmation endpoints, and after a lost
answer response reads the request first and resends the same op only on the
owner's click.
2026-11-04 11:21:43 -06:00
jason.woltje 1e1357cb6e feat(console): answer every eligible decision option (#1839) 2026-11-03 17:25:24 -06:00
jason.woltje 7024e35f59 Merge #784 R2: the paste test catches a handler that enters the live page (Vikunja #784) 2026-11-02 22:35:21 -06:00