Skip to content

feat(signals-dashboard): discover desks in *-desks group folders 🤖🤖🤖 - #6302

Merged
aaronpowell merged 6 commits into
github:mainfrom
jennyf19:desk-groups
Nov 9, 2026
Merged

aaronpowell merged 6 commits into
github:mainfrom
jennyf19:desk-groups

Conversation

@jennyf19

@jennyf19 jennyf19 commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

Pull Request Checklist

  • I have read and followed the CONTRIBUTING.md guidelines.
  • I have read and followed the Guidance for submissions involving paid services.
  • My contribution adds a new instruction, prompt, agent, skill, workflow, or canvas extension file in the correct directory.
  • The file follows the required naming convention.
  • The content is clearly structured and follows the example format.
  • I have tested my instructions, prompt, agent, skill, workflow, or canvas extension with GitHub Copilot.
  • I have run npm start and verified that README.md is up to date.
  • I am targeting the main branch for this pull request.

Description

Lets a workshop group its desks into top-level folders whose names end in -desks (for example team-desks/), next to desks/ and the legacy classroom/. Teams that keep several workstreams in one workshop can group them without losing them from Cairn.

What changes:

  • Cairn finds desks in desks/, classroom/ and every top-level *-desks/ folder, and identifies each desk as <group>/<desk>, so two groups can each have a desk with the same name.
  • When desks come from more than one folder, the board shows a section per folder, ordered by latest activity, with escalations pinned at the top. A workshop that only uses desks/ looks and behaves as before.
  • Stash entries are keyed by desk id. Existing entries keep working: an entry that holds only a name still hides that desk in desks/ and classroom/.
  • open_desk, get_desk_path, stash and restore accept a desk id or a plain name. refresh and get_desk_path return each desk's group and id.
  • The Workshop TA and the desk-open, desk-journal, bench-read, signal-write and workshop-create skills describe group folders.
  • Versions: signals-dashboard 0.3.2, the-workshop 0.1.2.

A separate commit fixes "gap NaN" in the summary bar. It appeared whenever a desk was still waiting for its first signal, because those desks have no gap value; the bar now averages only desks that have one.

Two review follow-ups, one commit each: the launcher refuses desk paths that hold ;, which Windows Terminal splits commands on, and stash reads no longer write, so a page refresh can't undo a concurrent restore.

Testing

  • npm test in extensions/signals-dashboard: 38 passed, 1 skipped (a macOS-only test, run on Windows). The new tests cover discovery across folders, ignoring other folders, same-named desks in two groups, stash entries from before desk groups, grouped rendering, pinned escalations, activity order, the NaN fix, refusing a desk path with ; (Windows-only) and a refresh that overlaps a restore, and each fails without its change.
  • Plugin and skill validators, codespell and the canvas smoke test pass.
  • Rendered the board against a real workshop with three desk folders and 76 desks in headless Edge: no page errors.
  • Loaded the extension in Copilot CLI 1.0.105 and opened the canvas on the same workshop: the folder sections and the pinned escalation render, and get_desk_path, stash and restore work with desk ids and plain names.

The same change is in the plugin's source repo: jennyf19/the-workshop#21, plus the stash fix in jennyf19/the-workshop#22 and the review fixes in jennyf19/the-workshop#23.


Type of Contribution

  • New instruction file.
  • New prompt file.
  • New agent file.
  • New plugin.
  • New skill file.
  • New agentic workflow.
  • New canvas extension.
  • Update to existing instruction, prompt, agent, plugin, skill, workflow, or canvas extension.
  • Other (please specify):

Jenny Ferries and others added 2 commits November 8, 2026 15:27
Desks can now live in any top-level folder whose name ends in "-desks"
(for example team-desks/), alongside desks/ and the legacy classroom/.
Cairn scans every desk root in a stable order (desks, classroom, then
group folders by name) and identifies each desk as "<group>/<desk>", so
two groups can each hold a desk with the same name.

- Stash/restore entries are keyed by desk id. Existing entries that hold
  only a desk name keep meaning desks/<name>.
