Files
2026-03-26 12:36:44 +01:00

149 lines
5.3 KiB
Markdown

# Phase 3: Pipeline Integration and MVP - Discussion Log
> **Audit trail only.** Do not use as input to planning, research, or execution agents.
> Decisions are captured in CONTEXT.md — this log preserves the alternatives considered.
**Date:** 2026-03-26
**Phase:** 03-pipeline-integration-and-mvp
**Areas discussed:** Auto-clustering strategy, Cluster tone assignment, Shutdown & encoding feedback, Post-run output
---
## Auto-clustering Strategy
| Option | Description | Selected |
|--------|-------------|----------|
| Hash-bucketing | Deterministic: hash (dst_port, protocol) into N fixed buckets. Same traffic always maps to same cluster/tone. Simple, no warmup, predictable. | ✓ |
| K-means clustering | Statistical: feature vectors into muesli/kmeans. Discovers natural groupings. Needs warmup, non-deterministic, adds dependency. | |
| You decide | Claude picks based on codebase fit and simplicity. | |
**User's choice:** Hash-bucketing
**Notes:** None
### Bucket count
| Option | Description | Selected |
|--------|-------------|----------|
| 4 buckets | Enough variety without overwhelming stereo field. Total 14 layers (10 known + 4 unknown). | ✓ |
| 8 buckets | More granularity. Total 18 layers — thinner per-layer gain. | |
| You decide | Claude picks balancing variety vs mixing headroom. | |
**User's choice:** 4 buckets
**Notes:** None
### Placement
| Option | Description | Selected |
|--------|-------------|----------|
| Inside classifier | Classifier returns unknown-1 through unknown-4. Clean: final class in one place. | ✓ |
| Post-classification step | Separate stage re-maps unknowns. Keeps classifier untouched but adds complexity. | |
| You decide | Claude picks based on minimal code change. | |
**User's choice:** Inside classifier
**Notes:** None
---
## Cluster Tone Assignment
### Frequency approach
| Option | Description | Selected |
|--------|-------------|----------|
| Dissonant range | All 4 buckets in 850-1100 Hz range above known protocols. Detuned intervals. Extends Phase 2 D-04. | ✓ |
| Hash-to-frequency | Hash bucket ID to frequency. Deterministic but could collide with known tones. | |
| You decide | Claude picks frequencies fitting existing harmonic scheme. | |
**User's choice:** Dissonant range (850-1100 Hz)
**Notes:** None
### Timbre
| Option | Description | Selected |
|--------|-------------|----------|
| Same dissonant character | All 4 use same detuned/beating harmonics as original unknown. Differentiated by pitch only. | ✓ |
| Varied timbres per bucket | Each gets own harmonic ratio set. More variety but harder to recognize as unknown family. | |
| You decide | Claude picks based on coherence. | |
**User's choice:** Same dissonant character
**Notes:** None
### Migration
| Option | Description | Selected |
|--------|-------------|----------|
| Replace entirely | Remove ClassUnknown, add ClassUnknown1-4. AllClasses() returns 14. Clean break. | ✓ |
| Keep as fallback | ClassUnknown remains for edge cases. Buckets are ClassUnknown1-4 for hashable unknowns. | |
| You decide | Claude picks based on realistic edge cases. | |
**User's choice:** Replace entirely
**Notes:** None
---
## Shutdown & Encoding Feedback
### Feedback level
| Option | Description | Selected |
|--------|-------------|----------|
| Status line | Print "Encoding N windows..." then "Saved path (Xs, N KB, encoded in Xs)". Minimal but confirms activity. | ✓ |
| Silent encoding | No output during encoding. File appearing on disk is enough. | |
| Progress bar | Show encoding progress. Adds dependency or custom logic for likely <1s operation. | |
| You decide | Claude picks appropriate level. | |
**User's choice:** Status line
**Notes:** None
### Output order
| Option | Description | Selected |
|--------|-------------|----------|
| Before encoding | Ctrl+C → summary → Encoding → Saved. Summary appears instantly. | ✓ |
| After encoding | Ctrl+C → Encoding → Saved → summary. File ready sooner. | |
| You decide | Claude picks best feel. | |
**User's choice:** Before encoding (summary first)
**Notes:** None
---
## Post-run Output
### Saved line verbosity
| Option | Description | Selected |
|--------|-------------|----------|
| Path + duration + size | e.g., "Saved out.mp3 (12.5s, 198 KB, encoded in 0.3s)". Everything at a glance. | ✓ |
| Path only | e.g., "Saved out.mp3". Minimal. | |
| Path + duration | e.g., "Saved out.mp3 (12.5s audio)". Middle ground. | |
| You decide | Claude picks verbosity level. | |
**User's choice:** Path + duration + size
**Notes:** None
### Cluster info in summary
| Option | Description | Selected |
|--------|-------------|----------|
| Yes, in protocol summary | Unknown buckets appear naturally as unknown-1: 42, unknown-2: 17 etc. Falls out of existing logic. | ✓ |
| No, keep summary as-is | Only show known protocol classes. Buckets are implementation details. | |
| You decide | Claude picks based on usefulness. | |
**User's choice:** Yes, in protocol summary
**Notes:** None
---
## Claude's Discretion
- Exact hash function for port/protocol → bucket mapping
- Exact Hz values for 4 unknown bucket tones (within 850-1100 Hz)
- GainPerLayer recalculation for 14 layers
- Stereo panning positions for unknown buckets
- Encoding time measurement implementation
## Deferred Ideas
None — discussion stayed within phase scope