clanker
|
4a528f3975
Force Wake: human-triggered resume of parked tasks and goals
|
vor 1 Monat |
clanker
|
93412406ec
Task and goal mutations answer with refreshed state slots
|
vor 1 Monat |
clanker
|
2d7526ff96
Dashboard Queue metric reflects waiting-for-attention work
|
vor 1 Monat |
clanker
|
eab12d11a0
Saddles page: lift SSH key text colour for dark-panel contrast
|
vor 1 Monat |
clanker
|
0ce0a4d1ef
Merge branch 'task/2-13' into goal/selfhosted-qol
|
vor 1 Monat |
clanker
|
c4c089b4d7
Notifications: per-browser bell, truthful delivery, test button
|
vor 1 Monat |
clanker
|
480bf3f463
README: in-place mandate/brief editors
|
vor 1 Monat |
clanker
|
3785e9f562
In-place Edit buttons for task mandate and goal brief
|
vor 1 Monat |
clanker
|
eecfd99347
Merge branch 'task/2-11' into goal/selfhosted-qol
|
vor 1 Monat |
clanker
|
73dcec9314
List UX: newest-first tables, New task expander above the queue
|
vor 1 Monat |
clanker
|
ab36581e73
README: users/roles/profile section
|
vor 1 Monat |
clanker
|
cc160d76e3
Users page, profile page, role gates (admin-gated user/saddle/capability management)
|
vor 1 Monat |
clanker
|
ed23852973
docs: the daemon deploy snippet carries --spm dnf
|
vor 1 Monat |
clanker
|
692eaebca2
docs: deployment leverages spry deploy / usm manifest deploy from the repo checkouts (no outside-repo Dockerfiles); extension guide cross-referenced
|
vor 1 Monat |
Billy Barrow
|
5eaab318c6
navbar
|
vor 1 Monat |
clanker
|
b1176f3cf8
ui+docs: clanker-saddle favicon + touch-icon, emblem beside the heading; READMEs swept for the plan-16 world (single-row blocks, parked outcomes, derived saddle state, no subtask/legacy-wire remnants, 924-check count)
|
vor 1 Monat |
Billy Barrow
|
21510cee71
Add assets
|
vor 1 Monat |
clanker
|
903361929c
qa: integration_test re-baselined onto the post-R3 world — the harness left behind by the R stages (75 passes + stale) is green again end-to-end against both real binaries, twice on fresh environments: 114/0 (was 100 checks pre-R3).
|
vor 1 Monat |
clanker
|
cb269d0d30
r23: sessions as truth — the saddle-row work cache dies, IDLE/BUSY derive from open sessions
|
vor 1 Monat |
clanker
|
db546c35a7
r23: D4 web half — parks close their session rows 'parked'
|
vor 1 Monat |
clanker
|
181fbd9926
r3: doc residue — the PendingAnswer docblock still linked the deleted SaddlePollEndpoint; it points at the SaddlePollState ledger now. (The goal page's own is_plan_review flag is GoalDetailEntrypoint's GoalBlockView member — live, not the deleted task-page BlockView twin.)
|
vor 1 Monat |
clanker
|
2d0e09d1d9
r5: harness split (arch 18) — the monolith becomes a package. test/harness.py: the FakeSaddle daemon, every shared wire helper (http/act/login/slot_public/wait_for/quiet_window/db/check, task_state/wait_task_done/create_queued/enqueue_task/saddle_api/saddle_card/http_get_page/dump_threads and friends), the per-shard fixtures (Ctx/start_bundle), and the runner (run_bundle + run_all_parallel + main) — the parallel spawn now targets the entry shim so 'harness' stays one module instance per process, and run_bundle imports the bundle module lazily (after that shard's environment exists, so star-imported runtime globals are the shard's own) then re-syncs WORK/DB_PATH/ports onto it (the sequential debug path reuses modules across shards). test/bundles/<name>.py ×11: the scenario bodies moved verbatim (bundle_X -> run(ctx)); the x7 duplicated goal_state closures collapse onto harness.goal_state, late-bound through the runner's fixture ctx so the answers/replay restart scenarios' re-logins keep working (the first cut snapped the auth at shard start and the replay redelivery scenario caught it). test/web_stack_test.py stays the meson entry (args unchanged) and the shard spawn target. The S-workstream handoff survivors verified byte-intact after the move: the goalui S2 verdict-goal pins (resolveReviewBlock/goal.open_blocks/feedback posting/extraText gating on the goal page) and the goals S3 park-second waits (strictly-newer completed_at vs suspended_at seconds under SADDLE_GOAL_RESUME_S=1). Both execution modes green: parallel shards 851/0, WEBSTACK_SEQUENTIAL 851/0. 851 checks.
|
vor 1 Monat |
clanker
|
bf9009c91b
r3: template partials (arch 16) — Statum DOES support includes (the mkpstm fragment pass: pstm-fragment with pstm-input parameters and pstm-materialise-as tag carry), so the partial strategy is compile-time fragments, not JS extraction. Five new partials in src/pages (auto-discovered, wired into template_deps): goal-branches (the branch chips paragraph, included 3x from goal_detail — head passes its note via the optional input, the note span hides where undefined), goal-compare (the Compare changes link, 2x), progress-feed (the latest+history card body shared between task and goal pages, parameterised on entries — heading and empty-state note stay per page with their page-specific wording), block-answer (the option-card question form — radio options + Other, shared between both pages' block loops; both loops expose the block as 'block' so no inputs), and block-reply (the free-text RFC reply form, shared likewise). The goal page's select+textarea answer form unifies onto the task page's richer option-card shape (the U1-pinned one): AnswerGoalBlockAction gains the __other__ resolution the task action already had, so a picked radio posts option=<value> exactly like the old select and the Other row carries the free text — the goal questions stay answerable with and without options. The goal page also gains the RFC reply fallback the task page already had (its old single form covered rfc blocks implicitly). Compiled-page inspection pins the composition: chips wrappers carry stm-if + the note def, no pstm-* residue. 851 checks.
|
vor 1 Monat |
clanker
|
e578a698f5
r3: shared plan-review JS (arch 15) — one parameterised initPlanReviews in main.html. The ~180-line collect-remarks pattern (the per-block remark queue, the plan-popover, the numbered rejection body with quote-prefixed remarks, accept-clears-queue, remark-less rejection via the feedback textarea, syncPlanRemarks on afterEvaluate) moves verbatim into main.html as the shared engine; the page passes only resolveBlock(id). goal_detail.html keeps the resolution (resolveReviewBlock over goal.open_blocks + plan_pending_block — the S2 completion-review deep-link semantics) and registers. The task-page twin of the pattern died with the poll era in the arch-19 commit (the plain-task plan review was unreachable), so the duplication the review flagged is gone at the source: the engine lives once, asserted identifiers (remarksByBlock, rejectOpenByBlock, syncPlanRemarks, plan-popover, the numbered (index + 1) + '. ' body) all preserved on the composed goal page — the goalui S2/S3 pins pass unchanged. 851 checks.
|
vor 1 Monat |
clanker
|
13d283c0a6
r3: query layer (arch 14) — the work moves into the ORM with identical results. list_tasks filters (status/project) and sorts (priority, created_at — DateTime columns are unix-epoch ints, so the SQL ORDER BY equals the old .to_unix() compare) inside the query; get_ready_tasks stops loading EVERY task row for predecessor checks and queries only the queued candidates' predecessors; unreachable_task_ids batches (candidate tasks once, their sessions in one id-filtered query, the saddles in another — the newest-open-session-per-task semantics preserved by an id-ordered backward walk); display_map_for loads the wanted tasks' blocks in ONE task_id-filtered query instead of three full-table scans filtered in Vala; TasksState.build materialises the task list ONCE (the triple list_tasks died); TaskDetailState's enqueue dropdown queries exactly the standalone rows it lists (new list_standalone_tasks) instead of every task on every pulse; TimelineService.recent_window stops loading every session twice — the yeehaw session->task map builds from a batched lookup of only the WINDOW newest entries' sessions. The batched WHERE-in is an OR-chain helper (id_in/id_filter) because the expression grammar has no IN operator; id batches carry decimal strings (the Invercargill collections mishandle boxed value types — an int64 vector through to_immutable_buffer corrupts the heap, the exact trap the CreateTaskAction comment warns about). 851 checks, unchanged.
|
vor 1 Monat |
clanker
|
e236aa7079
r3: api_tokens dropped (arch 24, P3-2) — saddles.token is the single credential store: the legacy table, its entity mapping, the startup ensure_saddle_tokens migration (main.vala's call + the service), token_for_saddle (the saddles page and the /start callback token read the row directly), unregister's sweep, and saddle_for_token's fallback read all die. Nothing deployed predates the plan-10 row token (operator decision), so no credential loses validity — a legacy-shaped token string now 401s everywhere, pinned by the rewritten restart scenario: the fresh schema carries no api_tokens table, the row token survives a restart unchanged and still authenticates, and the legacy-shaped string authorises nothing. 850 -> 851 checks.
|
vor 1 Monat |
clanker
|
2cf9149d29
r3: legacy wire removal (arch 19, P3-1) — SaddleUpdateEndpoint + SaddlePollEndpoint and their routes are gone (the daemon never called them; verified against saddle/src at review time): the poll-era ingest/verdict pair 404s now, pinned by regressions. The service support that existed only for them dies with them: take_pending_answers (the saddle-keyed variant; the for_task assignment carrier stays), take_pending_comments + PendingComment, validate_token (its only caller was the update/poll bearer pin — resolve_bearer collapses to saddle_for_token for the all-id-less wire), the subtask/plan refusal arms, and the update endpoints' own statics move to SaddleWire (read_json_body/json_ok/json_error shared by every remaining /api/saddle/* route). Knock-ons per the plan: tasks.working_branch was write-dead (only /update done ever supplied it) — column + entity field + TaskDetailPublic member + the task-page line + mark_terminal/complete_task's dead parameter die; the plain-task plan-review UI in task_detail.html was unreachable (plans are goal-only since plan 12; only /update block type=plan could raise one) — BlockView.is_plan_review, the plan-review section, and the task page's ~180-line plan-remarks JS (dead with no [data-plan-review] targets) are removed; AnswerBlockAction's plan-verdict arms stay (the deep-link API + off-contract pushes keep working). Test fixtures rewrite into the push-era shapes: block raises ride POST /results blocked pushes (pages/lifecycle/push bundles), the terminal-task review fixture inserts its row directly (terminal pushes are consumed silently), rejected entries ride a results push, the dashboard review raise rides a review entry, the queued-state guard becomes a results state no-op, the /update subtask/plan refusals become 404 pins, and branch_advanced — the /poll verdict hint — is re-pinned on its surviving surface: the answers bundle's parked-resume allocation now asserts branch_advanced=true after a strictly-newer sibling completion on the shared branch. 856 -> 850 checks.
|
vor 1 Monat |
clanker
|
1fcc84c971
r2: GoalViewContext + GoalView — the 17-parameter GoalState.populate dies (arch 12): a GoalViewContext carries the dependency bundle (goals/tasks/projects/db/actions/saddles/polls/rules) every build threads, a returned GoalView aggregate holds pub + the ten section lists (out-params die), and the full flag becomes the two methods — full_view builds the goal page's whole aggregate, summary_view the goals-list row's scalars alone (the old call threaded 13 throwaway vectors plus their per-task display/yeehaw/capability queries through the full builder only to serialise pub; the row now computes exactly the fields it emits — same pub field set, byte-identical row JSON). GoalState.build takes the context (10-dep thread dies); GoalDetailEntrypoint, GoalsEntrypoint and RefreshGoalDataAction construct it once. The misindented runs/activity block normalised; RemoveGoalLinkAction's DTO authors null-safely when the registry is absent.
|
vor 1 Monat |
clanker
|
a58d9c0738
r2: saddle-status + session-outcome constants, one bearer resolution (arch 26) — SADDLE_IDLE/BUSY/OFFLINE and OUTCOME_STOPPED/RESUMED/DONE/FAILED beside SaddleService replace the magic strings across SaddleService (register/list/park/free/offline writes incl. the guarded UPDATE SQL), TaskService (unreachable check, every release outcome), AllocationService (the claim's idle/busy/resumed), Dispatcher (the affine-wake idle check), SaddleApi (the offline->idle ask recovery, the legacy done outcome) and the four entrypoints' offline/idle guards; the {id}-anchored and id-less auth styles collapse into resolve_bearer (validate_token pinning the route's saddle vs saddle_for_token owning-whatever-registered) so every /api/saddle/* endpoint resolves its credential through one helper. No OUTCOME_PARKED: no web-side writer exists (D4's web half is unlanded) — an unused constant would be dead code; it lands with D4. The wire-state switch labels (daemon results states) and display labels stay literals by kind.
|
vor 1 Monat |
clanker
|
8c55db2b38
r2: release_task — the ONE owner of close-open-sessions + free/requeue-saddle (arch 13): TaskService.release_task(task_id, outcome, requeue) folds close_open_sessions/free_saddles_running (their guarded UPDATEs byte-identical, the ask-race comment kept), complete/cancel/fail/requeue/retry collapse onto it; mark_saddle_unreachable keeps its keep-parked gate + 4-family flip + comment and its own guarded OFFLINE write, then releases the held task's sessions through the owner (the idle-free no-ops against the offline row — current_task_id already cleared under the entry-seen guard); unregister releases its held task through the requeue path too (deviation: the old inline 4-family flip left suspended tasks parked and open sessions dangling on deleted rows — the plan's normal form routes both through the owner; unpinned before, pinned now). Tests: the release outcomes (stopped requeue / done terminal) + both unregister routes (dead-host offline release, session-less direct release) — 849 -> 856.
|
vor 1 Monat |