- When desks come from more than one root, the board pins escalations
  from every group in a section at the top, then shows a header per
  folder ordered by latest activity (folders without signals follow in
  scan order). A workshop that only uses desks/ renders as before.
- Actions accept a deskId or a plain desk name; refresh, open_desk, and
  get_desk_path return each desk's group and deskId.
- The Workshop TA and the desk-open, desk-journal, bench-read,
  signal-write, and workshop-create skills document group folders.
- Bump signals-dashboard to 0.3.2 and the-workshop to 0.1.2.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: a3e3bdc9-f091-4246-8b0f-3d3442cd59f2
…first signal

Desks without a signal yet have no honestyGap or outcomeRating fields, and
the summary bar filtered with !== null, so undefined slipped through: the
average honesty gap became NaN and the badge title overcounted outcome
signals. Only average finite gaps and count outcomes that are present.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: a3e3bdc9-f091-4246-8b0f-3d3442cd59f2
@jennyf19
jennyf19 requested review from a team as code owners November 8, 2026 23:36
Copilot AI auto review requested due to automatic review settings November 8, 2026 23:36
@github-actions github-actions Bot added agent PR touches agents canvas-extension PR touches canvas extensions plugin PR touches plugins skills PR touches skills labels Nov 8, 2026
@github-actions

github-actions Bot commented Nov 8, 2026

Copy link
Copy Markdown
Contributor

🔒 PR Risk Scan Results

Scanned 13 changed file(s).

Severity Count
🔴 High 0
🟠 Medium 1
ℹ️ Info 0
Severity Rule File Line Match
🟠 unpinned-version-indicator extensions/signals-dashboard/package.json 10 "@​​github/copilot-sdk": "latest"

This is an automated soft-gate report. Findings indicate review targets and do not block merge by themselves.

@github-actions

github-actions Bot commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

🚦 Submission status: 🛠️ Requires submitter fixes

Risk tier: merge-risk:medium — New or substantially changed resource without privileged execution
Required to merge: passing submission-gate checks plus 1 approval from reviewers with write access.

Why this tier
  • Changes 705 lines (low-risk limit is 40)

Automated checks

Check Status Details
Line endings ✅ Passed Passed · logs
Spelling ✅ Passed Passed · logs
Generated README consistency ✅ Passed Passed · logs
Plugin and extension validation ✅ Passed Passed · logs
Canvas extension validation ✅ Passed Passed · logs
Plugin structure ✅ Passed Passed · logs
Skill validation ✅ Passed Passed · logs
Skill lint (vally) ✅ Passed Passed · logs
Risk scan ✅ Passed Passed · logs
Contributor reputation ✅ Passed Passed · logs
Duplicate resource scan ✅ Passed Passed · logs
PR quality signal ⏭️ Skipped Skipped by its workflow · logs
Canvas/plugin smoke test ✅ Passed Passed · logs

Action needed

  • Address the changes requested by aaronpowell, then push an update.

Review

  • Approvals: 0/1
  • Assigned reviewer: not assigned yet — comment /request-review to ask for one
  • Review target date: not set
  • Still needed: 1 more approval(s); resolution of changes requested by aaronpowell
  • No staffed reviewer pool owns these files yet; any reviewer with write access counts as the domain reviewer.

Commands

Command Who What it does
/rerun-checks PR author, maintainers Re-runs failed or incomplete checks and re-evaluates this gate
/request-review PR author, maintainers Asks the review rotation to assign a reviewer (adds needs-reviewer)

Updated for 00046f1 · gate run · This comment is maintained automatically — see submission gate docs.

@github-actions

github-actions Bot commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

🧩 Canvas smoke test

✅ Passed · 0 error(s), 3 warning(s)

Check Result
Syntax, imports, file safety ✅
Preview image (≥ 400×160 PNG) ✅
Plugin manifests ✅
Materialize ✅
Install (Copilot CLI) ✅

Plugin signals-dashboard v0.3.2

Field Value
Description Real-time Workshop dashboard with agent signals, honesty calibration, cost-aware desk profiles, and fail-closed Local Delegation.
Author jennyf19 — https://github.com/jennyf19
License —
Keywords agent-signals, dashboard, multi-agent, coordination, canvas, local-delegation
Extensions signals-dashboard
Materialize ✅
Install ✅
Changed plugin files
  • plugins/signals-dashboard/plugin.json

