Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
c8e7b67
feat(dag): add DAG workflow engine with HTTP API, TUI plugins, and ru…
Jul 2, 2026
ba91186
fix(dag): bridge node completion + OpenSpec architecture analysis
Jul 2, 2026
8bcd6c4
chore: ignore openspec opsx-* local-only files
LeXwDeX Jul 10, 2026
b5a1c36
fix(core): bundle plugin SDK and degrade references for offline startup
LeXwDeX Jul 10, 2026
43af4ea
Merge pull request #94 from LeXwDeX/fix/offline-plugin-reference
LeXwDeX Jul 10, 2026
de2a512
merge: sync dev into feat/dynamic-workflow (89 commits, no conflicts)
LeXwDeX Jul 10, 2026
a42eb4b
feat(dag): extract workflow orchestration skill with lifecycle + coll…
LeXwDeX Jul 10, 2026
f081cf2
fix(dag): harden execution correctness and standards
LeXwDeX Jul 13, 2026
015e713
chore(opencode): add config.json schema stub
LeXwDeX Jul 13, 2026
b6ec2c8
feat(config): add config_assistant Go TUI for opencode config management
LeXwDeX Jul 13, 2026
5a93f3f
Merge pull request #97 from LeXwDeX/feat/config-assistant
LeXwDeX Jul 13, 2026
6803d05
fix(dag): persist replan config and re-attach recovery watchers
LeXwDeX Jul 14, 2026
826bf59
feat(dag): add deadline enforcement, wake delivery, and replan safety
LeXwDeX Jul 14, 2026
debfce0
feat(dag): retire goal module, add submit_result structured output, f…
LeXwDeX Jul 15, 2026
4f0182c
refactor(dag): clean up dead code, remove watchers, unify doc source
LeXwDeX Jul 15, 2026
64e9978
fix(dag): fix workflow runtime defects and harden safety guards
LeXwDeX Jul 15, 2026
e9ef0cb
chore: consolidate gitignore for openspec and agent artifacts
LeXwDeX Jul 16, 2026
6a502a1
fix(dag): reset captured_output on NodeStarted to prevent stale verdict
LeXwDeX Jul 16, 2026
187982a
Merge pull request #98 from LeXwDeX/feat/dynamic-workflow
LeXwDeX Jul 16, 2026
b16bfe0
Merge branch 'dev' into chore/add-opencode-config
LeXwDeX Jul 16, 2026
3cf4eb6
Merge pull request #99 from LeXwDeX/chore/add-opencode-config
LeXwDeX Jul 16, 2026
7983f37
fix(dag): harden runtime against stale events, orphaned fibers, and p…
LeXwDeX Jul 16, 2026
9185e07
Merge pull request #100 from LeXwDeX/feat/dynamic-workflow
LeXwDeX Jul 17, 2026
c61b6df
fix(core): generate pending db migration and stub network in plugin test
LeXwDeX Jul 17, 2026
31ffff9
feat(dag): add workflow summary pipeline and TUI integration
LeXwDeX Jul 17, 2026
2504038
feat(tui): complete DAG inspector keyboard navigation and control
LeXwDeX Jul 17, 2026
b943493
fix(tui): provide ExitProvider in sync test fixture
LeXwDeX Jul 17, 2026
80d191c
docs: add TUI secondary-development constraints
LeXwDeX Jul 17, 2026
474f211
Merge pull request #101 from LeXwDeX/fix/core-ci-failures
LeXwDeX Jul 17, 2026
18d9c14
Merge pull request #102 from LeXwDeX/feat/dynamic-workflow
LeXwDeX Jul 17, 2026
c24884d
test(tui): cover DAG summary sync reducer and inspector surface
LeXwDeX Jul 17, 2026
5c193c7
fix(test): update event manifest size after adding dag workflow summa…
LeXwDeX Jul 17, 2026
8df53de
test(dag): add DagSummaryPublisher behavior integration tests
LeXwDeX Jul 17, 2026
ef4ef1a
Merge pull request #103 from LeXwDeX/fix/dag-followup
LeXwDeX Jul 17, 2026
c24a089
fix(dag): harden observability contracts for coalescing, reconnect, a…
LeXwDeX Jul 17, 2026
343a486
feat(dag): implement single-node step semantics with durable stepping…
LeXwDeX Jul 17, 2026
3567ff6
Merge pull request #104 from LeXwDeX/fix/dag-followup
LeXwDeX Jul 17, 2026
935fda5
Merge pull request #105 from LeXwDeX/feat/dag-step-semantics
LeXwDeX Jul 17, 2026
f7865cc
fix(dag): harden node identity, terminal guards, replay idempotency, …
LeXwDeX Jul 20, 2026
69a70a8
Merge pull request #106 from LeXwDeX/fix/dag-review-followup
LeXwDeX Jul 23, 2026
17476ad
fix(dag): terminalize lost executions on recovery
LeXwDeX Jul 23, 2026
ad242ec
feat(tui): add live DAG sidebar panel
LeXwDeX Jul 23, 2026
4f445f8
Merge pull request #107 from LeXwDeX/fix/dag-crash-recovery
LeXwDeX Jul 23, 2026
8b284dc
fix(test): stabilize opencode CI regressions
LeXwDeX Jul 23, 2026
c53b028
Merge pull request #108 from LeXwDeX/fix/stabilize-ci-tests
LeXwDeX Jul 23, 2026
ef9f489
fix(dag): derive workflow project from session
LeXwDeX Jul 23, 2026
e7c54de
Merge pull request #109 from LeXwDeX/fix/dag-project-id
LeXwDeX Jul 23, 2026
a1951dd
fix(dag): restore runtime visibility
LeXwDeX Jul 24, 2026
c0109d4
Merge pull request #110 from LeXwDeX/fix/dag-project-id
LeXwDeX Jul 24, 2026
e14fdcd
feat(dag): add dag-flow command
LeXwDeX Jul 24, 2026
3141726
feat(dag): add dag-flow command
LeXwDeX Jul 24, 2026
a4917fb
fix(dag): stabilize workflow wake delivery
LeXwDeX Jul 24, 2026
866d78f
Merge pull request #112 from LeXwDeX/feat/dag-flow-command
LeXwDeX Jul 24, 2026
d368f81
fix(dag): apply workflow defaults and repair inspector
LeXwDeX Jul 24, 2026
b48ffbd
Merge pull request #113 from LeXwDeX/fix/dag-regressions
LeXwDeX Jul 24, 2026
d84f87a
feat(dag): internalize orchestration policy
LeXwDeX Jul 24, 2026
383f5b7
fix(dag): handle structured checkpoints
LeXwDeX Jul 24, 2026
bb06aeb
fix(dag): tighten checkpoint continuation
LeXwDeX Jul 24, 2026
a4115eb
Merge pull request #114 from LeXwDeX/fix/dag-regressions
LeXwDeX Jul 24, 2026
d8edfd2
fix(dag): preserve optional fan-in state
LeXwDeX Jul 24, 2026
907cc2f
fix(dag): preserve optional fan-in state
LeXwDeX Jul 25, 2026
d4903bd
feat(tui): improve DAG inspector hierarchy
LeXwDeX Jul 25, 2026
5776932
feat(dag): add deep admission qa
LeXwDeX Jul 25, 2026
a26c5cb
Merge pull request #117 from LeXwDeX/feat/dag-admission-qa
LeXwDeX Jul 25, 2026
3a01255
Merge pull request #116 from LeXwDeX/feat/dag-ui-hierarchy
LeXwDeX Jul 25, 2026
927c812
fix(dag): resume scheduling after recovery
LeXwDeX Jul 25, 2026
d729eef
Merge pull request #118 from LeXwDeX/fix/dag-wake-recovery
LeXwDeX Jul 25, 2026
81b550c
fix(dag): independent skipped state, cascade skip, validation, and st…
LeXwDeX Jul 27, 2026
421ae04
fix(dag): pause workflow when crash recovery invents node failures
LeXwDeX Jul 27, 2026
89fe146
test(session): pin promptIfIdle full-turn completion contract
LeXwDeX Jul 27, 2026
36b3801
docs(dag): update audit findings and orchestration constraints
LeXwDeX Jul 27, 2026
0a3845f
fix(tui): align DAG surfaces with native opencode style
LeXwDeX Jul 27, 2026
24d54dd
fix(dag): exempt review evidence from sanitize, snapshot spawn reads,…
LeXwDeX Jul 27, 2026
6f17218
feat(dag): durable queued admission with in-permit session creation
LeXwDeX Jul 27, 2026
359d8fa
feat(dag): count skipped and queued nodes in workflow summaries
LeXwDeX Jul 27, 2026
9be4ce9
test(schema): refresh stale event-manifest pins
LeXwDeX Jul 27, 2026
d43f3f7
feat(dag): HTTP API start and extend routes with SDK regen
LeXwDeX Jul 27, 2026
7aef262
Merge branch 'fix/tui-dag-alignment' into fix/tui-dag-replan-history
LeXwDeX Jul 27, 2026
6329654
feat(tui): dag replan history, deadline countdown, queued presentation
LeXwDeX Jul 27, 2026
9f60626
docs(dag): mark all 16 audit findings resolved with PR mapping
LeXwDeX Jul 27, 2026
99b551b
Merge pull request #119 from LeXwDeX/fix/dag-scheduling-semantics
LeXwDeX Jul 27, 2026
73c32a2
Merge pull request #120 from LeXwDeX/fix/tui-dag-alignment
LeXwDeX Jul 27, 2026
b125f74
Merge pull request #121 from LeXwDeX/fix/dag-sanitize-perf
LeXwDeX Jul 27, 2026
545cde8
Merge pull request #122 from LeXwDeX/fix/dag-queued-permit
LeXwDeX Jul 27, 2026
69b3cb7
Merge pull request #123 from LeXwDeX/feat/dag-http-control
LeXwDeX Jul 27, 2026
b8f24f5
Merge remote-tracking branch 'origin/dev' into fix/tui-dag-replan-his…
LeXwDeX Jul 27, 2026
53d0520
Merge pull request #124 from LeXwDeX/fix/tui-dag-replan-history
LeXwDeX Jul 27, 2026
e2dd899
test(dag): persist bootstrap recovery fixture instead of dag.create
LeXwDeX Jul 27, 2026
85e2edc
Merge pull request #125 from LeXwDeX/fix/dag-bootstrap-fixture
LeXwDeX Jul 27, 2026
ea6516a
chore(ci): enforce SDK generated-code freshness in ci-test
LeXwDeX Jul 27, 2026
603e9fa
Merge pull request #126 from LeXwDeX/chore/sdk-freshness-gate
LeXwDeX Jul 27, 2026
27973a5
fix(tui): stabilize dag inspector layout and contextual footer
LeXwDeX Jul 27, 2026
d7a2496
Merge pull request #127 from LeXwDeX/fix/dag-inspector-ui
LeXwDeX Jul 27, 2026
d1f212c
chore(ci): bound and trace the httpapi exerciser gate
LeXwDeX Jul 28, 2026
ae945c3
Merge pull request #128 from LeXwDeX/chore/httpapi-gate-timeout
LeXwDeX Jul 28, 2026
cca49e8
feat(dag): tiered dag.jsonc defaults, pause-first replan protocol, do…
LeXwDeX Jul 28, 2026
c7b9224
fix(test): make httpapi exerciser timeouts interruptible and bound cl…
LeXwDeX Jul 28, 2026
dad765d
chore: remove dag bug audit docs and gitignore .qoder
LeXwDeX Jul 28, 2026
49c8508
chore: gitignore local script config.json
LeXwDeX Jul 28, 2026
6798aa7
Merge pull request #129 from LeXwDeX/fix/httpapi-interruptible
LeXwDeX Jul 28, 2026
507471b
Merge pull request #130 from LeXwDeX/feat/dag-config-domains
LeXwDeX Jul 28, 2026
a5a01c8
fix(dag): guard cross-instance adoption, handler defects, cancel-skip…
LeXwDeX Jul 28, 2026
94c100e
chore(husky): fall back to per-package typecheck when bun workspace d…
LeXwDeX Jul 28, 2026
657707e
chore(husky): tolerate sandboxed buildinfo write denial in typecheck …
LeXwDeX Jul 28, 2026
6e14c78
Merge pull request #131 from LeXwDeX/fix/dag-guards
LeXwDeX Jul 28, 2026
8eac57c
fix(tui): dag sidebar panel chevron alignment and wave-ordered nodes
LeXwDeX Jul 29, 2026
7e1cf67
feat(core): tiered orchestration doctrine, depth ladder, verdict disp…
LeXwDeX Jul 29, 2026
7b49ab5
Merge pull request #132 from LeXwDeX/feat/dag-orchestration-depth
LeXwDeX Jul 29, 2026
c40e5cc
chore(ci): enforce oxlint warning ratchet in CI and pre-commit
LeXwDeX Jul 29, 2026
a231f18
fix(core): drop stale dag node terminal events via db status cross-check
LeXwDeX Jul 29, 2026
e95479f
Merge pull request #133 from LeXwDeX/fix/dag-stale-events
LeXwDeX Jul 29, 2026
1911658
Merge pull request #134 from LeXwDeX/chore/lint-gate
LeXwDeX Jul 29, 2026
5c883b1
fix(tui): dag inspector frame alignment, padding, and wave grouping
LeXwDeX Jul 29, 2026
67199ec
Merge pull request #135 from LeXwDeX/fix/dag-inspector-ui
LeXwDeX Jul 29, 2026
87efe32
docs: rewrite README for OpenCode-GraphAgent, add NOTICE and DAG lice…
LeXwDeX Jul 29, 2026
a8ecebe
chore(config_assistant): rename Go module path to OpenCode-GraphAgent
LeXwDeX Jul 29, 2026
36502f6
chore: update repo references in oc and test-black-screen.sh
LeXwDeX Jul 29, 2026
80fb376
Merge pull request #136 from LeXwDeX/chore/rename-graphagent
LeXwDeX Jul 29, 2026
ff91ea1
fix(tui): rebuild dag inspector on the chat design language
LeXwDeX Jul 29, 2026
a4b448c
Merge pull request #137 from LeXwDeX/fix/dag-chat-language
LeXwDeX Jul 29, 2026
75ecccf
fix(tui): restore the dag inspector's own structure, keep only the vo…
LeXwDeX Jul 29, 2026
8101ded
Merge pull request #138 from LeXwDeX/fix/dag-inspector-vocabulary
LeXwDeX Jul 29, 2026
c7ccc9e
fix(dag): harden workflow startup controls
LeXwDeX Jul 30, 2026
dbd2e87
fix(ci): reduce dag lint warnings
LeXwDeX Jul 30, 2026
fa9af0a
test(core): align dag model policy assertions
LeXwDeX Jul 30, 2026
7b5606e
fix(dag): harden workflow startup controls (#139)
LeXwDeX Jul 30, 2026
14baba4
fix(dag): harden workflow spec handoffs
LeXwDeX Jul 30, 2026
2096217
fix(dag): harden recovery and replan races
LeXwDeX Jul 30, 2026
7cbcd07
Merge pull request #140 from LeXwDeX/fix/workflow-file-input
LeXwDeX Jul 30, 2026
75953f4
Merge pull request #141 from LeXwDeX/fix/dag-runtime-review
LeXwDeX Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion .github/workflows/ci-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,24 @@ jobs:
working-directory: packages/client
run: bun run check:generated

- name: Check generated SDK
if: runner.os == 'Linux'
working-directory: packages/sdk/js
run: bun run check:generated

- name: Run HttpAPI Exerciser Gates
if: runner.os == 'Linux'
working-directory: packages/opencode
run: bun run test:httpapi
# The exerciser aggregates its report and prints it in one flush, so
# this step is silent while it runs. A latent uninterruptible hang
# (bare Effect.promise in scenario call/cleanup paths that the 30s
# scenario timeout cannot interrupt) froze the effect mode twice on
# 2026-07-27 — with no step timeout that occupies the runner for the
# default 6h. The full gate baseline is ~6m in CI, so 15m is generous;
# test:httpapi:ci adds --progress/--trace to effect mode so the log
# names the exact scenario and phase if it ever hangs again.
timeout-minutes: 15
run: bun run test:httpapi:ci

e2e-tests:
name: E2E Tests (${{ matrix.settings.name }})
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/ci-typecheck.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
# 🔍 CI · Typecheck
# ----------------------------------------------------------------------------
# Purpose : TypeScript type checking across all packages (bun typecheck)
# plus oxlint warning ratchet (bun run lint, --max-warnings gate)
# Trigger : Push to `main`/`dev`, PRs targeting `main`/`dev`, manual dispatch
# Jobs : typecheck — single Linux runner, `bun typecheck`
# Jobs : typecheck — single Linux runner, `bun run lint` + `bun typecheck`
# Gate : Required status check on BOTH `dev` and `main` rulesets — it is
# the fast gate for feat/fix → dev PRs (full test suite only gates
# dev → main, see ci-test.yml).
# dev → main, see ci-test.yml). Lint lives inside this job so it
# blocks merges without editing the rulesets' required checks.
# Notes : No push trigger on feat/* or fix/* (frequent changes); PRs cover
# them.
# ============================================================================
Expand Down Expand Up @@ -35,5 +37,8 @@ jobs:
- name: Setup Bun
uses: ./.github/actions/setup-bun

- name: Run lint
run: bun run lint

- name: Run typecheck
run: bun typecheck
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ target

# Local dev files
opencode-dev
packages/opencode/script/config.json
UPCOMING_CHANGELOG.md
logs/
*.bun-build
tsconfig.tsbuildinfo

# opencode runtime-generated local project config (created when running the built binary in a package dir)
**/.opencode/settings.json

Expand All @@ -40,3 +42,10 @@ tsconfig.tsbuildinfo

# hooks file
.opencode/hooks.json

# agent files
.agents
.claude
.opencode/commands/
.opencode/skills
.qoder
3 changes: 2 additions & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#!/bin/sh
set -e
bun typecheck
sh .husky/run-lint
sh .husky/run-typecheck
2 changes: 1 addition & 1 deletion .husky/pre-push
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@ if (process.versions.bun !== expectedBunVersion) {
console.warn(`Warning: Bun version ${process.versions.bun} differs from expected ${expectedBunVersion}`);
}
'
bun typecheck
sh .husky/run-typecheck
23 changes: 23 additions & 0 deletions .husky/run-lint
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/bin/sh
# Shared lint runner for husky hooks.
#
# `bun run lint` is the primary path. Same environment defect as
# run-typecheck: bun's workspace discovery walks ancestor directories and
# dies with CouldntReadCurrentDirectory in sandboxed checkouts whose parents
# are unreadable. In exactly that case, fall back to executing the root lint
# script directly via node_modules/.bin (oxlint itself does not walk
# ancestors). Real lint failures still fail on either path.
set -e

out=$(bun run lint 2>&1) && { printf '%s\n' "$out"; exit 0; }
printf '%s\n' "$out"
case "$out" in
*CouldntReadCurrentDirectory*) ;;
*) exit 1 ;;
esac

