149 lines
5.3 KiB
Markdown
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
|