Plugin the-workshop v0.1.2

Field Value
Description Stop being the switchboard between your AI agents — direct a team. The Workshop puts long-running AI agents (desks) in the same room, on the same work, each with its own memory and history, sharing one workspace so you direct the work instead of relaying it.
Author jennyf19
License MIT
Keywords multi-agent, coordination, desks, persistent-memory, agent-signals, developer-experience
Extensions signals-dashboard
Materialize ✅
Install ✅
Changed plugin files
  • plugins/the-workshop/plugin.json

Extension signals-dashboard

signals-dashboard preview

Field Value
Registered by signals-dashboard, the-workshop
Package signals-dashboard 0.3.2
Preview 1024×1024, 31.7 KB
Modules 5 (3 reachable from extension.mjs)
Files 8

Permissions and capabilities (static analysis of modules reachable from extension.mjs)

  • Spawns processes (node:child_process)
  • File system access (node:fs)
  • Network sockets / local server (node:http, node:net, ...)
  • Host information (node:os)
  • Outbound HTTP requests (fetch)
  • Reads environment variables (process.env)

Warnings

  • launch-profile.test.mjs: non-literal dynamic import cannot be analyzed safely (module is not reachable from extension.mjs)
  • launch-profile.test.mjs: import "node:test" is not a Node.js builtin, host-provided package, or declared dependency (module is not reachable from extension.mjs)
  • local-delegation.test.mjs: import "node:test" is not a Node.js builtin, host-provided package, or declared dependency (module is not reachable from extension.mjs)
Changed extension files
  • extensions/signals-dashboard/README.md
  • extensions/signals-dashboard/extension.mjs
  • extensions/signals-dashboard/launch-profile.test.mjs
  • extensions/signals-dashboard/package.json

Static checks compile modules without executing them. Minimum preview size is configurable with CANVAS_PREVIEW_MIN_WIDTH/CANVAS_PREVIEW_MIN_HEIGHT. Workflow run

@github-actions

github-actions Bot commented Nov 8, 2026

Copy link
Copy Markdown
Contributor

🔍 Vally Lint Results

⚠️ Warnings or advisories found

Scope Checked
Skills 5
Agents 1
Total 6
Severity Count
❌ Errors 0
⚠️ Warnings 0
ℹ️ Advisories 1

Summary

Level Finding
ℹ️ Vally currently lints SKILL.md content. Agent files were detected but skipped:
Full linter output
### Linting skills/bench-read
✅ bench-read (2/2 checks passed)
    ✓ [spec-compliance] All 1 skill(s) are spec-compliant.
        ✓ spec-compliance: All spec checks passed.
    ✓ [valid-refs] All file references across 1 skill(s) are valid.
        ✓ valid-refs: All file references resolve to existing files within the skill directory.

1 skill(s) linted, 1 passed

### Linting skills/desk-journal
✅ desk-journal (2/2 checks passed)
    ✓ [spec-compliance] All 1 skill(s) are spec-compliant.
        ✓ spec-compliance: All spec checks passed.
    ✓ [valid-refs] All file references across 1 skill(s) are valid.
        ✓ valid-refs: All file references resolve to existing files within the skill directory.

1 skill(s) linted, 1 passed

### Linting skills/desk-open
✅ desk-open (2/2 checks passed)
    ✓ [spec-compliance] All 1 skill(s) are spec-compliant.
        ✓ spec-compliance: All spec checks passed.
    ✓ [valid-refs] All file references across 1 skill(s) are valid.
        ✓ valid-refs: All file references resolve to existing files within the skill directory.

1 skill(s) linted, 1 passed

### Linting skills/signal-write
✅ signal-write (2/2 checks passed)
    ✓ [spec-compliance] All 1 skill(s) are spec-compliant.
        ✓ spec-compliance: All spec checks passed.
    ✓ [valid-refs] All file references across 1 skill(s) are valid.
        ✓ valid-refs: All file references resolve to existing files within the skill directory.