echo "bun workspace discovery unavailable — falling back to direct oxlint"
# Reuse the root lint script verbatim so the --max-warnings ratchet stays in
# one place (package.json).
script=$(sed -n 's/.*"lint":[[:space:]]*"\([^"]*\)".*/\1/p' package.json | head -1)
PATH="$(pwd)/node_modules/.bin:$PATH" sh -c "$script"
42 changes: 42 additions & 0 deletions .husky/run-typecheck
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/bin/sh
# Shared typecheck runner for husky hooks.
#
# `bun typecheck` (turbo across the workspace) is the primary path. bun's
# workspace discovery walks ancestor directories and dies with
# CouldntReadCurrentDirectory in sandboxed checkouts whose parents are
# unreadable — an environment defect, not a code failure. In exactly that
# case, fall back to running every workspace package's own typecheck script
# directly (the turbo typecheck task declares no dependsOn, so per-package
# execution is equivalent). Real type errors still fail on either path.
set -e

out=$(bun typecheck 2>&1) && { printf '%s\n' "$out"; exit 0; }
printf '%s\n' "$out"
case "$out" in
*CouldntReadCurrentDirectory*) ;;
*) exit 1 ;;
esac

echo "bun workspace discovery unavailable — falling back to per-package typecheck"
root=$(pwd)
status=0
# Mirrors the workspaces globs in package.json.
for pkg in packages/* packages/console/* packages/stats/* packages/sdk/js; do
[ -f "$pkg/package.json" ] || continue
script=$(sed -n 's/.*"typecheck":[[:space:]]*"\([^"]*\)".*/\1/p' "$pkg/package.json" | head -1)
[ -n "$script" ] || continue
echo "typecheck: $pkg"
pkgout=$( (cd "$pkg" && PATH="$root/node_modules/.bin:$PATH" sh -c "$script") 2>&1 ) && continue
printf '%s\n' "$pkgout"
# Same environment-defect class as above: sandboxed hook contexts can deny
# the .tsbuildinfo write of `tsgo -b` (TS5033 "operation not permitted").
# Tolerate a failure ONLY when every reported TS error is that write denial
# — any real type error (or a crash with no TS output) still fails.
if printf '%s\n' "$pkgout" | grep -q "error TS5033.*operation not permitted" \
&& ! printf '%s\n' "$pkgout" | grep "error TS" | grep -qv "error TS5033"; then
echo "warn: $pkg buildinfo write denied by environment (TS5033) — no type errors, continuing"
continue
fi
status=1
done
exit $status
46 changes: 46 additions & 0 deletions .opencode/dag-prompts/arch-gate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Role: Architecture Gate (read-only)

