diff --git a/.github/workflows/agent-pr-review.yml b/.github/workflows/agent-pr-review.yml index ea69e2b2..a014d622 100644 --- a/.github/workflows/agent-pr-review.yml +++ b/.github/workflows/agent-pr-review.yml @@ -8,6 +8,10 @@ permissions: contents: write pull-requests: write +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number }} + cancel-in-progress: true + jobs: agent-review: runs-on: ubuntu-latest @@ -25,6 +29,11 @@ jobs: node-version: 20 cache: 'npm' + - name: Add upstream remote + run: | + git remote add upstream https://github.com/PR0M3TH3AN/bitvid.git || true + git fetch upstream + - name: Run Agent Review env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2de7e81d..61f888f9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,9 +6,14 @@ on: - main pull_request: +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest + timeout-minutes: 45 strategy: matrix: node-version: [20] @@ -76,6 +81,7 @@ jobs: unit-tests: runs-on: ubuntu-latest + timeout-minutes: 30 strategy: fail-fast: false matrix: @@ -119,6 +125,7 @@ jobs: dm-unit-tests: runs-on: ubuntu-latest + timeout-minutes: 20 strategy: matrix: node-version: [20] @@ -158,6 +165,7 @@ jobs: dm-integration-tests: runs-on: ubuntu-latest + timeout-minutes: 30 strategy: matrix: node-version: [20] @@ -197,6 +205,7 @@ jobs: e2e-headless: runs-on: ubuntu-latest + timeout-minutes: 45 strategy: matrix: node-version: [20] diff --git a/.github/workflows/cleanup-stuck-runs.yml b/.github/workflows/cleanup-stuck-runs.yml new file mode 100644 index 00000000..3da93cd9 --- /dev/null +++ b/.github/workflows/cleanup-stuck-runs.yml @@ -0,0 +1,72 @@ +name: Cleanup stuck workflow runs + +on: + schedule: + - cron: '*/30 * * * *' + workflow_dispatch: + +permissions: + actions: write + +jobs: + cleanup: + runs-on: ubuntu-latest + steps: + - name: Cancel stuck workflow runs + uses: actions/github-script@v7 + env: + STALE_THRESHOLD_HOURS: '2' + with: + script: | + const thresholdHours = Number(process.env.STALE_THRESHOLD_HOURS || 2); + const thresholdMs = thresholdHours * 60 * 60 * 1000; + const now = Date.now(); + + const statuses = ['queued', 'in_progress']; + const owner = context.repo.owner; + const repo = context.repo.repo; + const staleRuns = []; + + for (const status of statuses) { + const runs = await github.paginate(github.rest.actions.listWorkflowRunsForRepo, { + owner, + repo, + status, + per_page: 100, + }); + + for (const run of runs) { + const createdAt = Date.parse(run.created_at); + if (Number.isNaN(createdAt)) { + core.warning(`Skipping run ${run.id} (${run.name}) due to invalid created_at.`); + continue; + } + + const ageMs = now - createdAt; + if (ageMs > thresholdMs) { + staleRuns.push({ + id: run.id, + name: run.name, + status: run.status, + created_at: run.created_at, + html_url: run.html_url, + }); + } + } + } + + if (staleRuns.length === 0) { + core.info(`No runs older than ${thresholdHours} hours found in queued/in_progress.`); + return; + } + + core.info(`Found ${staleRuns.length} stale runs older than ${thresholdHours} hours.`); + + for (const run of staleRuns) { + core.info(`Canceling run ${run.id} (${run.name}) status=${run.status} created_at=${run.created_at} url=${run.html_url}`); + await github.request('POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel', { + owner, + repo, + run_id: run.id, + }); + } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d2351564..bf32bf1c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,6 +49,41 @@ Automated agents contributing to this repository should follow these rules: 4. Push your branch and open a Pull Request against the `main` branch. 5. Provide a clear description of the problem and solution. +## CI Behavior and Operations + +### Concurrency (superseded runs) + +The `CI` workflow is configured with `concurrency.cancel-in-progress: true`, which means when you push new commits to the same PR or branch, any in-flight run for the same workflow group is canceled automatically. This keeps the latest changes running and stops superseded runs from burning capacity. If you need to cancel runs manually (for example, stuck or obviously outdated runs), operators can use the GitHub CLI: + +```bash +gh run list --workflow=CI --limit 10 +gh run list --workflow=CI --limit 10 | awk 'NR>1 {print $1}' | xargs -n1 gh run cancel +``` + +If a run refuses to cancel normally, GitHub provides a `force-cancel` endpoint. We only use this in the automated cleanup workflow (below) or when a normal `gh run cancel` does not take effect. + +### Job timeouts + +Each job in the `CI` workflow has an explicit timeout: + +- `build`: 45 minutes +- `unit-tests` (sharded): 30 minutes +- `dm-unit-tests`: 20 minutes +- `dm-integration-tests`: 30 minutes +- `e2e-headless`: 45 minutes + +If a job exceeds its timeout, the runner terminates it automatically, so keep an eye on the longest-running suites when adjusting tests. + +### Cleanup workflow (manual invocation) + +The `Cleanup stuck workflow runs` workflow cancels queued or in-progress runs older than the configured stale threshold (currently 2 hours). It runs on a schedule every 30 minutes, but you can also trigger it manually: + +```bash +gh workflow run "Cleanup stuck workflow runs" +``` + +This workflow uses the `force-cancel` endpoint to ensure stalled runs are terminated reliably, so prefer it for true stuck runs instead of normal cancellation. + ## Development Setup To set up the project locally: @@ -62,11 +97,19 @@ To set up the project locally: ```bash npm run build ``` + (This runs `npm run build:css` to generate Tailwind styles.) 3. **Run Tests**: ```bash npm run test:unit ``` + *Note: Unit tests may take a few minutes to complete.* + + You can also run end-to-end and visual tests: + ```bash + npm run test:e2e + npm run test:visual + ``` 4. **Format & Lint**: ```bash @@ -82,6 +125,13 @@ To set up the project locally: For a full guide, see the [Local Setup section in README.md](./README.md#local-setup). +### Troubleshooting + +- **Browserslist Warning**: If you see `Browserslist: caniuse-lite is outdated` during the build, run: + ```bash + npx update-browserslist-db@latest + ``` + ## Dev Container This project includes a `.devcontainer` configuration for VS Code. It provides a pre-configured environment with Node.js 22 and necessary extensions. diff --git a/README.md b/README.md index 276a0ad7..c8710129 100644 --- a/README.md +++ b/README.md @@ -103,8 +103,14 @@ To run **bitvid** locally: 2. Install dependencies: + If you cloned the repo but haven’t run `npm install`/`npm ci`, `npx` won’t find the local `tailwindcss`. + ```bash + # reproducible install (preferred for CI / locks) npm ci + + # or if you want to install/upgrade packages + npm install ``` 3. Build the project: @@ -139,6 +145,7 @@ http://localhost:8000 - **Run DM unit tests**: `npm run test:dm:unit` - **Run DM integration tests**: `npm run test:dm:integration` - **Run headless E2E tests**: `npm run test:e2e` +- **Cancel CI runs**: See [`docs/cancelling-ci-runs.md`](docs/cancelling-ci-runs.md) for a script to clear pending workflows. ### Running Tests in Docker @@ -172,7 +179,7 @@ Use these artifacts to inspect the UI state at the moment of failure and diagnos ### Send your first video post -Use the event builders in `js/nostrEventSchemas.js` to construct valid video notes. +Use the event builders in `js/nostrEventSchemas.js` (the source of truth for all event definitions) to construct valid video notes. ```javascript import { buildVideoPostEvent } from "./js/nostrEventSchemas.js"; diff --git a/REMEDIATION_REPORT.md b/REMEDIATION_REPORT.md new file mode 100644 index 00000000..6ecc33cc --- /dev/null +++ b/REMEDIATION_REPORT.md @@ -0,0 +1,45 @@ +# Daily Design System Audit Report + +Headline: ⚠️ 16 violations found + +## CSS +Total count: 0 + + +## Hex Colors +Total count: 16 + +| File | Line | Snippet | +|---|---|---| +| ./js/themeController.js | 7 | `dark: "#0f172a",` | +| ./js/themeController.js | 8 | `light: "#f8fafc",` | +| ./js/ui/ambientBackground.js | 34 | `return "#000000";` | +| ./js/ui/loginModalController.js | 1303 | `let qrLightColor = "#ffffff";` | +| ./js/ui/loginModalController.js | 1304 | `let qrDarkColor = "#000000";` | +| ./js/ui/components/VideoModal.js | 2168 | `return "#000000";` | +| ./config/validate-config.js | 97 | `THEME_ACCENT_OVERRIDES.${theme}.${token} must be ...` | +| ./config/instance-config.js | 291 | `* Operators can provide hex color strings (e.g., ...` | +| ./config/instance-config.js | 299 | `accent: "#540011",` | +| ./config/instance-config.js | 300 | `accentStrong: "#fe0032",` | +... and 6 more. + +## Inline Styles +Total count: 0 + + +## Raw Lengths +Total count: 0 + + +## Bracket Utilities +Total count: 0 + + +## Tailwind Palette +Total count: 0 + + +## Next Steps +- [ ] Review violations +- [ ] Apply auto-fixes (if safe) +- [ ] Open remediation PR diff --git a/ai/reports/onboarding-20241024.md b/ai/reports/onboarding-20241024.md new file mode 100644 index 00000000..c7178ddf --- /dev/null +++ b/ai/reports/onboarding-20241024.md @@ -0,0 +1,45 @@ +# Onboarding Audit Report + +Date: 2024-10-24 +Environment: Node.js v22.22.0 + +## Execution Results + +| Command | Status | Notes | +| :--- | :--- | :--- | +| `npm ci` | Success | Installed dependencies correctly. | +| `npm run build:css` | Success | Generated `css/tailwind.generated.css`. Warnings observed: `Browserslist: caniuse-lite is outdated` and Tailwind mixed units warning. | +| `npm run format` | Success | No files were modified (codebase is clean). | +| `npm run lint` | Success | All lint checks passed. | +| `npm run test:unit` | Success | Tests ran successfully (100+ tests passed), though execution time is significant (> 5 minutes). | + +## Documentation Alignment + +- **README.md**: + - Mentions `npm run build`. Correct (delegates to `build:css`). + - Mentions `npm run test:unit`. Correct. + - Mentions starting server `python -m http.server 8000`. Correct. + +- **CONTRIBUTING.md**: + - Mentions `npm run build`. Correct. + - Mentions `npm run test:unit`. Correct. + - Mentions `npm run format` and `npm run lint`. Correct. + +## Devcontainer + +- `.devcontainer/devcontainer.json` exists and uses `mcr.microsoft.com/devcontainers/javascript-node:22`. +- This aligns with the local environment (Node v22) used for validation. +- `postCreateCommand` runs `npm ci && npm run build`. This is efficient. + +## Recommendations + +1. **Documentation**: + - `CONTRIBUTING.md`: The section "Development Setup" is accurate. However, we can add a note about `npm run build:css` explicitly if users want to just build CSS without the alias, but `npm run build` is better. + - We could add a note about the expected warnings during build to reassure new developers. + - The `caniuse-lite` warning suggests we should run `npx update-browserslist-db@latest` and commit the lockfile change, but that might be out of scope for "docs". However, I can try it. + +2. **Devcontainer**: + - The setup seems solid. No changes required. + +3. **General**: + - Run `npx update-browserslist-db@latest` to fix the build warning. diff --git a/ai/reports/telemetry-20260123.md b/ai/reports/telemetry-20260123.md new file mode 100644 index 00000000..b96c45dc --- /dev/null +++ b/ai/reports/telemetry-20260123.md @@ -0,0 +1,215 @@ +# Telemetry Report - 2026-01-23 + +**Total Unique Issues:** 16 +**Generated:** 2026-01-23T06:26:53.283Z + +## Top 10 Priority Issues + +| Priority | Count | Issue | Owner | Sources | +| :--- | :---: | :--- | :--- | :--- | +| **High** | 2 | [batchFetchProfiles] Failed to fetch profiles from relay ... | QA Team | test_unit.log, test_unit_debug.log | +| **High** | 1 | [ChannelProfile] Failed to prepare channel videos for mod... | QA Team | test_unit.log | +| **High** | 1 | [ChannelProfile] Failed to decorate channel video moderat... | QA Team | test_unit.log | +| **High** | 1 | [ChannelProfile] Failed to decorate channel video moderat... | QA Team | test_unit.log | +| **High** | 1 | [ChannelProfile] Failed to decorate channel video moderat... | QA Team | test_unit.log | +| **High** | 1 | [ChannelProfile] Failed to decorate channel video moderat... | QA Team | test_unit.log | +| **High** | 1 | [ChannelProfile] Failed to decorate channel video moderat... | QA Team | test_unit.log | +| **High** | 1 | [ChannelProfile] Failed to decorate channel video moderat... | QA Team | test_unit.log | +| **High** | 1 | [ChannelProfile] Failed to decorate channel video moderat... | QA Team | test_unit.log | +| **High** | 1 | [ChannelProfile] Failed to decorate channel video moderat... | Unassigned | test_unit.log | + +## Detailed Breakdown + +### [High] [batchFetchProfiles] Failed to fetch profiles from relay wss://fail.example: Error: relay timed out +- **Occurrences:** 2 +- **Sources:** test_unit.log, test_unit_debug.log +- **Suggested Owner:** QA Team +- **Fingerprint:** `b6566eea` + +**Stack Trace / Details:** +``` +[batchFetchProfiles] Failed to fetch profiles from relay wss://fail.example: Error: relay timed out +at Object.list (file://$REPO/tests/app-batch-fetch-profiles.test.mjs:80:31) +at file://$REPO/js/utils/profileBatchFetcher.js:115:10 +at Array.map () +at batchFetchProfilesFromRelays (file://$REPO/js/utils/profileBatchFetcher.js:112:75) +at TestContext. (file://$REPO/tests/app-batch-fetch-profiles.test.mjs:87:11) +at Test.runInAsyncScope (node:async_hooks:214:14) +at Test.run (node:internal/test_runner/test:1047:25) +at Test.start (node:internal/test_runner/test:944:17) +at startSubtestAfterBootstrap (node:internal/test_runner/harness:296:17) +``` + +### [High] [ChannelProfile] Failed to prepare channel videos for moderation TypeError: Cannot read properties of undefined (reading 'normalizeModerationSettings') +- **Occurrences:** 1 +- **Sources:** test_unit.log +- **Suggested Owner:** QA Team +- **Fingerprint:** `c18193e3` + +**Stack Trace / Details:** +``` +[ChannelProfile] Failed to prepare channel videos for moderation TypeError: Cannot read properties of undefined (reading 'normalizeModerationSettings') +at Application.getActiveModerationThresholds (file://$REPO/js/app.js:6593:56) +at applyChannelModerationToVideos (file://$REPO/js/channelProfile.js:282:21) +at renderChannelVideosFromList (file://$REPO/js/channelProfile.js:4490:28) +at TestContext. (file://$REPO/tests$REPO/channel-profile-moderation.test.mjs:135:26) +at async Test.run (node:internal/test_runner/test:1054:7) +at async startSubtestAfterBootstrap (node:internal/test_runner/harness:296:3) +``` + +### [High] [ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +- **Occurrences:** 1 +- **Sources:** test_unit.log +- **Suggested Owner:** QA Team +- **Fingerprint:** `1e73620e` + +**Stack Trace / Details:** +``` +[ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +at Application.decorateVideoModeration (file://$REPO/js/app.js:6598:37) +at decorateChannelVideo (file://$REPO/js/channelProfile.js:210:29) +at applyChannelModerationToVideos (file://$REPO/js/channelProfile.js:363:26) +at async renderChannelVideosFromList (file://$REPO/js/channelProfile.js:4490:22) +at async TestContext. (file://$REPO/tests$REPO/channel-profile-moderation.test.mjs:216:20) +at async Test.run (node:internal/test_runner/test:1054:7) +at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) +``` + +### [High] [ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +- **Occurrences:** 1 +- **Sources:** test_unit.log +- **Suggested Owner:** QA Team +- **Fingerprint:** `21dc1236` + +**Stack Trace / Details:** +``` +[ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +at Application.decorateVideoModeration (file://$REPO/js/app.js:6598:37) +at decorateChannelVideo (file://$REPO/js/channelProfile.js:210:29) +at resolveChannelModeration (file://$REPO/js/channelProfile.js:917:23) +at applyChannelVisualBlur (file://$REPO/js/channelProfile.js:962:22) +at updateChannelModerationVisuals (file://$REPO/js/channelProfile.js:1027:18) +at renderChannelVideosFromList (file://$REPO/js/channelProfile.js:4893:3) +at async TestContext. (file://$REPO/tests$REPO/channel-profile-moderation.test.mjs:216:20) +at async Test.run (node:internal/test_runner/test:1054:7) +at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) +``` + +### [High] [ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +- **Occurrences:** 1 +- **Sources:** test_unit.log +- **Suggested Owner:** QA Team +- **Fingerprint:** `9cebf1f5` + +**Stack Trace / Details:** +``` +[ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +at Application.decorateVideoModeration (file://$REPO/js/app.js:6598:37) +at decorateChannelVideo (file://$REPO/js/channelProfile.js:210:29) +at applyChannelModerationToVideos (file://$REPO/js/channelProfile.js:363:26) +at async renderChannelVideosFromList (file://$REPO/js/channelProfile.js:4490:22) +at async TestContext. (file://$REPO/tests$REPO/channel-profile-moderation.test.mjs:309:3) +at async Test.run (node:internal/test_runner/test:1054:7) +at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) +``` + +### [High] [ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +- **Occurrences:** 1 +- **Sources:** test_unit.log +- **Suggested Owner:** QA Team +- **Fingerprint:** `a8230c7d` + +**Stack Trace / Details:** +``` +[ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +at Application.decorateVideoModeration (file://$REPO/js/app.js:6598:37) +at decorateChannelVideo (file://$REPO/js/channelProfile.js:210:29) +at resolveChannelModeration (file://$REPO/js/channelProfile.js:917:23) +at applyChannelVisualBlur (file://$REPO/js/channelProfile.js:962:22) +at updateChannelModerationVisuals (file://$REPO/js/channelProfile.js:1027:18) +at renderChannelVideosFromList (file://$REPO/js/channelProfile.js:4893:3) +at async TestContext. (file://$REPO/tests$REPO/channel-profile-moderation.test.mjs:309:3) +at async Test.run (node:internal/test_runner/test:1054:7) +at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) +``` + +### [High] [ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +- **Occurrences:** 1 +- **Sources:** test_unit.log +- **Suggested Owner:** QA Team +- **Fingerprint:** `07c6b0b2` + +**Stack Trace / Details:** +``` +[ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +at Application.decorateVideoModeration (file://$REPO/js/app.js:6598:37) +at decorateChannelVideo (file://$REPO/js/channelProfile.js:210:29) +at applyChannelModerationToVideos (file://$REPO/js/channelProfile.js:363:26) +at async renderChannelVideosFromList (file://$REPO/js/channelProfile.js:4490:22) +at async TestContext. (file://$REPO/tests$REPO/channel-profile-moderation.test.mjs:383:3) +at async Test.run (node:internal/test_runner/test:1054:7) +at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) +``` + +### [High] [ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +- **Occurrences:** 1 +- **Sources:** test_unit.log +- **Suggested Owner:** QA Team +- **Fingerprint:** `abfcb1f2` + +**Stack Trace / Details:** +``` +[ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +at Application.decorateVideoModeration (file://$REPO/js/app.js:6598:37) +at decorateChannelVideo (file://$REPO/js/channelProfile.js:210:29) +at resolveChannelModeration (file://$REPO/js/channelProfile.js:917:23) +at applyChannelVisualBlur (file://$REPO/js/channelProfile.js:962:22) +at updateChannelModerationVisuals (file://$REPO/js/channelProfile.js:1027:18) +at renderChannelVideosFromList (file://$REPO/js/channelProfile.js:4893:3) +at async TestContext. (file://$REPO/tests$REPO/channel-profile-moderation.test.mjs:383:3) +at async Test.run (node:internal/test_runner/test:1054:7) +at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) +``` + +### [High] [ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +- **Occurrences:** 1 +- **Sources:** test_unit.log +- **Suggested Owner:** QA Team +- **Fingerprint:** `ff2d20dc` + +**Stack Trace / Details:** +``` +[ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +at Application.decorateVideoModeration (file://$REPO/js/app.js:6598:37) +at decorateChannelVideo (file://$REPO/js/channelProfile.js:210:29) +at resolveChannelModeration (file://$REPO/js/channelProfile.js:917:23) +at applyChannelVisualBlur (file://$REPO/js/channelProfile.js:962:22) +at TestContext. (file://$REPO/tests$REPO/channel-profile-moderation.test.mjs:390:3) +at async Test.run (node:internal/test_runner/test:1054:7) +at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) +``` + +### [High] [ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +- **Occurrences:** 1 +- **Sources:** test_unit.log +- **Suggested Owner:** Unassigned +- **Fingerprint:** `812d9b22` + +**Stack Trace / Details:** +``` +[ChannelProfile] Failed to decorate channel video moderation TypeError: Cannot read properties of undefined (reading 'decorateVideo') +at Application.decorateVideoModeration (file://$REPO/js/app.js:6598:37) +at decorateChannelVideo (file://$REPO/js/channelProfile.js:210:29) +at resolveChannelModeration (file://$REPO/js/channelProfile.js:917:23) +at applyChannelVisualBlur (file://$REPO/js/channelProfile.js:962:22) +at updateChannelModerationVisuals (file://$REPO/js/channelProfile.js:1027:18) +at handleChannelModerationOverride (file://$REPO/js/channelProfile.js:804:5) +at channelModerationBadgeState.boundOverride (file://$REPO/js/channelProfile.js:570:7) +at HTMLButtonElement.callTheUserObjectsOperation ($REPO/node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30) +at innerInvokeEventListeners ($REPO/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25) +at invokeEventListeners ($REPO/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3) +``` + + +--- +*Privacy Notice: PII (IPs, emails, keys) has been sanitized from this report.* diff --git a/artifacts/load-report-20260122.json b/artifacts/load-report-20260122.json deleted file mode 100644 index 64d1f39d..00000000 --- a/artifacts/load-report-20260122.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "summary": { - "date": "2026-01-22T19:39:07.362Z", - "duration_sec": 14.367, - "clients": 50, - "events_published": 380, - "events_confirmed": 380, - "events_failed": 0 - }, - "metrics": { - "throughput": { - "avg_events_per_sec": 26.44950233173244 - }, - "latency_ms": { - "build": { - "avg": 0.09473684210526316, - "p95": 1 - }, - "sign": { - "avg": 6.257894736842105, - "p95": 10 - }, - "rtt": { - "avg": 30.563157894736843, - "p95": 50 - } - }, - "resources": { - "cpu_samples": [ - { - "timestamp": 9.227, - "user": 1834418, - "system": 114421 - }, - { - "timestamp": 14.266, - "user": 3170422, - "system": 155074 - } - ], - "memory_samples": [ - { - "timestamp": 9.227, - "rss": 94273536, - "heapUsed": 11273392 - }, - { - "timestamp": 14.266, - "rss": 94453760, - "heapUsed": 11443640 - } - ] - }, - "errors": [] - }, - "hot_functions": [ - { - "name": "buildEvent", - "avg_ms": 0.09473684210526316 - }, - { - "name": "signEvent", - "avg_ms": 6.257894736842105 - } - ], - "recommendations": [ - "If signEvent latency > 5ms, consider offloading signing to Web Workers or using Wasm optimization.", - "If RTT is high but build/sign is low, network or relay processing is the bottleneck." - ] -} \ No newline at end of file diff --git a/artifacts/npm-audit.json b/artifacts/npm-audit.json index 223b4829..6c5f6172 100644 --- a/artifacts/npm-audit.json +++ b/artifacts/npm-audit.json @@ -14,7 +14,7 @@ "prod": 5, "dev": 316, "optional": 29, - "peer": 8, + "peer": 0, "peerOptional": 0, "total": 320 } diff --git a/artifacts/npm-outdated.json b/artifacts/npm-outdated.json index 9c6c6246..54050205 100644 --- a/artifacts/npm-outdated.json +++ b/artifacts/npm-outdated.json @@ -20,6 +20,13 @@ "dependent": "app", "location": "/app/node_modules/jsdom" }, + "nostr-tools": { + "current": "2.19.4", + "wanted": "2.20.0", + "latest": "2.20.0", + "dependent": "app", + "location": "/app/node_modules/nostr-tools" + }, "pixelmatch": { "current": "5.3.0", "wanted": "5.3.0", @@ -27,6 +34,13 @@ "dependent": "app", "location": "/app/node_modules/pixelmatch" }, + "prettier": { + "current": "3.8.0", + "wanted": "3.8.1", + "latest": "3.8.1", + "dependent": "app", + "location": "/app/node_modules/prettier" + }, "prettier-plugin-tailwindcss": { "current": "0.6.14", "wanted": "0.6.14", diff --git a/artifacts/todos.txt b/artifacts/todos.txt new file mode 100644 index 00000000..5f3a83bf --- /dev/null +++ b/artifacts/todos.txt @@ -0,0 +1,6 @@ +tests/visual/moderation.spec.ts:89: // TODO: Investigate why visibility check fails in fixture environment (headless) +tests/visual/moderation.spec.ts:93: // TODO: Investigate why click times out in fixture environment (headless) +tests/visual/moderation.spec.ts:166: // TODO: Investigate visibility check failure +tests/visual/moderation.spec.ts:170: // TODO: Investigate click timeout failure +tests/visual/moderation.spec.ts:219: // TODO: Investigate visibility check failure +tests/visual/moderation.spec.ts:223: // TODO: Investigate click timeout failure diff --git a/components/login-modal.html b/components/login-modal.html index 23ac60af..41ee6f9f 100644 --- a/components/login-modal.html +++ b/components/login-modal.html @@ -348,7 +348,7 @@