release-pipeline #1

Open
peersky wants to merge 0 commits from release-pipeline into main
Owner
No description provided.
- .github/workflows/release.yml (tag-triggered matrix; sign+publish conditional on secrets — builds unsigned without them)
- packaging/: macOS (Info.plist w/ Sparkle SUFeedURL, make-dmg, sign-notarize), Linux (desktop, make-appimage +zsync), Android (cargo-apk README, sign-apk), publish-downloads, updater.rs reference module
- Makefile: dmg/appimage/apk/package targets
- does not touch existing ci.yml or crate sources

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PNSWJEBpTUGrorc1x74ypi
Build the reduced winner-spine frames non-panicking (skip Err rather than unwrap outside tests); rename `data`->`payload` in parse_stream_jsonl. Behavior unchanged for valid frames. Verified: cargo test --no-default-features (44+3 green), clippy --no-default-features --all-targets -D warnings clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PNSWJEBpTUGrorc1x74ypi
- packaging/icon.icns + icon.png generated from the sun mark (gold on dark)
- packaging/SIGNING.md: per-platform certs/keystores/Sparkle, secrets, end-to-end release+auto-update flow
- manifest/appcast/Info.plist/updater URLs → noolog.io/downloads (single service)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PNSWJEBpTUGrorc1x74ypi
icon: black mark on white (per request)
Some checks failed
CI / Format & Clippy (pull_request) Failing after 1s
CI / Headless core (no GPU) (pull_request) Failing after 1s
CI / Build & Test (Slint shell) (pull_request) Failing after 1s
CI / Spell Check (pull_request) Failing after 4s
0f12e220a4
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PNSWJEBpTUGrorc1x74ypi
test(ask): cover the send paywall gate, draft save/restore, mobile CTA
Some checks failed
web-ci / test (push) Has been cancelled
web-ci / test (pull_request) Has been cancelled
955a3f7b32
e2e for the /ask subscription paywall (previously only the /account side was
covered):
- no sub + zero free jobs → paywall card shown, Send button absent
- active subscription → Send shown, no paywall
- free trial jobs remaining → paywall bypassed, Send shown
- Subscribe persists the typed subject/query draft and routes to
  /account#subscribe; draft is restored (and consumed) on a fresh /ask
- paywall CTA stays on-screen with a phone-sized tap target at 320px width
test(confirm-modal): cover the destructive-action dialog UX contract
Some checks failed
web-ci / test (push) Failing after 9m2s
web-ci / test (pull_request) Failing after 9m7s
f02f297964
Unit tests for ConfirmModal (the themed window.confirm replacement used for
delete/archive) — previously only referenced incidentally via cm- classes in
e2e, never asserted directly:
- closed → renders nothing
- accessible alertdialog: aria-modal + labelledby/describedby (describedby
  omitted when bodyless)
- focus lands on confirm on open
- background scroll locked while open, restored on close
- confirm/cancel fire their handlers; Escape + backdrop-click cancel; an
  in-card click does not
- busy disables both buttons; danger styles confirm destructive not primary
fix(stream): default a missing live evaluation score to 0
Some checks failed
web-ci / test (push) Failing after 8m38s
web-ci / test (pull_request) Failing after 9m2s
865e1f230a
A live evaluation_submitted event whose score is absent (partial wire payload)
was stored as undefined on the candidate's evaluation. The detail page renders
fmtScore(e.score) → undefined.toFixed(2) → TypeError, tripping the DetailError
boundary mid-deliberation. The REST details path already defaults score ?? 0;
mirror that in the stream reducer so Evaluation.score is always numeric.

