[constants] replace magic number 30078 with KIND_APP_DATA in cmd-lock.mjs

Refactored src/cmd-lock.mjs to use KIND_APP_DATA constant instead of hardcoded 30078.
Added refactor artifacts.
Created task completion log.

Co-authored-by: PR0M3TH3AN <[email protected]>
This commit is contained in:
google-labs-jules[bot]andPR0M3TH3AN committed 2026-02-15 22:15:06 +00:00
1 parent 04bafc92bb
commit 703c351ff2
7 files changed
+228 -1

No files matched your search

@@ -0,0 +1,34 @@
src/test_logs/TEST_LOG_2026-02-15T16-15-05Z.md:# {"event":"relay_health_snapshot","reason":"query:periodic","relays":[{"relay":"wss://nos.lol","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"f-ailureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.damus.io","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"f-ailureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.nostr.band","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"f-ailureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.primal.net","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"f-ailureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.snort.social","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"f-ailureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null}]}
src/test_logs/TEST_LOG_2026-02-15T01-22-33Z.md:# {"event":"relay_health_snapshot","reason":"query:periodic","relays":[{"relay":"wss://nos.lol","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.damus.io","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.nostr.band","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.primal.net","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.snort.social","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"failureStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null}]}
src/test_logs/TEST_LOG_2026-02-15T19-12-02Z.md:# {"event":"relay_health_snapshot","reason":"query:periodic","relays":[{"relay":"wss://nos.lol","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.damus.io","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.nostr.band","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.primal.net","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.snort.social","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null}]}
src/test_logs/TEST_LOG_2026-02-15T19-12-02Z.md:# {"event":"relay_health_snapshot","reason":"query:periodic","relays":[{"relay":"wss://nos.lol","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.damus.io","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.nostr.band","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.primal.net","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.snort.social","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null}]}
src/test_logs/TEST_LOG_2026-02-15T19-12-02Z.md:# {"event":"relay_health_snapshot","reason":"query:periodic","relays":[{"relay":"wss://nos.lol","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.damus.io","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.nostr.band","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.primal.net","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.snort.social","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null}]}
src/test_logs/TEST_LOG_2026-02-15T19-12-02Z.md:# {"event":"relay_health_snapshot","reason":"query:periodic","relays":[{"relay":"wss://nos.lol","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.damus.io","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.nostr.band","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.primal.net","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.snort.social","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null}]}
src/test_logs/TEST_LOG_2026-02-15T19-12-02Z.md:# {"event":"relay_health_snapshot","reason":"query:periodic","relays":[{"relay":"wss://nos.lol","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.damus.io","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.nostr.band","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.primal.net","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null},{"relay":"wss://relay.snort.social","score":0.6,"sampleSize":0,"successRate":0.5,"timeoutRate":0,"averageLatencyMs":null,"issueStreak":0,"quarantined":false,"quarantineRemainingMs":0,"cooldownMs":30000,"lastResultAt":null}]}
src/docs/TORCH.md:The TORCH dashboard subscribes to Nostr relays for **kind 30078** events tagged with the `#torch-agent-lock` hashtag. These are the same events agents publish via `bin/torch-lock.mjs` when they claim tasks using the TORCH protocol.
src/docs/TORCH.md:**Filter:** `{"kinds":[30078],"#t":["torch-agent-lock"]}`
src/docs/TORCH.md:To follow in any Nostr client, subscribe to kind 30078 with `#t = torch-agent-lock` on the relays above.
src/docs/TORCH.md:- Kind: `30078` (NIP-33 parameterized replaceable)
src/docs/TORCH.md:- `nostrLock.queryTimeoutMs`: `10000`
src/decisions/DECISIONS_2026-02-15T20-00-00Z.md:- Replace 30078 with KIND_APP_DATA in src/cmd-lock.mjs
src/constants.mjs:export const DEFAULT_TTL = 7200;
src/constants.mjs:export const KIND_APP_DATA = 30078;
src/lib.mjs: * 3. Generate a new ephemeral keypair and build a lock event (kind 30078).
src/lib.mjs: NOSTR_LOCK_TTL Lock TTL in seconds (default: 7200)
src/lib.mjs: NOSTR_LOCK_QUERY_TIMEOUT_MS Relay query timeout in milliseconds (default: 15000)
src/todo/TODO_2026-02-15T20-00-00Z.md:- [ ] Replace 30078 with KIND_APP_DATA in src/cmd-lock.mjs
src/prompts/daily/const-refactor-agent.md:- Do **not** replace numeric literals that are coincidentally equal but semantically different (e.g., 5000 used as a timeout vs used as an array length). Use code context and names to decide.
src/prompts/daily/const-refactor-agent.md: - Common ms timeouts: `5000`, `10000`, `15000`, `30000`, `60000`
src/prompts/daily/const-refactor-agent.md: - TTLs: `600000` (10m), `60000` (1m), etc.
src/prompts/daily/const-refactor-agent.md: rg --hidden --no-ignore -n --glob 'js/**/*.js' -e '\b(5000|10000|30000|60000|15000|3|5|0\.5|0\.8|600000|100)\b' > perf/constants-refactor/raw-numeric-hits.txt
src/prompts/daily/const-refactor-agent.md: "value": 5000,
src/prompts/daily/const-refactor-agent.md: - const TIMEOUT = 5000;
src/prompts/daily/const-refactor-agent.md: - Make only the necessary replacements per candidate group so PRs are small and focused (for example, handle all 5000->FAST_RELAY_TIMEOUT_MS replacements in relay-related files in one PR; do not change unrelated files in same PR).
src/prompts/daily/const-refactor-agent.md: - 5000 ms used for fast relay timeout:
src/prompts/daily/const-refactor-agent.md: - Title: `[constants] extract FAST_RELAY_TIMEOUT_MS (5000) → js/integration/relayConstants.js`
src/prompts/daily/const-refactor-agent.md: - Example: `5000` as `RELAY_TIMEOUT_MS` vs `5000` as `SOME_API_LIMIT_MS` — do not conflate.
src/prompts/daily/const-refactor-agent.md:rg --hidden --no-ignore -n --glob 'js/**/*.js' '\b(5000|10000|30000|60000|15000|3|5|0.5|600000)\b' > perf/constants-refactor/raw-hits.txt
src/prompts/daily/const-refactor-agent.md:- Discover `5000` appears in `src/relayManager.js`, `js/integration/watchHistory.js`, `js/integration/relayClient.js`.
src/prompts/daily/const-refactor-agent.md:* Replace literal `5000` usages with `FAST_RELAY_TIMEOUT_MS`.
src/cmd-lock.mjs: kind: 30078,
src/services/memory/cache.js:const DEFAULT_MAX_TOTAL_EVENTS = 5000;
+2 -1
View File
@@ -6,6 +6,7 @@ import {
} from './torch-config.mjs';
import {
RACE_CHECK_DELAY_MS,
KIND_APP_DATA,
} from './constants.mjs';
import { getRoster } from './roster.mjs';
import { queryLocks, publishLock } from './lock-ops.mjs';
@@ -55,7 +56,7 @@ export async function cmdLock(agent, cadence, dryRun = false) {
console.error('Step 3: Building lock event...');
const event = finalizeEvent(
{
kind: 30078,
kind: KIND_APP_DATA,
created_at: now,
tags: [
['d', `${namespace}-lock/${cadence}/${agent}/${dateStr}`],
@@ -0,0 +1,3 @@
Goal: Refactor duplicated numeric constants
Scope: src/cmd-lock.mjs
Constraints: Preserve semantics
@@ -0,0 +1,3 @@
# Decisions
- Replace 30078 with KIND_APP_DATA in src/cmd-lock.mjs
- Rationale: Centralize constant definitions, improve code clarity.
@@ -0,0 +1,183 @@
> [email protected] lint
> eslint .
/app/scripts/agent/smoke-test.mjs
23:7 warning 'CONFIRM_PUBLIC' is assigned a value but never used no-unused-vars
48:14 warning 'e' is defined but never used no-unused-vars
/app/scripts/benchmark-dashboard.mjs
25:14 warning 'e' is defined but never used no-unused-vars
62:22 warning 'e' is defined but never used no-unused-vars
/app/src/lib.mjs
70:14 warning '_' is assigned a value but never used no-unused-vars
/app/test-audit/run-flaky-check.mjs
18:24 warning 'code' is defined but never used no-unused-vars
/app/test-audit/run-static-analysis.mjs
15:12 warning 'e' is defined but never used no-unused-vars
/app/test/lib.test.mjs
102:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
356:11 warning 'mockPublishLock' is assigned a value but never used no-unused-vars
/app/test/nostr-lock.test.mjs
1:10 warning 'test' is defined but never used no-unused-vars
✖ 10 problems (0 errors, 10 warnings)
> [email protected] test:unit:lock-backend
> node --test test/lock-ops.test.mjs test/lock-ops-publish-retry.test.mjs
TAP version 13
# Published to 1/1 relays (required=1, timeout=200ms)
# Published to 1/1 relays (required=1, timeout=200ms)
# (node:2424) ExperimentalWarning: The MockTimers API is an experimental feature and might change at any time
# (Use `node --trace-warnings ...` to show where the warning was created)
# Subtest: publishLock retry behavior
# Subtest: succeeds immediately on first attempt without retries
ok 1 - succeeds immediately on first attempt without retries
---
duration_ms: 10.07528
type: 'test'
...
# Subtest: retries a transient failure then succeeds within retry budget with bounded jitter
ok 2 - retries a transient failure then succeeds within retry budget with bounded jitter
---
duration_ms: 2.606726
type: 'test'
...
# Subtest: returns terminal relay_publish_quorum_failure after exhausting retry budget
ok 3 - returns terminal relay_publish_quorum_failure after exhausting retry budget
---
duration_ms: 2.711407
type: 'test'
...
# Subtest: short-circuits non-retryable failures without extra attempts
ok 4 - short-circuits non-retryable failures without extra attempts
---
duration_ms: 2.747843
type: 'test'
...
1..4
ok 1 - publishLock retry behavior
---
duration_ms: 19.734333
type: 'suite'
...
# Published to 2/2 relays (required=1, timeout=200ms)
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":1}],"totalElapsedMs":1}
# Published to 1/2 relays (required=1, timeout=200ms)
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":1}],"totalElapsedMs":1}
# Published to 1/2 relays (required=1, timeout=200ms)
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":1}],"totalElapsedMs":1}
# Published to 1/2 relays (required=1, timeout=200ms)
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":2,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/2 relays (required=1, timeout=200ms)
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/1 relays (required=1, timeout=200ms)
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":1,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/1 relays (required=1, timeout=200ms)
# {"event":"lock_publish_quorum_met","correlationId":"none","attemptId":"1","publishAttempt":1,"successCount":1,"relayAttemptedCount":3,"requiredSuccesses":1,"timeoutMs":200,"retryTimeline":[{"publishAttempt":1,"successCount":1,"relayAttemptedCount":3,"elapsedMs":0}],"totalElapsedMs":0}
# Published to 1/3 relays (required=1, timeout=200ms)
# Subtest: lock-ops
# Subtest: parseLockEvent
# Subtest: parses a valid lock event correctly
ok 1 - parses a valid lock event correctly
---
duration_ms: 1.753646
type: 'test'
...
1..1
ok 1 - parseLockEvent
---
duration_ms: 2.739357
type: 'suite'
...
# Subtest: queryLocks
# Subtest: falls back to fallback relays when primary query fails
ok 1 - falls back to fallback relays when primary query fails
---
duration_ms: 15.579432
type: 'test'
...
1..1
ok 2 - queryLocks
---
duration_ms: 15.854897
type: 'suite'
...
# Subtest: publishLock
# Subtest: retries transient failures and succeeds on a later attempt
ok 1 - retries transient failures and succeeds on a later attempt
---
duration_ms: 6.237703
type: 'test'
...
# Subtest: fails after retry budget is exhausted for persistent transient failures
ok 2 - fails after retry budget is exhausted for persistent transient failures
---
duration_ms: 2.28717
type: 'test'
...
# Subtest: fails without retry for persistent validation failures
ok 3 - fails without retry for persistent validation failures
---
duration_ms: 1.145815
type: 'test'
...
# Subtest: includes per-relay reason categories and retry metadata in failure diagnostics
ok 4 - includes per-relay reason categories and retry metadata in failure diagnostics
---
duration_ms: 1.637662
type: 'test'
...
# Subtest: returns success when mixed relay outcomes still satisfy quorum
ok 5 - returns success when mixed relay outcomes still satisfy quorum
---
duration_ms: 1.164031
type: 'test'
...
# Subtest: uses fallback relays to satisfy min success quorum
ok 6 - uses fallback relays to satisfy min success quorum
---
duration_ms: 1.480202
type: 'test'
...
# Subtest: quarantines repeatedly failing relays and still reaches quorum with one healthy relay
ok 7 - quarantines repeatedly failing relays and still reaches quorum with one healthy relay
---
duration_ms: 2.491078
type: 'test'
...
# Subtest: uses fallback and min active pool to reintroduce quarantined relay when needed
ok 8 - uses fallback and min active pool to reintroduce quarantined relay when needed
---
duration_ms: 1.083114
type: 'test'
...
1..8
ok 3 - publishLock
---
duration_ms: 18.308594
type: 'suite'
...
1..3
ok 2 - lock-ops
---
duration_ms: 37.980069
type: 'suite'
...
1..2
# tests 14
# suites 5
# pass 14
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 205.968263
+2
View File
@@ -0,0 +1,2 @@
# Todo
- [x] Replace 30078 with KIND_APP_DATA in src/cmd-lock.mjs
@@ -0,0 +1 @@
Refactored src/cmd-lock.mjs to use KIND_APP_DATA.