1 skill(s) linted, 1 passed

### Linting skills/workshop-create
✅ workshop-create (2/2 checks passed)
    ✓ [spec-compliance] All 1 skill(s) are spec-compliant.
        ✓ spec-compliance: All spec checks passed.
    ✓ [valid-refs] All file references across 1 skill(s) are valid.
        ✓ valid-refs: All file references resolve to existing files within the skill directory.

1 skill(s) linted, 1 passed

### Agent files detected (not linted by vally)
ℹ️ Vally currently lints SKILL.md content. Agent files were detected but skipped:
agents/workshop-ta.agent.md

@github-actions github-actions Bot added ready-for-review Submission passed intake validation and is ready for maintainer review and removed awaiting-automation labels Nov 8, 2026

Copilot AI 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.

🟡 Changes recommended

Legacy name-only stash entries are incorrectly migrated only to desks/, causing unexpired stashed classroom desks to reappear as active after upgrading.

1 open issue
What changed in this PR

Extends Cairn’s workshop dashboard to discover desks in top-level *-desks/ folders alongside desks/ and classroom/, supporting grouped workstreams and same-named desks.

Changes:

  • Adds group-qualified desk IDs, grouped rendering, pinned escalations, and group-aware actions and stash handling.
  • Fixes the summary’s NaN honesty gap and adds regression tests.
  • Updates workshop guidance and bumps dashboard and workshop package versions.
File Description
skills/​workshop-create/​SKILL.md Recognizes group folders during workshop setup.
skills/​signal-write/​SKILL.md Documents signal paths for grouped desks.
skills/​desk-open/​SKILL.md Explains group selection and ambiguous desk names.
skills/​desk-journal/​SKILL.md Adds journal paths for grouped desks.
skills/​bench-read/​SKILL.md Includes grouped desks in artifact discovery.
plugins/​the-workshop/​plugin.json Bumps version to 0.1.2.
plugins/​signals-dashboard/​plugin.json Bumps version to 0.3.2.
extensions/​signals-dashboard/​README.md Documents discovery, grouping, IDs, and stash behavior.
extensions/​signals-dashboard/​package.json Aligns extension version with the plugin.
extensions/​signals-dashboard/​launch-profile.test.mjs Tests discovery, stash isolation, rendering, ordering, and gap calculation.
extensions/​signals-dashboard/​extension.mjs Implements grouped desks and corrects summary calculations.
agents/​workshop-ta.agent.md Adds grouped-desk guidance for the Workshop TA.
.github/​plugin/​marketplace.json Updates published plugin version metadata.

Review effort: Balanced (auto)

@github-actions github-actions Bot added awaiting-automation ready-for-review Submission passed intake validation and is ready for maintainer review and removed ready-for-review Submission passed intake validation and is ready for maintainer review labels Nov 8, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: a3e3bdc9-f091-4246-8b0f-3d3442cd59f2
Copilot AI auto review requested due to automatic review settings November 8, 2026 23:50
@github-actions github-actions Bot added awaiting-automation and removed ready-for-review Submission passed intake validation and is ready for maintainer review labels Nov 8, 2026
@github-actions github-actions Bot added ready-for-review Submission passed intake validation and is ready for maintainer review and removed awaiting-automation labels Nov 8, 2026
…sk groups

Stash entries written before desk groups hold only a desk name, and the
old dashboard hid the desk of that name in desks/ and in classroom/. The
migration mapped every such entry to desks/<name>, so a stashed classroom
desk reappeared after upgrading. Map each one to every built-in root that
holds the desk, falling back to desks/<name>. Entries that already carry a
desk id are unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: a3e3bdc9-f091-4246-8b0f-3d3442cd59f2
@github-actions github-actions Bot added awaiting-automation and removed ready-for-review Submission passed intake validation and is ready for maintainer review labels Nov 9, 2026

Copilot AI 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.

🟡 Changes recommended

Insufficient group-name validation allows Windows Terminal command injection, and legacy stash migration incorrectly reactivates paused classroom desks.

1 open issue
1 resolved since last review

Review effort: Max (auto)