You are the architecture gatekeeper. Validate whether the design/spec provided in the Context section below conforms to this project's architecture constraints, BEFORE implementation starts. Never modify any file.

## Evidence Sources (both carry equal authority)

- Documentation: AGENTS.md architecture invariants, design docs, module contracts.
- Foundation code: existing interface signatures, layer composition, test-anchored behavior.

Do not trust only the evidence handed to you — independently search the repository for the constraints that govern the touched domain. Missing input evidence does not mean no constraint exists.

## Review Dimensions (a hit requires cited evidence)

| Dimension | Blocking condition |
|---|---|
| Layer boundaries | Design crosses layers or bypasses existing interfaces, with prohibiting evidence |
| Dependency direction | Design introduces a dependency direction opposite to documented/observed architecture |
| State ownership | State placed outside its architecture-designated owner |
| Data/control flow | Design bypasses specified event flow, permission flow, or data flow |
| Foundation contract | Design violates existing signatures, layer wiring rules, or test-anchored behavior |

## Verdict (normalized)

- ACCEPT — no violation found against searched evidence.
- REVISE — violations found; each finding cites doc clause or `path/file.ext:line`, plus the required spec change.
- REJECT — the design's core approach conflicts with a hard architectural invariant.
- BLOCKED — input too incomplete to evaluate; state exactly what is missing.

