github C# re-analysis due deep scan · partial (269/4,149 files)

Chris0Jeky/Taskdeck

github

Local-first Kanban + capture pipeline for developers — review-first automation (proposal diffs), offline by default.

maintainer
Chris0Jeky
licence
GPL-3.0
first seen
2026-08-12
last seen
2026-09-17
releases · 30d
5
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 0 tools
transport stdio · http counts 0 tools · 0 res · 0 prompts permission surface via code analysis

No tools enumerated yet for this server.

skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit 2cdc452 · analyzer v33 · 2d ago

skills & prompt files 40

danger signals6

code evidence vv0.3.0-rc.1 · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 2847

filesystem 100

  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/docs/analysis/2026-09-08-night-palette-candidates/harness/capture-night-palettes.spec.ts :2 import { readFileSync, writeFileSync, mkdirSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/docs/analysis/2026-09-08-night-palette-candidates/harness/night-palette.config.ts :2 import { mkdirSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/docs/analysis/2026-09-08-night-palette-candidates/measure-contrast.mjs :1 import { readFileSync, writeFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/extensions/vscode-taskdeck/src/manifest.test.ts :2 import { readFileSync } from 'node:fs';
  • fs Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/build/frontendIdentity.node-check.mjs :3 import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'
  • fs Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/build/frontendIdentity.ts :2 import { readdirSync, readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-director-lib.mjs :1 import fs from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-director.mjs :14 import fs from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-lib.mjs :11 import fs from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-report-html.mjs :8 import fs from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-reset-db.mjs :12 import fs from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-scenario-defaults.mjs :1 import fs from 'node:fs/promises'
show 28 more
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-snapshot.mjs :8 import fs from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/scenario-json-runner.mjs :10 import fs from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/tests/config/PaperBranding.spec.ts :1 import { existsSync, readFileSync, readdirSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/tests/public/shareTargetHandler.spec.ts :1 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/tests/theme/authFocusRing.spec.ts :1 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/tests/theme/paperEmberContrast.spec.ts :1 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/demo-director.spec.ts :1 import fs from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/audio-production-policies.spec.ts :1 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/legacy-memory-originals.spec.ts :6 import { readFile } from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/packaged-desktop.spec.ts :1 import { mkdirSync, writeFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/private-memory-sources.spec.ts :3 import { readFile } from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/review-proposals.spec.ts :10 import { mkdir, writeFile } from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/stakeholder-demo.spec.ts :2 import { existsSync, mkdirSync, writeFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/grove-contrast.spec.ts :2 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/legacy-surface-depth-tokens.spec.ts :1 import { readdirSync, readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/paper-disabled-button.spec.ts :1 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/paper-eyebrow-token.spec.ts :1 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/paper-ink-ladder-contrast.spec.ts :1 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/paper-legacy-bridge-invariants.spec.ts :1 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/pwa-generated-worker.spec.ts :1 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/run-vite-dev.spec.ts :2 import { mkdtemp, mkdir, realpath, rm, writeFile } from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/runtime-cache-policy-parity.spec.ts :1 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/vite.config.ts :1 import { readFileSync, writeFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/check-doc-links.mjs :19 import { readdirSync, readFileSync, existsSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/check-doc-links.test.mjs :3 import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/check-docs-governance.mjs :3 import { access, readFile } from 'node:fs/promises'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/check-docs-governance.test.mjs :3 import { readFileSync } from 'node:fs'
  • fs (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/check-github-ops-governance.mjs :3 import { access, readFile } from 'node:fs/promises'

60 more not shown — this panel samples each group; the count above is the real total.

shell / exec 27

  • shell Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/playwright.port-resolution.ts :1 import { spawnSync } from 'node:child_process'
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-director.mjs :13 import { spawnSync } from 'node:child_process'
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/stakeholder-demo.spec.ts :1 import { spawnSync } from 'node:child_process'
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/pwa-generated-worker.spec.ts :2 import { execFileSync } from 'node:child_process'
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/actionlint-bootstrap.test.mjs :2 import { spawnSync } from 'node:child_process'
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/check-k6-thresholds.test.mjs :2 import { spawnSync } from 'node:child_process'
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/compose-release-notes.test.mjs :18 import { spawnSync } from 'node:child_process'
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/dev-up.test.mjs :2 import { spawn, spawnSync } from 'node:child_process'
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/prepare-staging-compose-inputs.mjs :4 import { execFile } from 'node:child_process'
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/release-desktop-dispatch.test.mjs :22 import { spawnSync } from 'node:child_process'
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/require-k6-summary.test.mjs :2 import { spawnSync } from 'node:child_process'
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/select-changelog-base.test.mjs :16 import { spawnSync } from 'node:child_process'
show 15 more
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/artifact-cleanup.mjs :19 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/continuation/adapters/repository.mjs :1 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/continuation/core/snapshot.mjs :1 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/continuation/tests/adapter.test.mjs :7 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/continuation/tests/core.test.mjs :10 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/continuation/tests/export.test.mjs :7 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/continuation/tests/repository.test.mjs :7 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/continuation/tools/export-kit.mjs :2 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/measure-ci-estate.mjs :14 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/merge-base-roundtrip.test.mjs :2 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/nightly-baseline.mjs :11 import { execFileSync, spawnSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/nightly-coordinator.test.mjs :6 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/plan.test.mjs :2 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/recall-report.mjs :7 import { execFileSync } from 'node:child_process';
  • shell (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/resolve-merge-ref.mjs :3 import { execFile } from 'node:child_process';

network 34

  • net Chris0Jeky-Taskdeck-2cdc452/design_handoff_taskdeck_paper/design-canvas.jsx :63 // sidecar next to the HTML. Reads go via plain fetch() so the saved
  • net Chris0Jeky-Taskdeck-2cdc452/extensions/vscode-taskdeck/src/client.ts :2 import * as https from 'node:https';
  • net Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/playwright.port-resolution.ts :2 import { isIP } from 'node:net'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-director-lib.mjs :2 import net from 'node:net'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-lib.mjs :124 const res = await fetch(url, {
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-seed.mjs :30 import { Agent, request as nodeHttpRequest } from 'node:http'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/run-vite-dev.mjs :1 import net from 'node:net'
  • net Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/api/http.ts :1 import axios, { AxiosHeaders, type AxiosError, type InternalAxiosRequestConfig } from 'axios'
  • net Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/api/httpRetry.ts :11 import axios, { type AxiosError, type AxiosRequestConfig } from 'axios'
  • net Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/composables/useProposalRevisions.ts :269 // `revisionsLoaded` false so callers fetch (let the backend decide) rather
  • net Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/store/board/boardCrudStore.ts :7 import axios from 'axios'
  • net Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/store/board/boardStoreHelpers.ts :4 import axios from 'axios'
show 22 more
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/tests/api/http.spec.ts :15 import axios from 'axios'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/tests/api/httpRetry.spec.ts :8 import type { AxiosError } from 'axios'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/tests/api/versionApi.spec.ts :2 import type { AxiosResponse } from 'axios'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/tests/store/board/boardCrudStore.spec.ts :3 import axios from 'axios'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/tests/store/board/boardStoreHelpers.spec.ts :3 import axios from 'axios'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/src/tests/store/notificationStore.realtime.spec.ts :6 * - Stale state reconciliation on re-fetch (server has newer data)
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/demo-seed.spec.ts :1 import { createServer, type IncomingMessage, type Server } from 'node:http'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/audio-transcription.spec.ts :1 import { createServer, type Server } from 'node:http'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/companion-continuity.spec.ts :47 const savedResponse = await route.fetch()
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/error-recovery.spec.ts :375 const response = await route.fetch()
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/integrated-verification.spec.ts :305 const response = await request.fetch(`${API_BASE_URL}${endpoint.path}`, {
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/pwa-api-cache.spec.ts :54 const response = await fetch(url)
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/pwa-proof-strict.spec.ts :201 ' const response = await fetch(event.request)',
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/review-proposals.spec.ts :346 const response = await route.fetch()
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/thinking-audio.spec.ts :40 const accepted = await route.fetch()
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/workspace-plan.spec.ts :42 const committed = await route.fetch()
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/run-vite-dev.spec.ts :1 import net from 'node:net'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/dev-up.test.mjs :14 import net from 'node:net'
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/artifact-cleanup.mjs :120 const response = await fetch(url, {
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/measure-ci-estate.mjs :88 const response = await fetch(url, {
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/nightly-baseline.mjs :389 const response = await fetch(`${API}${path}`, {
  • net (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/recall-report.mjs :139 const response = await fetch(url, {

secrets 9

  • secrets (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-lib.mjs :93 password: process.env.TASKDECK_DEMO_PASSWORD || 'demo123',
  • secrets (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/scripts/demo-seed.mjs :356 password: process.env.TASKDECK_DEMO_PASSWORD || 'demo123',
  • secrets (weak) Chris0Jeky-Taskdeck-2cdc452/frontend/taskdeck-web/tests/e2e/stakeholder-demo.spec.ts :312 const demoPassword = process.env.TASKDECK_DEMO_PASSWORD || 'demo123'
  • secrets (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/artifact-cleanup.mjs :105 const fromEnv = process.env.GH_TOKEN || process.env.GITHUB_TOKEN;
  • secrets (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/continuation/tools/collect-github.mjs :9 export async function collectCli(argv, { token = process.env.GH_TOKEN, fetchImpl = globalThis.fetch } = {}) {
  • secrets (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/measure-ci-estate.mjs :73 const fromEnv = process.env.GH_TOKEN || process.env.GITHUB_TOKEN;
  • secrets (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/nightly-baseline.mjs :382 const token = process.env.GH_TOKEN || process.env.GITHUB_TOKEN;
  • secrets (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/recall-report.mjs :124 const fromEnv = process.env.GH_TOKEN || process.env.GITHUB_TOKEN;
  • secrets (weak) Chris0Jeky-Taskdeck-2cdc452/scripts/ci/smart-ci/resolve-merge-ref.mjs :64 token = process.env.GH_TOKEN,

declared dependencies 58

  • ModelContextProtocol@*
  • ModelContextProtocol.AspNetCore@*
  • ModelContextProtocol@2.2.0
  • ModelContextProtocol.AspNetCore@2.2.0
  • @types/node@^20.11.0
  • @types/vscode@^1.85.0
  • typescript@^5.3.0
  • Microsoft.AspNetCore.Authentication.JwtBearer@*
  • Microsoft.AspNetCore.Authentication.OpenIdConnect@*
  • Microsoft.AspNetCore.SignalR.StackExchangeRedis@*
  • Microsoft.EntityFrameworkCore.Design@*
  • Microsoft.EntityFrameworkCore.Tools@*
show 28 more
  • Microsoft.Extensions.Http.Polly@*
  • OpenTelemetry.Exporter.Console@*
  • OpenTelemetry.Exporter.OpenTelemetryProtocol@*
  • OpenTelemetry.Extensions.Hosting@*
  • OpenTelemetry.Instrumentation.AspNetCore@*
  • OpenTelemetry.Instrumentation.Http@*
  • Sentry.AspNetCore@*
  • Swashbuckle.AspNetCore@*
  • Microsoft.AspNetCore.Authentication.JwtBearer@8.0.30
  • Microsoft.AspNetCore.Authentication.OpenIdConnect@8.0.30
  • Microsoft.AspNetCore.Mvc.Testing@8.0.30
  • Microsoft.AspNetCore.SignalR.Client@8.0.30
  • Microsoft.AspNetCore.SignalR.StackExchangeRedis@8.0.30
  • Microsoft.EntityFrameworkCore@8.0.30
  • Microsoft.EntityFrameworkCore.Design@8.0.30
  • Microsoft.EntityFrameworkCore.Sqlite@8.0.30
  • Microsoft.EntityFrameworkCore.SqlServer@8.0.30
  • Microsoft.EntityFrameworkCore.Tools@8.0.30
  • Npgsql.EntityFrameworkCore.PostgreSQL@8.0.11
  • SQLitePCLRaw.bundle_e_sqlite3@3.0.5
  • Microsoft.Extensions.Hosting@8.0.1
  • Microsoft.Extensions.Http.Polly@8.0.30
  • Microsoft.Extensions.Logging.Abstractions@8.0.3
  • Microsoft.IdentityModel.Tokens@8.22.0
  • System.IdentityModel.Tokens.Jwt@8.22.0
  • OpenTelemetry.Exporter.Console@1.18.0
  • OpenTelemetry.Exporter.OpenTelemetryProtocol@1.18.0
  • OpenTelemetry.Extensions.Hosting@1.18.0

18 more not shown — this panel samples each group; the count above is the real total.