| 11 |
Graph model is anemic (Primitive Obsession) — all node config in map[string]string |
Martin Fowler, OpenAI Researcher, Architecture, Grad Student |
Typed IR gets downgraded to string map; root cause of bugs #1-#3. (#19) |
| 12 |
Code duplication between CLI and library — parse chain and LLM client builder |
Martin Fowler, Architecture, Compatibility |
main.go and tracker.go duplicate the parse-validate-convert chain and buildClient. (#6) |
| 13 |
--format flag not parsed for validate/simulate |
Compatibility, Scenario Tests |
parseFlags returns early for these modes, skipping flag registration. (#1) |
| 14 |
No migration tooling — deprecation warning says "migrate to .dip" but no converter exists |
Compatibility, Documentation |
13 DOT examples with no automated path forward. (#12) |
| 15 |
E2E comparison test doesn't verify attribute equivalence |
Test Quality |
Only checks node count, shapes, handlers; misses attribute keys/values. (#11) |
| 16 |
Parallel fan-out: no concurrency limit, no configurable aggregation |
OpenAI Researcher, Grad Student |
All branches launch simultaneously. Only "any success" strategy. (#27) |
| 17 |
Parallel branch context updates lost — never merged back into parent context |
Grad Student, OpenAI Researcher |
Silent data loss. Fan-in nodes don't receive branch outputs via context. (#20) |
| 18 |
Consensus pipelines run sequentially instead of in parallel |
OpenAI Researcher |
Multi-model nodes see each other's outputs instead of reasoning independently. (#26) |
| 19 |
Condition parser is fragile — naive strings.Split on ` |
|
/&&`, no quoting |
| 20 |
No formal .dip grammar/spec |
Documentation, DSL Design |
Language defined only by Go implementation. (#12) |
| 21 |
Error messages lack file/line context |
Error Handling, Documentation |
Adapter errors don't include irNode.Source location. (#33) |
| 22 |
No CLI tests for .dip files |
Test Quality |
validate/simulate test files use only DOT. (#11) |
| 23 |
complex.dip fixture never used in any test |
Test Quality |
Rich test data wasted. (#11) |
| 24 |
No diamond (conditional) node kind in .dip |
DSL Design, Architecture |
Can't express pure conditional branch without invoking LLM. (#22) |
| 25 |
NodeIO (reads/writes) defined in IR but dropped by adapter |
DSL Design |
Useful for validation, documentation. (#25) |
| 26 |
auto_status parsing is brittle — regex for STATUS:success/fail/retry in freeform text |
OpenAI Researcher, Grad Student |
LLMs can hallucinate STATUS lines; no structured output mode. (#23) |
| 27 |
last_response single-slot relay loses intermediate node outputs |
OpenAI Researcher, Grad Student |
"Telephone game" problem; full chain of reasoning lost. (#24) |
| 28 |
Windows build failure — Setpgid/syscall.Kill POSIX-only, no build constraints |
Compatibility |
Pre-existing, not .dip-specific. (#28) |
Expert Panel Review: .dip Format Support in Tracker
Date: 2026-03-20
Reviewers: 11 expert subagents (Architecture, API Design, Documentation, Security, Error Handling, Compatibility, DSL Design, Test Quality, OpenAI Researcher, Grad Student AI Researcher, Martin Fowler)
Bugs Fixed This Session
Four silent data-loss bugs were found and fixed in
pipeline/dippin_adapter.go:modelllm_modelproviderllm_providerfallback_targetfallback_retry_targetgraph.goalviag.Attrs["goal"]Also fixed: indentation bug in
extractRetryAttrs.All tests pass after fixes.
CRITICAL (must fix)
model/providerkey mismatchllm_model/llm_provider(#13)fallback_targetkey mismatchfallback_retry_target(#13)workflow.Goalnot mappedworkflow.Goaltog.Attrs["goal"](#14)DippinValidatedflag bypasses 5 structural validation checksg.DippinValidated = trueand skip cycle detection, reachability, start/exit verification. Dippin validates the IR but tracker skips validating the converted Graph. (#4)tool_commandsh -c <command>with no sanitization, sandboxing, or allowlist. Full process privileges. (#16)os.Stderrtracker.goprints deprecation warnings and diagnostics directly to stderr. Library consumers cannot capture/suppress. (#7)clearDownstreamdoesn't reset retry counts on this path. (#15)retryblock not supported by parsercomplex.dipuses block syntax the parser can't handle. (#3)[label: ...]silently misparsedIMPORTANT (should fix soon)
map[string]stringmain.goandtracker.goduplicate the parse-validate-convert chain andbuildClient. (#6)--formatflag not parsed for validate/simulateparseFlagsreturns early for these modes, skipping flag registration. (#1)strings.Spliton `/&&`, no quotingirNode.Sourcelocation. (#33)complex.dipfixture never used in any testNodeIO(reads/writes) defined in IR but dropped by adapterauto_statusparsing is brittle — regex forSTATUS:success/fail/retryin freeform textlast_responsesingle-slot relay loses intermediate node outputsSetpgid/syscall.KillPOSIX-only, no build constraintsMINOR (backlog)
knownModelProviderslinter catalog is stalefmt.Errorfwithout%wDEFERRED (noted, not blocking)
Cross-Reference: Issues Flagged by 3+ Experts
DippinValidatedbypassStrengths Noted by Reviewers
Interviewerinterface with multiple implementations (OpenAI Researcher)Competitive Positioning
Recommended Priority Order
Fix attribute key mismatchesDONE (fix(pipeline): attribute key mismatch — model/provider/fallback_target silently ignored for .dip files #13, fix(pipeline): workflow.Goal silently dropped by dippin adapter #14)DippinValidatedflag — always run tracker's own validation (fix(pipeline): DippinValidated bypasses tracker validation without safety contract #4)pipelinepackage (refactor: extract shared dip parse/validate logic and LLM client builder #6)--formatflag for validate/simulate (fix(cli): validate/simulate subcommands ignore --format flag #1)map[string]stringto typed node configs (refactor(pipeline): Graph model uses map[string]string for all config (Primitive Obsession) #19)