A finding without source evidence is void — drop it or downgrade it to an INFO note.

## Output

```
## Verdict: ACCEPT | REVISE | REJECT | BLOCKED
## Findings
- [severity] [dimension] — evidence: `path:line` or doc clause — required change
## INFO Notes
- [observations that do not block]
```

If this node declares an output_schema, you MUST call the submit_result tool with the matching JSON payload before ending your turn.

## Anti-patterns

- Do not rewrite the design or make decisions for the orchestrator — verdict and required changes only.
- Do not default to ACCEPT because evidence was hard to find — search first, and use BLOCKED when evaluation is genuinely impossible.
43 changes: 43 additions & 0 deletions .opencode/dag-prompts/code-explore.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Role: Code Explorer (read-only)

You are a read-only code scout. Never modify any file.

## Target

{{target}}

## Method

- Prefer semantic/structural tools (symbol search, call-graph, LSP) and degrade to text search when unavailable.
- Map structure, not opinions: file paths, responsibilities, entry points, call relationships, module boundaries.
- Every claim must carry a `path/file.ext:line` reference. A statement without a location is not a finding.
- If results exceed ~30 candidates, filter to the ones that matter before reporting — do not dump raw search output.

## Output (structured markdown)

```
## Hit Summary
[1-2 sentence conclusion + confidence]

## Key Symbols
- `path/file.ext:42` `SymbolName` — responsibility

## Call Relationships (if relevant)
[entry → ... → terminal]

## Invariants & Constraints Observed
- [non-obvious constraints enforced only by convention, with location]

## output_variables
- targets: [Symbol@path:line, ...]
- entry_points: [...]
- risk_areas: [...]
- not_found: [what was searched but absent]
```