Regression test added (reduce over round_start → proposal → score-less
evaluation asserts score === 0; a real negative score is preserved).
test(deliberation-progress): cover the running-job progress widget
Some checks failed
web-ci / test (push) Failing after 8m19s
web-ci / test (pull_request) Failing after 9m5s
9fc7176850
Unit tests for DeliberationProgress (the live fusion bar / round / ETA /
synergy readout), previously untested:
- pre-proposal "Convening the council…" state (no fusion %)
- fusion % = (proposals + distinct evaluators) / 2N, incl. 25%/75%/100%
- an evaluator scoring multiple targets counts once (Set dedup)
- "Round X of Y" when totalRounds is known
- ETA rendered only when positive; fmtEta formats 130→"2m 10s", 45→"45s"
- synergy % appears only after a convergence score arrives
- fill keeps a ≥4% visible sliver at 0%
test(auth-gate): cover the session entry gate branches
Some checks failed
web-ci / test (push) Has been cancelled
web-ci / test (pull_request) Has been cancelled
0bb9a1db1d
Unit tests for AuthGate (every session's entry point), previously untested:
- token present → children render (gate open), no login screen
- unauthenticated → biometric sign-in screen, children hidden
- pairing-QR hash (#c=code) prefills device-link mode AND scrubs the sensitive
  code from the URL (history.replaceState)
- toggle between biometric ⇄ device-link modes
- link submit stays disabled until both code and PIN are filled
- biometric sign-in shows a pending label in flight and a retry message on
  failure
test(link-device): cover the device-pairing generator + import branches
Some checks failed
web-ci / test (push) Has been cancelled
web-ci / test (pull_request) Has been cancelled
39e23cc575
Unit tests for LinkDevice (Account → Devices), previously near-untested:
- initial state: intro + entry buttons, no pairing card
- generate → shows QR, PIN, and pairing code
- no stored identity → clear "nothing to export" error, no QR
- Copy code writes to clipboard and flashes "✓ Copied"
- Enter-a-code import form: submit disabled until code + PIN both filled
- import failure → "Wrong code or PIN."
test(link-device): drop unused waitFor import
Some checks failed
web-ci / test (pull_request) Failing after 9m2s
web-ci / test (push) Failing after 9m6s
bcc21c449a
test(boot-splash): cover the session-gated boot reveal/fade
Some checks failed
web-ci / test (push) Failing after 8m45s
web-ci / test (pull_request) Failing after 8m46s
d52d09a4e2
Unit tests for BootSplash (timer-driven, session-gated), previously untested —
a slip here strands users on the splash:
- first session entry shows the splash and marks noolog_booted
- fades (boot-out) at 3s, unmounts at 3.4s
- never re-shows once booted (in-app nav won't re-trigger)
- unmounting before timers fire clears them (no throw)
feat(shell): add a Docs link to the sidebar footer
Some checks failed
web-ci / test (push) Failing after 8m43s
web-ci / test (pull_request) Failing after 9m7s
8afaaaf989
The app had no entry point to the docs (API, first-deliberation tutorial, SDK).
Add a "Docs ↗" link in the shell footer → noolog.io/docs (new tab, rel
noopener), 44px tap target, matches the footer style.
fix(ask): 402 send error points to subscription, not just "top up units"
Some checks failed
web-ci / test (push) Failing after 9m1s
web-ci / test (pull_request) Failing after 8m37s
a1efef35f0
The send paywall gates on an active subscription, but a 402 backstop from the
gateway showed "Not enough units — top up", misdirecting a user who actually
needs a subscription. 402 can mean either → message now points at the Account
tab (where subscription AND units are managed).

Also moved submitErrMsg into lib/api (co-located with ApiError) and unit-tested
the full status→message mapping; updated the e2e assertion for the new copy.
test(sphera-spinner): cover the node-ring fill clamps
Some checks failed
web-ci / test (pull_request) Failing after 8m39s
web-ci / test (push) Failing after 9m20s
42706f9b73
Unit tests for SpheraSpinner (lit fraction mirrors fusion %): total nodes +
lit count, total=0 → 8-node fallback, lit clamped to node count on overshoot,
ring capped at 24, never negative, a11y label. Completes component coverage.
feat(ask): explain the effort slider's depth/cost tradeoff
Some checks failed
web-ci / test (push) Failing after 9m6s
web-ci / test (pull_request) Failing after 8m44s
1d94d979ec
The effort slider showed only a label (Quick…Exhaustive) — a first-time user
picks blind on consequences. Add a one-line hint under it describing the
depth↔cost/speed tradeoff for the current level (effortHint, thresholds mirror
effortLabel). Unit-tested.
fix(ask): effort hint describes the evidence bar, not round count
Some checks failed
web-ci / test (push) Failing after 8m45s
web-ci / test (pull_request) Failing after 9m10s
7349d40d86
The submit payload hardcodes deliberation_rounds: 5 and sends `effort` as a
separate field (the council's evidence threshold). The hint I added claimed
effort changes the number of rounds — inaccurate. Reword to the evidence-bar
tradeoff (lighter→strictest, deeper scrutiny/slower/pricier). Test now asserts
the hint never mentions "rounds".
feat(detail): Copy button for the converged answer
Some checks failed
web-ci / test (push) Has been cancelled
web-ci / test (pull_request) Has been cancelled
34a69828f1
The only copy action was "Copy thread id" (debug). Users had no way to grab the
council's actual answer to share. Add a "⧉ Copy / ✓ Copied" button in the
winner card header → copies winner.content to the clipboard. e2e covers it
(clipboard stubbed).
fix(thread): center the /t reading column on desktop
Some checks failed
web-ci / test (push) Failing after 8m24s
web-ci / test (pull_request) Failing after 8m45s
cdc1e4a4b4
.tv-root capped at 760px but never centered, so the thread view hugged the left
edge on wide desktops with a big empty right margin. Add width:100% +
margin-inline:auto to center it. e2e asserts equal left/right gaps at 1280px.
test(capture): reusable feature-screenshot harness (CI-skipped)
Some checks failed
web-ci / test (pull_request) Failing after 9m15s
web-ci / test (push) Failing after 9m8s
e87a3517bc
CAPTURE=1 playwright spec that renders real, implemented feature states
(citations = inline claim highlighting + key claims; cross-border = the
multi-country agent roster) and writes PNGs into the landing assets for
noolog.io case studies. Skipped in normal runs via the CAPTURE env guard.
feat(app): per-route browser-tab titles
Some checks failed
web-ci / test (pull_request) Failing after 8m51s
web-ci / test (push) Failing after 8m22s
7670efefa1
Every tab showed the same "Noolog — your council, your keys" — indistinguishable
in tabs/history/bookmarks. Add a useTitle hook (client pages can't export Next
metadata) titling the tab "<label> · Noolog": thread + detail views use the
thread SUBJECT; /ask = New thread/Follow up; /account, /agents constant. Unit
tested; thread/pages e2e green.
feat(app): badge the tab title with the "needs you" count
Some checks failed
web-ci / test (pull_request) Failing after 8m43s
web-ci / test (push) Failing after 8m56s
a32144711a
An agent waiting on the operator (pending dm_user question) was only visible in
the app chrome. Prefix the browser tab title with "(N) " whenever attCount > 0,
so a waiting agent is visible from another tab / the taskbar. Coexists with the
per-route titles (strip-then-apply, re-runs on route + count change). e2e added.
feat(app): opt-in browser notification when an agent needs you
Some checks failed
web-ci / test (pull_request) Failing after 9m10s
web-ci / test (push) Failing after 8m42s
025bb7742d
Active complement to the tab-title badge: when a new dm_user question arrives
while the tab is HIDDEN, fire a browser notification (clicking it focuses the
app + opens the job). Opt-in via a "🔔 Notify me" button in the Needs-you
section — never auto-requests permission. Primes on load so pre-existing
questions don't spam; a re-asked question notifies again. Hook unit-tested (5);
build + attention/shell e2e green.
feat(app): notify when a deliberation converges (tab hidden)
Some checks failed
web-ci / test (pull_request) Failing after 9m12s
web-ci / test (push) Failing after 9m15s
2b133c4902
Extends the opt-in notifications: start a council, switch away, get pulled back
when it finishes. AppShell subscribes the jobs list (react-query shares the
cache → polls app-wide, no extra network) and fires "Council converged · <subj>"
on a running→completed transition — granted permission + tab hidden only, primed
so already-done jobs don't fire on load. Hook unit-tested (+3); build + e2e green.
feat(inbox): free-text filter over threads
Some checks failed
web-ci / test (pull_request) Failing after 8m49s
web-ci / test (push) Has been cancelled
8ce155a439
As threads pile up, finding one meant scrolling. Add a client-side filter
(subject + cached answer, case-insensitive) that appears once the current view
has >5 threads; a no-match empty state; clears back to the full list. Works in
the recycle-bin view too. e2e added (both viewports); build + threads e2e green.
feat(app): also notify when a deliberation FAILS (not just converges)
Some checks failed
web-ci / test (pull_request) Failing after 9m9s
web-ci / test (push) Failing after 8m49s
333590a685
A failure while the tab is hidden otherwise leaves you waiting forever. Extend
the terminal-state notifier to fire "Deliberation failed · <subject>" on a
running→failed transition, alongside the existing converged notification. Unit
test added (+1).
feat(account): proactively enable browser notifications
Some checks failed
web-ci / test (pull_request) Failing after 9m15s
web-ci / test (push) Failing after 9m15s
4a22280945
The only way to grant notification permission was the attention section's button
— shown only when an agent already needs you, so a user just waiting for a result
couldn't opt in. Add a Notifications section on the Account page (reusable
NotifyEnable: Enable button / on / blocked / unsupported states). Unit-tested;
build + account e2e green.
test(capture): add hero deliberation screenshot (3-round debate → 91% converge)
Some checks failed
web-ci / test (push) Has been cancelled
web-ci / test (pull_request) Has been cancelled
e9168b6ebc
test(capture): add expanded-debate deliberation shot for for-teams
Some checks failed
web-ci / test (pull_request) Failing after 9m13s
web-ci / test (push) Failing after 9m19s
ad3fd4f9c1
feat(account): Manage subscription button → Stripe customer portal (env-gated)
Some checks failed
web-ci / test (pull_request) Failing after 8m50s
web-ci / test (push) Failing after 8m52s
b48072b186
feat(read): To:-all-agents line w/ live state dots; gate preliminary results + steering behind opt-in preview; round+job ETA timebar
Some checks failed
web-ci / test (pull_request) Failing after 27s
web-ci / test (push) Failing after 28s
f166b2c089
feat(inbox): auto-expand running threads on launch so the ETA/Watch card shows without a click
Some checks failed
web-ci / test (pull_request) Failing after 27s
web-ci / test (push) Failing after 25s
7ba5c206e9
Some checks failed
web-ci / test (pull_request) Failing after 27s
web-ci / test (push) Failing after 25s
This branch is already included in the target branch. There is nothing to merge.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin release-pipeline:release-pipeline
git switch release-pipeline

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff release-pipeline
git switch release-pipeline
git rebase main
git switch main
git merge --ff-only release-pipeline
git switch release-pipeline
git rebase main
git switch main
git merge --no-ff release-pipeline
git switch main
git merge --squash release-pipeline
git switch main
git merge --ff-only release-pipeline
git switch main
git merge release-pipeline
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
peeramid-labs/noolog-app!1
No description provided.