Files
nanoclaw/docs/v1-vs-v2/logger.md
gavrielc 47950671fa docs: add v1→v2 action-items analysis + SDK signal probe tool
- docs/v1-vs-v2/: full v1→v2 regression analysis (SUMMARY + 21 per-module
  docs + ACTION-ITEMS rollup with decisions + timezone recreation spec).
- container/agent-runner/scripts/sdk-signal-probe.ts: empirical harness
  used to characterise Claude Agent SDK event/hook/stderr timing for the
  stuck-detection design in item 9.
- src/channels/chat-sdk-bridge.ts: document the conversations Map staleness
  in a code comment; fix deferred to when dynamic group registration lands
  (ACTION-ITEMS item 17).

No runtime behavior change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 01:00:04 +03:00

39 lines
2.4 KiB
Markdown

# logger: v1 vs v2
## Scope
- v1: `src/v1/logger.ts` (70 LOC) — export `logger`
- v2 counterpart: `src/log.ts` (65 LOC) — export `log`
## Capability map
| v1 behavior | v2 location | Status | Notes |
|---|---|---|---|
| Levels (debug=20, info=30, warn=40, error=50, fatal=60) | `src/log.ts:1` | kept | Identical numeric map |
| `debug/info/warn/error/fatal` methods | `src/log.ts:50-54` | renamed | `logger.X(...)``log.X(...)` |
| Data-first signature `(data, msg)` | `src/log.ts:42-58` | **changed** | v2 requires message-first `(msg, data?)` — breaking for every callsite |
| Color codes (per-level + KEY_COLOR=magenta, MSG_COLOR=cyan) | `src/log.ts:4-14` | kept | Identical |
| LOG_LEVEL env threshold | `src/log.ts:16` | kept | `'info'` default |
| Timestamp `HH:MM:SS.mmm` | `src/log.ts:33-40` | kept | Refactored, same output |
| Error formatting | `src/log.ts:18-23` | **changed** | v1 pretty multi-line JSON; v2 single-line |
| Data formatting | `src/log.ts:25-31` | **changed** | v1 per-line indented; v2 inline `key=value` |
| Process ID in output | — | **removed** | v1 emitted `(${process.pid})`; v2 drops it |
| info/debug → stdout, warn/error/fatal → stderr | `src/log.ts:45` | kept | Identical routing |
| `uncaughtException` → fatal + exit(1) | `src/log.ts:57-60` | kept | Arg order swapped |
| `unhandledRejection` → error | `src/log.ts:62-64` | kept | Arg order swapped |
## Missing from v2
1. **Process ID in log output** — lost visibility into emitting process in multi-container scenarios
2. **Data-first overload** — v1 `logger.warn({err, path}, 'msg')` is a breaking API change in v2
3. **Multi-line error formatting** — condensed single-line form is harder to read for stack traces
## Behavioral discrepancies
1. **Argument order**: `logger.error({err}, 'failed')` must become `log.error('failed', {err})` at every callsite
2. **Error output**: v1 pretty-prints JSON over 3 lines; v2 collapses to one line
3. **Data output**: v1 newline+indent per key; v2 space-separated inline
## Not in either
File rotation, redaction rules, on-disk logging — both stream to stdout/stderr only.
## Worth preserving?
Restoring PID to v2 output is cheap and helps multi-process debugging. Multi-line error format is worth a verbose-mode flag for `error`/`fatal`. Signature swap is stylistic; not worth reverting but every v1 `logger``log` migration must swap `(data, msg)``(msg, data)`.