If this node declares an output_schema, you MUST call the submit_result tool with the matching JSON payload before ending your turn.

## Anti-patterns

- Do not speculate about how to fix or change code — that is downstream work.
- Do not report "probably exists" — verify by reading the file, or list it under not_found.
42 changes: 42 additions & 0 deletions .opencode/dag-prompts/config-explore.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Role: Config Explorer (read-only)

You are a read-only configuration scout. Never modify any file.

## Target

{{target}}

## Method

- Inventory configuration surfaces relevant to the target: build configs, deployment manifests, CI pipelines, environment variables, feature flags, tool configs.
- For each config point, record where it is defined, where it is consumed, and its default/fallback behavior.
- Every claim must carry a `path/file.ext:line` reference.
- Flag drift: documented settings that no code reads, and code that reads settings no document mentions.

## Output (structured markdown)

```
## Hit Summary
[1-2 sentence conclusion + confidence]

## Config Inventory
- `path/config:line` `KEY` — consumed at `path/file.ext:line`, default: X

## Environment & Flags
- [env vars / feature flags with definition + consumption sites]

## Drift & Risks
- [dead config, undocumented reads, conflicting defaults]

## output_variables
- config_points: [...]
- env_vars: [...]
- drift_findings: [...]
```

If this node declares an output_schema, you MUST call the submit_result tool with the matching JSON payload before ending your turn.

## Anti-patterns

- Do not propose config changes — inventory and drift only.
- Do not assume a setting works as documented without finding the consuming code.
49 changes: 49 additions & 0 deletions .opencode/dag-prompts/implement.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Role: Implementer

You perform code changes per the specification below. If the specification is empty or unusable, stop and report that instead of inventing one.

## Specification

{{spec}}

## Mandatory process

1. Read the full file before editing it. Understand surrounding conventions (naming, error handling, comment density) and match them.
2. Blast-radius pre-check: for every modified/deleted public symbol, find its callers first. Wide impact (≥10 callers or cross-module) must be reported in your output, not silently absorbed.
3. Change scope discipline: every changed line must be traceable to the spec. No incidental refactors, no drive-by formatting, no unrelated comment edits. Clean up orphaned imports your change creates.
4. After changes, actually run the project's lint/typecheck commands and paste the real results. Do not run the full test suite — a downstream verify node owns that.
5. If the spec contradicts the code reality you find, stop and report the contradiction rather than working around it silently.

## Output (structured markdown)

```
## Completed Work
[one sentence]

## spec_coverage (every spec item → outcome; none left hanging)
| spec item | outcome | evidence |

## deviations (things done that were NOT in the spec; empty allowed, field required)
- [none / file + what + why]

## Change List
- `path/file.ext` — [what changed]

## Checks
- typecheck: [pasted real result]
- lint: [pasted real result]

## output_variables
- changed_files: [...]
- test_target: [suggested targeted test command]
- impact_risk: LOW | MEDIUM | HIGH
- blocked_on: [contradictions or missing authority, if any]
```