Copilot AI auto review requested due to automatic review settings November 9, 2026 00:02
@github-actions github-actions Bot added ready-for-review Submission passed intake validation and is ready for maintainer review and removed awaiting-automation labels Nov 9, 2026

Copilot AI 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.

🟡 Changes recommended

An unlocked stash read can write a stale snapshot after a concurrent restore, hiding the restored desk again.

2 open issues

Review effort: Balanced (auto)

@aaronpowell aaronpowell 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.

The group-folder support and compatibility work are useful, but I found two issues to fix in extensions/signals-dashboard/extension.mjs. First, isDeskGroupName accepts names containing ;; the resulting full path reaches Windows Terminal's wt -d argument without the launch-safe validation used for desk names. Please apply the safe-name check to group roots or reject unsafe paths in the shared launcher. Second, readStash can write a snapshot after awaiting filesystem checks without holding withStashLock, so a concurrent page refresh can overwrite a restore. Please make reads side-effect-free and persist normalization only under the lock, with focused regression tests for both cases.

Jenny Ferries and others added 2 commits November 8, 2026 17:53
…indows Terminal

Windows Terminal reads every ';' on its command line as a command
separator, even inside an argument (microsoft/terminal#13264). Group
folder names only pass the path-traversal check, so a desk under a
folder such as a;b-desks/ could make `wt -d <path>` start a second
command. The shared launcher now refuses to launch when any Windows
Terminal argument holds ';', which also covers a workshop path with one,
and the caller falls back to copying the path, as it already does for
unsafe desk names. Discovery is unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 23af3266-c56b-4f37-a967-a13587283c2b
…t restore

Page loads and the refresh action read the stash outside withStashLock,
but readStash wrote its normalized list back after awaiting filesystem
checks. A refresh that overlapped a restore could write its older
snapshot last and stash the restored desk again. Reads no longer write:
each read still drops expired entries and normalizes name-only ones, and
only the locked stash and restore paths persist the list.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 23af3266-c56b-4f37-a967-a13587283c2b
Copilot AI auto review requested due to automatic review settings November 9, 2026 01:58
@github-actions github-actions Bot added requires-submitter-fixes Submission has quality-gate findings that submitter must fix before maintainer review and removed ready-for-review Submission passed intake validation and is ready for maintainer review labels Nov 9, 2026
@jennyf19

jennyf19 commented Nov 9, 2026

Copy link
Copy Markdown
Contributor Author

@aaronpowell thanks, both are fixed, one commit each with a regression test that fails without it:

  • 2066571: the shared launcher refuses any Windows Terminal argument that holds ;. This also covers a workshop path with one, which reaches wt through -d and the --add-dir in the cmd /k string.
  • 00046f1: stash reads are side-effect-free; only the locked stash and restore paths write.

Mirrored in jennyf19/the-workshop#23.

Copilot AI 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.

🟢 Approval recommended

No active review issues are reported for the grouped desk discovery changes.

No open issues 🎉

2 resolved since last review

Review effort: Balanced (auto)

@jennyf19

jennyf19 commented Nov 9, 2026

Copy link
Copy Markdown
Contributor Author

/rerun-checks

@github-actions

github-actions Bot commented Nov 9, 2026

Copy link
Copy Markdown
Contributor

🔁 /rerun-checks for 00046f1

No failed or incomplete checks to re-run.

  • Submission Gate waiting for a maintainer to approve workflow runs.

The status comment updates when the checks finish.

@aaronpowell aaronpowell 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.

Thanks for addressing the two requested fixes. The Windows Terminal launcher now refuses arguments containing ;, and stash reads no longer write back while refresh is in progress; the PR also adds focused regression tests for both. The group-qualified desk IDs, legacy stash handling, and updated Workshop guidance make the new folder layout usable without losing the existing workflow.

@aaronpowell
aaronpowell merged commit b13e55f into github:main Nov 9, 2026
38 of 41 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent PR touches agents canvas-extension PR touches canvas extensions merge-risk:medium plugin PR touches plugins requires-submitter-fixes Submission has quality-gate findings that submitter must fix before maintainer review skills PR touches skills

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants