Skip to content

Fold Done and Resolved below Working in Overview - #2226

Merged
JacobStephens2 merged 5 commits into
mainfrom
issue-2212
Nov 14, 2026
Merged

JacobStephens2 merged 5 commits into
mainfrom
issue-2212

Conversation

@JacobStephens2

@JacobStephens2 JacobStephens2 commented Nov 14, 2026 •

Copy link
Copy Markdown
Owner

Closes #2212

Summary

Overview now shows Done and Resolved below Working. They render folded, with or without JavaScript, so you can open either in place to see what finished without leaving the page. In their own folders (/?section=done, /?section=resolved) they open as before.

 Overview
   ▾ Needs you
   ▾ Ready for review
   ▾ Landing
   ▾ Working
+  ▸ Done       (folded; heading and live count)
+  ▸ Resolved   (folded; heading and live count)

Browser fold choices (src/console/assets/folds.js, new):

expectedOpen(group) = stored choice ?? folder default
  folder default: closed only for Done/Resolved in Overview
  Overview keeps its Done/Resolved choices under their own keys,
    so glancing at Done in Overview never folds the Done folder
on toggle:        store only when the group differs from expectedOpen
on folder change: save unsaved toggles, then apply the new folder's defaults
on live refresh:  leave groups alone
  • Server: InboxPage::opens drops open for Done/Resolved in Overview. The always-true in_overview predicate and data-overview marker are gone, and data-overview-folded marks the two groups.
  • Browser: console.js used to store every group's state, defaults included. Choices now live under thirdshift:console:folds. Only closed groups are migrated from the old thirdshift:console:folded key, because old Consoles rendered every group open, so a stored true was never a choice.
  • Docs: console/README.md, docs/guide.md (and the regenerated site/docs/index.html), plus the hand-written site/index.html, site/how-it-works/ and site/architecture/.

Evidence

Execution evidence

  • Before: the new browser tests, run against the merge-base binary (f00bb10):
    THIRDSHIFT_BINARY=<merge-base build> node --test --test-name-pattern="Overview folds Done and Resolved|re-folding Done in Overview" console/tests/inbox.test.cjs
    not ok 17 - Overview folds Done and Resolved below Working and opens them in place on desktop and phone
        Expected values to be strictly deep-equal:
    not ok 19 - re-folding Done in Overview leaves its own folder open
        '' !== null
    not ok 20 - Overview folds Done and Resolved without JavaScript and opens them in place
        Expected values to be strictly deep-equal:
    # pass 0
    # fail 3
    
    After: the same command against this branch:
    ok 17 - Overview folds Done and Resolved below Working and opens them in place on desktop and phone
    ok 19 - re-folding Done in Overview leaves its own folder open
    ok 20 - Overview folds Done and Resolved without JavaScript and opens them in place
    # pass 3
    # fail 0
    
  • Before: the Spec review's test, run on this branch's first commit: cd console && node --test --test-name-pattern='re-folding Done in Overview' tests/inbox.test.cjs gave not ok 19 … null !== ''.
    After: ok 19 - re-folding Done in Overview leaves its own folder open.
  • Final scripts/affected-tests origin/main on the merged head:
    • PASS npm test --prefix site
    • PASS cargo build --locked
    • PASS npm test --prefix console (all Console browser tests)
    • FAIL cargo test: 1898 passed; 24 failed. All 24 failures are sandbox::tests, each sandbox failed to start: socat is not on PATH. This host has no socat, and this change does not touch src/sandbox.rs.
    • Cargo stopped there, so I ran cargo test --test console on the merged head: 337 passed; 0 failed.
  • Integration tests on the pre-merge head (cargo test --no-fail-fast --test '*', in two runs): every failure was a sandboxed test that needs socat (sandbox_unavailable / socat is not on PATH), except triage_pass::recommendation_only_pass_reserves_without_claiming_or_publishing_and_notifies, which passed when rerun alone.
  • Build setup: this host has no C compiler, so Cargo linked through a shim running gcc in a node:22 container. CI's run is authoritative for the sandbox tests.

Visual evidence

Overview, 1440×900 desktop (full page):

Before
After

Overview, 390×844 phone (full page):

Before
After

After, desktop, Done opened in place by clicking its heading (URL unchanged):

After, Done opened

The machine name in the captures is replaced with console.example.

Unaddressed findings

None. The review raised 4 Standards findings and 1 Spec finding, and all were fixed in 1c1963d:

  • Spec 1: re-folding Done in Overview folded its own folder. The reviewer's test was added verbatim, failed, and now passes.
  • Standards 1–4: dead in_overview predicate, clashing storage-helper names, unclear names in folds.js, and duplicated test pairs.

Security: none. The Security review found no vulnerability introduced by this change. Group names come from a fixed server enum and are auto-escaped. Overview already rendered every group (only with hidden), so no new data reaches the page. folds.js reads localStorage only to set open on server-rendered disclosures, and it merges with Object.fromEntries and spread, with no recursive writes.

Review coverage: both reviewers read every changed file. site/docs/index.html was excluded as generated output: it was regenerated with npm run docs --prefix site, and npm run docs:check --prefix site passes. Its source, docs/guide.md, was reviewed instead.

Security review outcome

No unaddressed introduced findings.

Merge Danger

Door: two-way

Reverting restores the four-group Overview. The only lasting effect is a new localStorage key, thirdshift:console:folds; the old key is read, never deleted.

Blast Radius: Inbox

  • Overview gets two more headings, below Working.
  • Every Inbox page now loads folds.js.
  • A browser that folded a group under the old key keeps that fold. A browser that had only default (open) states for Done/Resolved now sees them folded in Overview, as intended.

CI notes

  • rust-x86 / run (4) (and the rust-x86 / complete / test roll-ups that depend on it) failed only in tests/console/github.rs::mergeability_changes_wake_ready_rows_independently_of_ci, which this branch does not touch. The test panicked at tests/console/github.rs:214 because status --json showed no github_mergeable yet after a commands event: a timing race in GitHub observation, which no change here affects. The same panic at the same line hit issue-2211 (run 43597992022), and the test passed on main after that branch merged (run 43606697531, cf505b70).

Built with claude 2.1.322 · claude-opus-5-5 · high

Overview now shows every Inbox section. Done and Resolved render closed
there, with or without JavaScript, and open in their own folders. The
browser keeps only groups it folded or opened (thirdshift:console:folds),
migrating closed groups from the older key, and applies a folder's
defaults only on entering it, so a live refresh never undoes a toggle.
Address review: re-folding Done in Overview no longer folds the Done
folder. Drop the always-true in_overview predicate and data-overview
marker, rename folds.js helpers, and tidy duplicated test pairs.
# Conflicts:
#	console/README.md
#	site/index.html
@JacobStephens2
JacobStephens2 merged commit 864c1b8 into main Nov 14, 2026
11 checks passed
@JacobStephens2
JacobStephens2 deleted the issue-2212 branch November 14, 2026 15:36
@JacobStephens2 JacobStephens2 mentioned this pull request Nov 15, 2026
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.

add done and resolved sections below working on /?section=overview, folded closed by default

1 participant