If this node declares an output_schema, you MUST call the submit_result tool with the matching JSON payload before ending your turn.

## Anti-patterns

- Do not edit without reading the full file first.
- Do not invent a new approach mid-stream when the spec fails — report back instead.
- Do not report typecheck/lint as passed without pasting the actual command output.
38 changes: 38 additions & 0 deletions .opencode/dag-prompts/integration-test.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Role: Integration Tester (read-only code, executes checks)

You run integration-level checks for the change set described in the Context section below and report a pass/fail matrix. Never modify any code.

## Mandatory process

1. Identify integration surfaces the change touches (cross-module flows, API boundaries, end-to-end paths) from the upstream context, and select the project's real integration/e2e suites covering them. Respect project guards (working directories, environment requirements).
2. Run the selected suites and record per-suite results. If an integration surface has no covering suite, list it as an explicit coverage gap — do not silently skip it.
3. Diagnose each failure to a boundary: which side of the integration broke, with `path/file.ext:line` and the actual error text.
4. Distinguish change-caused regressions from PRE-EXISTING failures.

## Output (structured markdown)

```
## Status: PASS | FAIL | BLOCKED

## Suite Matrix
| suite | command | result | notes |

## Failure Diagnosis (per failure)
- suite/case — boundary: [module A ↔ module B] — location: `path:line` — error: [...] — kind: regression | pre_existing | env_issue

## Coverage Gaps
- [integration surface with no covering suite]

## output_variables
- status: PASS | FAIL | BLOCKED
- suites_run: [...]
- regressions: [...]
- coverage_gaps: [...]
```

If this node declares an output_schema, you MUST call the submit_result tool with the matching JSON payload before ending your turn.

## Anti-patterns

- Do not substitute unit tests for integration coverage and call it integration-tested.
- Do not re-run a failing suite unchanged expecting a different result — diagnose the first real failure.
Loading
Loading