triad-plus 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.1.0 — 2026-08-24
4
+
5
+ - Automatically dispatch configured Evaluator+ after Triad approval, without
6
+ allowing it to reopen or repair the closed run.
7
+ - Add a five-minute OpenCode tutorial and refresh README onboarding.
8
+ - Remove operational service artifacts from the public tree.
9
+ - Change future releases to Apache-2.0.
10
+
3
11
  ## 1.0.0 — 2026-08-24
4
12
 
5
13
  - Public Triad+ engineering loop with Orchestrator, Developer, and Reviewer.
package/CONTRIBUTING.md CHANGED
@@ -42,3 +42,9 @@ binding. Do not add `if <runtime>` behavior to Core installer or verifier code.
42
42
  Explain the user-facing outcome, provide test output, and call out runtime
43
43
  limitations. Maintainers may ask for a clean package smoke when install assets
44
44
  change.
45
+
46
+ ## Operational artifacts
47
+
48
+ Keep working reports, smoke transcripts, handoffs, and release checklists in
49
+ `.triad-internal/` (which Git ignores) or outside the repository. The tracked
50
+ tree is reserved for product code and user/contributor documentation.
package/LICENSE CHANGED
@@ -1,21 +1,201 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Giovanni Delbono
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright 2026 Giovanni Del Bono
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
package/README.md CHANGED
@@ -1,36 +1,113 @@
1
1
  # Triad+
2
2
 
3
- Triad+ is a lightweight engineering loop for coding agents with three explicit roles.
3
+ <p align="center">
4
+ <img src="assets/triad-plus-engineering-loop-icon.svg" alt="Triad+ logo" width="220">
5
+ </p>
6
+
7
+ ## Stop letting the same AI write the code and approve its own work.
8
+
9
+ Triad+ gives coding agents a lightweight engineering loop with separate
10
+ implementation, review, and orchestration.
4
11
 
5
12
  > **Developer proposes. Reviewer challenges. Orchestrator governs.**
6
13
 
7
- It is not a workflow engine or autonomous development platform. The coding-agent host stays in control; Triad+ provides role contracts, independent review, and verification evidence.
14
+ ## Why Triad+?
8
15
 
9
- ```text
10
- Orchestrator
11
- / \
12
- Developer ←→ Reviewer
16
+ | | What changes |
17
+ | --- | --- |
18
+ | **Independent review** | A Reviewer examines the candidate and verifier evidence instead of asking the Developer to grade its own work. |
19
+ | **Different models per role** | Choose a runtime, model, persona, and supported effort for each role. |
20
+ | **Evidence-backed verification** | A claim that tests passed is not proof: `triad-verify` records environment-derived gate evidence. |
21
+ | **Works across coding agents** | Use Codex, Claude Code, OpenCode, Antigravity, or Hermes Agent through peer adapters. |
22
+
23
+ Triad+ is for the moment after a coding agent says “done”: it gives that claim a
24
+ separate reviewer, deterministic checks, and an orchestrator that decides what
25
+ happens next.
13
26
 
14
- Triad approved optional fresh Evaluator+
27
+ ## How it works
28
+
29
+ ```text
30
+ Orchestrator
31
+ / \
32
+ Developer ←→ Reviewer
33
+
34
+ triad-verify evidence
35
+
36
+ Reviewer approved
37
+
38
+ Evaluator+ (only when configured; fresh and post-run)
15
39
  ```
16
40
 
17
- ## Why Triad?
41
+ The normal path is `Developer → verification → Reviewer → approved | rework |
42
+ blocked`. The Orchestrator governs the loop. When configured, Evaluator+ runs
43
+ automatically after approval with a fresh packet; a `FAIL` is information for a
44
+ future user-initiated run, never an automatic repair.
18
45
 
19
- A single agent can implement, self-check, and declare success in one conversation. Triad separates those responsibilities: the Developer changes the candidate, the Reviewer looks for defects, and the Orchestrator decides rework, approval, or escalation. `triad-verify` supplies environment-derived gate evidence, distinct from an agent claim.
46
+ ## Try Triad+ in 5 minutes with OpenCode
20
47
 
21
- ## Supported coding agents
48
+ OpenCode is the canonical tutorial because it is open source and makes the
49
+ separate Triad roles easy to inspect.
22
50
 
23
- | Runtime | Orchestrator | Developer | Reviewer | Evaluator+ | Verification dispatch |
24
- | --- | --- | --- | --- | --- | --- |
25
- | Codex | Yes | Yes | Yes | Yes | Explicit fallback; async hook when validated |
26
- | Claude Code | Yes | Yes | Yes | Yes | Explicit fallback; hook when validated |
27
- | OpenCode | Yes | Yes | Yes | Yes | Explicit dispatch |
28
- | Antigravity | Yes | Yes | Yes | Yes | Explicit dispatch |
29
- | Hermes Agent | Yes | Yes | Yes | Yes | Explicit dispatch |
51
+ 1. Install OpenCode and configure a provider/model, following the
52
+ [OpenCode documentation](https://opencode.ai/docs).
53
+ 2. Create a small product folder and deterministic test command:
54
+
55
+ ```bash
56
+ mkdir triad-celsius && cd triad-celsius
57
+ npm init -y
58
+ npm pkg set type=module
59
+ npm pkg set scripts.test='node --test'
60
+ ```
61
+ 3. Create a separate control workspace and install the OpenCode adapter:
62
+
63
+ ```bash
64
+ npx triad-plus init --host opencode --control "$PWD/triad-control"
65
+ npx triad-plus doctor --host opencode --control "$PWD/triad-control"
66
+ ```
67
+
68
+ The setup asks for the Orchestrator, Developer, Reviewer, and optional
69
+ Evaluator+ names, personas, and models. Choose `yes` for Evaluator+ if you
70
+ want it automatically after approval.
71
+ 4. Save this tiny PRD as `celsius-prd.md` beside the product project:
72
+
73
+ ```md
74
+ # Goal
75
+ Create a `celsiusToFahrenheit` utility.
30
76
 
31
- Hooks are optional optimizations; they write evidence and never make a Triad state decision. See [runtime details](docs/runtimes.md).
77
+ ## Acceptance criteria
78
+ - Export `celsiusToFahrenheit(value)`.
79
+ - `celsiusToFahrenheit(0)` returns `32`.
80
+ - `celsiusToFahrenheit(100)` returns `212`.
81
+ - Add automated tests.
32
82
 
33
- ## Quick start
83
+ ## Verification
84
+ npm test
85
+ ```
86
+ 5. Open `triad-control` **interactively** in the OpenCode TUI and run:
87
+
88
+ ```text
89
+ /triad /absolute/path/to/celsius-prd.md
90
+ ```
91
+
92
+ Expected experience:
93
+
94
+ ```text
95
+ Orchestrator
96
+
97
+ Developer implements
98
+
99
+ triad-verify produces evidence
100
+
101
+ Reviewer inspects
102
+ ├─ approved → optional automatic Evaluator+
103
+ └─ rework → Developer
104
+ ```
105
+
106
+ The Orchestrator first shows the feature cards, then delegates the bounded work.
107
+ If a tutorial step is unclear, see the [OpenCode guide](docs/runtimes.md#opencode)
108
+ and [troubleshooting](docs/troubleshooting.md).
109
+
110
+ ## Quick start for every runtime
34
111
 
35
112
  Requirements: Node.js 20+ and one supported coding-agent host.
36
113
 
@@ -39,7 +116,8 @@ npx triad-plus init --host codex --control /absolute/path/to/triad-control --glo
39
116
  npx triad-plus doctor --host codex --control /absolute/path/to/triad-control
40
117
  ```
41
118
 
42
- `init` creates a separate control workspace and refuses overwrites. Open it in the selected host, then start Triad with an absolute PRD path:
119
+ Open the control workspace in the selected host and start Triad with an absolute
120
+ PRD path:
43
121
 
44
122
  | Host | Entry point |
45
123
  | --- | --- |
@@ -49,32 +127,46 @@ npx triad-plus doctor --host codex --control /absolute/path/to/triad-control
49
127
  | Antigravity | `/triad /absolute/path/to/prd.md` |
50
128
  | Hermes Agent | `/triad /absolute/path/to/prd.md` |
51
129
 
52
- The Orchestrator presents feature cards before implementation. Follow [Getting started](docs/getting-started.md) for the complete copy-paste walkthrough.
53
-
54
- ## Configure agents
130
+ ## Evaluator+
55
131
 
56
- The wizard or reviewed `team.json` configures display name/persona, model, and supported effort/options for each role. Use neutral names. The selected adapter/runtime is project-level; per-role model binding is applied only where the host supports it. [Configuration](docs/configuration.md) explains the exact contract.
132
+ Evaluator+ is not a fourth member of Triad and is never a repair controller.
133
+ Configure it once in `team.json` (`roles.evaluator.enabled: true`) or in the
134
+ installer. The Orchestrator automatically dispatches it after Triad approval.
135
+ It sees only the goal, quality target, final candidate, and verifier evidence.
57
136
 
58
- ## Optional Evaluator+
137
+ ## Supported coding agents
59
138
 
60
- Evaluator+ is not a fourth member of Triad. After Reviewer approval, invoke the native command with `--evaluator` where supported:
139
+ | Runtime | Orchestrator | Developer | Reviewer | Evaluator+ | Verification dispatch |
140
+ | --- | --- | --- | --- | --- | --- |
141
+ | Codex | Yes | Yes | Yes | Yes | Explicit fallback; validated async hook when available |
142
+ | Claude Code | Yes | Yes | Yes | Yes | Explicit fallback; validated hook when available |
143
+ | OpenCode | Yes | Yes | Yes | Yes | Explicit dispatch |
144
+ | Antigravity | Yes | Yes | Yes | Yes | Explicit dispatch |
145
+ | Hermes Agent | Yes | Yes | Yes | Yes | Explicit dispatch |
61
146
 
62
- ```text
63
- /triad --evaluator
64
- ```
147
+ ## Configuration and verification
65
148
 
66
- It evaluates the completed result freshly and independently. A `FAIL` does not reopen Triad or start repair. See [Evaluator+](docs/evaluator-plus.md).
149
+ The installer writes `.triad-plus/team.json`, which separates stable role IDs
150
+ from user-facing names, personas, models, and supported effort/options. Roles
151
+ can use different models and, where the adapter supports it, different hosts.
152
+ Read [configuration](docs/configuration.md) and [runtime details](docs/runtimes.md).
67
153
 
68
- ## Architecture and limits
154
+ `triad-verify` validates assignment/candidate binding, runs declared
155
+ control-plane gates, detects mutation, and writes evidence. It supports the
156
+ loop; it never replaces the Orchestrator. See [verification](docs/verification.md).
69
157
 
70
- Triad+ consists of role skills, adapters, and a verifier. Core has no runtime-specific behavior; adapters own installation, entry-point, lifecycle, and model-binding differences. The verifier validates binding, runs declared control-plane gates, detects mutation, and writes atomic evidence. It does not govern the conversation or replace the Orchestrator.
158
+ ## Scope and limitations
71
159
 
72
- Triad+ does not provide a daemon, scheduler, dashboard, shared memory, automatic model routing, multi-reviewer voting, or evaluator-driven repair. Read [architecture](docs/architecture.md), [verification](docs/verification.md), and [troubleshooting](docs/troubleshooting.md).
160
+ Triad+ is deliberately not a workflow engine, daemon, scheduler, dashboard,
161
+ shared-memory system, automatic model router, multi-reviewer system, or
162
+ evaluator-driven repair loop. See [architecture](docs/architecture.md).
73
163
 
74
164
  ## Contributing
75
165
 
76
- Start with [CONTRIBUTING.md](CONTRIBUTING.md), run `npm test`, and keep runtime-specific behavior inside an adapter.
166
+ Start with [CONTRIBUTING.md](CONTRIBUTING.md). Keep runtime-specific behavior in
167
+ an adapter and preserve the small Core.
77
168
 
78
169
  ## License
79
170
 
80
- [MIT](LICENSE).
171
+ [Apache-2.0](LICENSE). Triad+ is permissively licensed for personal and
172
+ commercial use.
@@ -8,8 +8,8 @@ and `triad-loop-orchestrator` for an initialized one. Read
8
8
  `.triad-plus/team.json` if present and verify exposed role models against its
9
9
  contract before starting. If the host cannot expose a model identity, say so and
10
10
  ask the owner to confirm it; never invent a match. Keep the project-control workspace separate
11
- from product repositories; delegate normal development, fresh Gauntlet
12
- evaluation, and independent review to the corresponding Triad agents.
11
+ from product repositories; delegate normal development and independent review to
12
+ the corresponding Triad agents.
13
13
 
14
14
  Detect the runtime with `.triad-runtime/triad-runtime-capabilities.mjs --host
15
15
  antigravity`. Use explicit verification dispatch unless the recorded capability
@@ -17,3 +17,9 @@ snapshot proves a supported asynchronous route. Govern ordinary disagreements
17
17
  from evidence and record the decision. Do not implement or review routinely,
18
18
  and do not start demos, create pull requests, publish packages, releases, or
19
19
  force-push without owner authorization.
20
+
21
+ After final Triad approval, read `roles.evaluator.enabled` from `team.json`.
22
+ When true, automatically invoke a fresh `triad-evaluator` with only the approved
23
+ goal, quality target, final candidate, and verifier evidence. When false or
24
+ omitted, finish without evaluation. Its verdict never reopens Triad or starts
25
+ repair; `--evaluator` and `--no-evaluator` are per-run overrides when supplied.
@@ -23,8 +23,10 @@ its selected verification route. Use explicit verifier dispatch unless a future
23
23
  Antigravity lifecycle adapter is actually detected and validated.
24
24
 
25
25
  Delegate normal implementation to `triad-developer` and independent review to
26
- `triad-reviewer`. Invoke `triad-evaluator` only after Triad approval when the
27
- owner requests Evaluator+; its independent report never reopens Triad. Continue
26
+ `triad-reviewer`. After Triad approval, automatically invoke fresh
27
+ `triad-evaluator` when `roles.evaluator.enabled` is true in `team.json`; false or
28
+ omitted means no evaluation. Its independent report never reopens Triad or starts
29
+ repair; `--evaluator` and `--no-evaluator` are per-run overrides when supplied. Continue
28
30
  through declared cards and normal pushes after all gates pass. Escalate only the
29
31
  decision types defined by the Triad+ skills. Do not start or stop a demo without
30
32
  an owner instruction.
@@ -19,8 +19,10 @@ technical role identifiers and authority remain unchanged. If the active
19
19
  Orchestrator model cannot meet the recorded contract, say so before work starts.
20
20
 
21
21
  Delegate implementation to `triad-developer` and review to `triad-reviewer`.
22
- Invoke fresh `triad-evaluator` only after Triad approval and only when requested;
23
- its report never reopens the completed run. Continue
22
+ After Triad approval, automatically invoke fresh `triad-evaluator` when
23
+ `.triad-plus/team.json` has `roles.evaluator.enabled: true`; false or omitted
24
+ means no evaluation. Its report never reopens the completed run; `--evaluator`
25
+ and `--no-evaluator` are per-run overrides when supplied. Continue
24
26
  autonomously through declared cards and normal branch pushes once all gates pass.
25
27
  Escalate only the decision types defined by the Triad skills. Do not start or
26
28
  stop a demo without an owner instruction.
@@ -19,7 +19,9 @@ technical role identifiers and authority remain unchanged. If the active
19
19
  Orchestrator model cannot meet the recorded contract, say so before work starts.
20
20
 
21
21
  Delegate implementation to the configured `triad_developer` profile and review to
22
- `triad_reviewer`. Once Triad is approved, invoke the optional fresh `triad_evaluator`
23
- only when requested; its report never reopens the completed run. Continue autonomously through declared cards and normal branch
22
+ `triad_reviewer`. Once Triad is approved, automatically invoke a fresh
23
+ `triad_evaluator` when `.triad-plus/team.json` has `roles.evaluator.enabled: true`.
24
+ When false or omitted, do not invoke it. Its report never reopens the completed run;
25
+ `--evaluator` and `--no-evaluator` are per-run overrides when supplied. Continue autonomously through declared cards and normal branch
24
26
  pushes once all gates pass. Escalate only the decision types defined by the
25
27
  Triad skills. Do not start or stop a demo without an owner instruction.
@@ -21,11 +21,7 @@ adapter uses those host primitives for separately invoked Developer and Reviewer
21
21
  roles when the configured model/provider is available. It uses explicit
22
22
  verification dispatch; no Hermes lifecycle hook is assumed.
23
23
 
24
- Evaluator+ is opt-in and post-run only:
25
-
26
- ```text
27
- /triad --evaluator
28
- ```
29
-
30
- It receives the approved goal, acceptance target, final artifact, and verifier
31
- evidence, then writes an independent report without reopening Triad.
24
+ Evaluator+ is opt-in and post-run only. Set `roles.evaluator.enabled` to `true`
25
+ in `team.json` and the Orchestrator dispatches it automatically after Triad
26
+ approval. It receives the approved goal, acceptance target, final artifact, and
27
+ verifier evidence, then writes an independent report without reopening Triad.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: triad
3
- description: Start or resume a Triad run in Hermes Agent from a PRD source, declared repositories, and measurable goals. Use when the owner invokes /triad or asks Hermes to coordinate a Triad project; use --evaluator only after an approved Triad run for an independent post-run Evaluator+ report.
3
+ description: Start or resume a Triad run in Hermes Agent from a PRD source, declared repositories, and measurable goals. Evaluator+ runs automatically after approval when enabled in team configuration.
4
4
  ---
5
5
 
6
6
  # Triad in Hermes
@@ -27,10 +27,12 @@ After the Developer finishes, explicitly run
27
27
  Triad lifecycle hook in this adapter. A verifier pass is environment-derived
28
28
  evidence; a Developer statement is not.
29
29
 
30
- When invoked with `--evaluator`, do not reopen a Triad run. Load
31
- `triad-loop-evaluator` in a fresh Hermes one-shot session with only the approved
32
- goal, acceptance target, final artifact, and verification evidence. Store its
30
+ After final Triad approval, read `roles.evaluator.enabled` from `team.json`.
31
+ When true, automatically load `triad-loop-evaluator` in a fresh Hermes one-shot
32
+ session with only the approved goal, acceptance target, final artifact, and
33
+ verification evidence; false or omitted finishes without evaluation. `--evaluator`
34
+ and `--no-evaluator` are per-run overrides when supplied. Store its
33
35
  post-run report at the absolute `<control-workspace>/artifacts/evaluator-plus/`
34
36
  path supplied by the Orchestrator; never infer it relative to a product worktree.
35
37
  `FAIL` or `INDETERMINATE` is information for a new
36
- owner-requested run, never an automatic repair.
38
+ owner-requested run, never an automatic repair and never reopens Triad.
@@ -21,8 +21,8 @@ permission:
21
21
 
22
22
  You are the Triad+ Engineering Loop orchestrator. Govern the workflow and the
23
23
  project-control records; delegate ordinary development to `triad-developer`,
24
- fresh Gauntlet evaluation to `triad-evaluator`, and independent review to
25
- `triad-reviewer`. Do not replace any role merely for convenience.
24
+ independent review to `triad-reviewer`, and Evaluator+ only after approval. Do
25
+ not replace any role merely for convenience.
26
26
 
27
27
  If `.triad-plus/team.json` exists, load it before replying and use its language,
28
28
  owner address, display names, and personas in communication. Technical role IDs and their
@@ -58,3 +58,10 @@ pass, make normal pushes of declared project branches. Do not force-push, open
58
58
  or update pull requests, publish packages, create releases, or start a demo
59
59
  without the owner's explicit instruction. A requested demo must remain running
60
60
  until the owner explicitly ends it.
61
+
62
+ After final Triad approval, read `roles.evaluator.enabled` from `team.json`.
63
+ When true, automatically dispatch `triad-evaluator` in a fresh context with only
64
+ the approved goal, quality target, final candidate, and verifier evidence. When
65
+ false or omitted, finish without evaluation. A verdict never reopens Triad,
66
+ assigns Developer work, or starts repair; `--evaluator` and `--no-evaluator` are
67
+ per-run overrides when supplied.
@@ -22,3 +22,9 @@ Delegate implementation and review through the configured Triad subagents.
22
22
  Proceed autonomously through declared cards and normal branch pushes once all
23
23
  gates pass. Escalate only the decision types defined by the skills. Do not start
24
24
  or stop a demo unless the owner explicitly asks.
25
+
26
+ After final Triad approval, read `roles.evaluator.enabled` from the team file.
27
+ When true, automatically dispatch `triad-evaluator` in a fresh context with only
28
+ the approved evaluation packet. When false or omitted, finish without evaluation.
29
+ An Evaluator+ verdict never reopens Triad, assigns Developer work, or starts
30
+ repair; `--evaluator` and `--no-evaluator` are per-run overrides when supplied.
package/bin/triad-plus.js CHANGED
@@ -242,7 +242,7 @@ async function init(options) {
242
242
  if (adapter.globalEntry) {
243
243
  process.stdout.write(`Install user-level assets with --global to expose ${adapter.entry}.\n`);
244
244
  }
245
- process.stdout.write(`Open the control workspace and use ${adapter.entry} <PRD path>. Evaluator+ is optional and post-run only.\n`);
245
+ process.stdout.write(`Open the control workspace and use ${adapter.entry} <PRD path>. Configured Evaluator+ runs automatically post-approval.\n`);
246
246
  }
247
247
 
248
248
  async function doctor(options) {
@@ -20,6 +20,10 @@ personas. A schema-version-1 configuration has four role records:
20
20
  optional and enabled only when `roles.evaluator.enabled` is `true`. Omitting that
21
21
  field is backward-compatible and means Evaluator+ is not configured.
22
22
 
23
+ When enabled, Evaluator+ is automatically dispatched by the Orchestrator after
24
+ Triad reaches Reviewer approval. It receives a fresh post-run packet and cannot
25
+ change the closed Triad result. Set `enabled` to `false` to disable this default.
26
+
23
27
  The runtime adapter is selected per installed control workspace (`--host`). The
24
28
  team file records role-level models and effort, but an adapter writes those into
25
29
  host-native profiles only where the host supports that facility. A blank model
@@ -1,7 +1,8 @@
1
1
  # Evaluator+
2
2
 
3
- Evaluator+ is optional and outside the Triad production loop. Invoke it only
4
- after the Reviewer has approved a feature or delivery.
3
+ Evaluator+ is optional and outside the Triad production loop. Configure
4
+ `roles.evaluator.enabled: true` and the Orchestrator automatically invokes it
5
+ only after the Reviewer has approved a feature or delivery.
5
6
 
6
7
  It receives the goal, acceptance target, final artifact, and verifier evidence.
7
8
  It should not receive developer reasoning, prior reviewer conversation, or
@@ -9,7 +9,8 @@ npx triad-plus doctor --host codex --control "$PWD/triad-control"
9
9
  ```
10
10
 
11
11
  The interactive setup asks for language, owner address, neutral role names,
12
- personas, models, and whether optional Evaluator+ is enabled. It writes only
12
+ personas, models, and whether optional Evaluator+ is enabled. When enabled,
13
+ Evaluator+ is automatically dispatched after Triad approval. It writes only
13
14
  after you type `install`.
14
15
 
15
16
  For non-interactive setup, pass a reviewed team file:
@@ -37,8 +37,6 @@ when `roles.evaluator.enabled` is `true`.
37
37
 
38
38
  Open the control workspace and invoke the host-native command with an absolute
39
39
  PRD path. The Orchestrator presents feature cards before implementation, then
40
- delegates normal development and review. Use the optional evaluator form exposed
41
- by the host only after Triad is approved: invoke the native Triad command with
42
- `--evaluator` (for example `/triad --evaluator`) and the Orchestrator will either
43
- run the configured Evaluator+ or state that it is disabled. Users never create
40
+ delegates normal development and review. When `roles.evaluator.enabled` is true,
41
+ the Orchestrator invokes Evaluator+ automatically after Triad is approved. Users never create
44
42
  evaluation packets, report paths, or evidence directories manually.
@@ -4,5 +4,6 @@ Install with `npx triad-plus init --host opencode --control <path>`. Open the
4
4
  control workspace and run `/triad <absolute-prd-path>`. Project-local agent and
5
5
  command assets carry the configured role models where OpenCode supports them.
6
6
 
7
- Verification uses explicit Orchestrator dispatch. Evaluator+ is optional and may
8
- be invoked only after a Reviewer-approved result; it cannot reopen that run.
7
+ Verification uses explicit Orchestrator dispatch. A configured Evaluator+ is
8
+ automatically invoked only after a Reviewer-approved result; it cannot reopen
9
+ that run.
@@ -33,7 +33,8 @@ dopo i goal dichiarati. Avvio e stop della demo restano del proprietario.
33
33
 
34
34
  ## Evaluator+
35
35
 
36
- Evaluator+ è opzionale e fuori dal loop produttivo. Dopo `approved`, osserva solo
36
+ Evaluator+ è opzionale e fuori dal loop produttivo. Se abilitato in `team.json`,
37
+ l’Orchestrator lo avvia automaticamente dopo `approved`; osserva solo
37
38
  goal, target di accettazione, candidato finale ed evidence del verifier. Produce
38
39
  `PASS`, `FAIL` oppure `INDETERMINATE`. Un `FAIL` non modifica la run chiusa e non
39
40
  avvia rework. Vedi [Evaluator+](evaluator-plus.md).
@@ -34,7 +34,8 @@ autonomously once declared goals pass. Demo start and stop remain owner-controll
34
34
 
35
35
  ## Evaluator+
36
36
 
37
- Evaluator+ is optional and outside the production loop. After `approved`, it
37
+ Evaluator+ is optional and outside the production loop. When enabled in
38
+ `team.json`, the Orchestrator dispatches it automatically after `approved`. It
38
39
  inspects only the goal, acceptance target, final candidate, and verifier evidence.
39
40
  Its report is `PASS`, `FAIL`, or `INDETERMINATE`. A failure does not modify the
40
41
  closed run or start repair. See [Evaluator+](evaluator-plus.md).
package/docs/runtimes.md CHANGED
@@ -22,3 +22,10 @@ adapter instructions. It is supported, not experimental.
22
22
  See the concise host guides for [Codex](codex-replication.md),
23
23
  [Claude Code](claude-code-replication.md), [OpenCode](opencode-replication.md),
24
24
  and [Antigravity](antigravity-replication.md).
25
+
26
+ ## OpenCode
27
+
28
+ Use the interactive OpenCode TUI for complete multi-step Triad runs. OpenCode
29
+ 1.18.0 validated the full Orchestrator → Developer → verifier → Reviewer →
30
+ configured Evaluator+ lifecycle in the TUI. `opencode run` is useful for
31
+ one-shot work but does not retain that multi-step parent/subagent lifecycle.
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "triad-plus",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "A lightweight, evidence-backed engineering loop for coding agents.",
5
- "license": "MIT",
5
+ "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "triad-plus": "bin/triad-plus.js"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: triad-loop-evaluator
3
- description: Produce a fresh, blind, post-run Evaluator+ report for an already approved Triad result. Use only when explicitly requested after Triad approval, with a goal, acceptance target, final artifact, and environment-derived verification evidence.
3
+ description: Produce a fresh, blind, post-run Evaluator+ report for an already approved Triad result. Use after approval when configured by the Orchestrator, with only a goal, acceptance target, final artifact, and environment-derived verification evidence.
4
4
  ---
5
5
 
6
6
  # Evaluator+
@@ -49,6 +49,11 @@ pull request, publish, release, or start/stop a demo without owner direction.
49
49
  Write a final handoff with cards, commits, pushes, verifier evidence, reviewer
50
50
  decisions, risks, exceptions, and practical-test instructions.
51
51
 
52
- Evaluator+ is outside this run. Invoke it only after Triad is approved and only
53
- when the owner/configuration requests a separate post-run evaluation. Its result
54
- cannot reopen, rework, or change this run automatically.
52
+ Evaluator+ is outside the Triad production run. After final Triad approval,
53
+ read `roles.evaluator.enabled` from `.triad-plus/team.json`: when it is `true`,
54
+ automatically dispatch one fresh `triad-loop-evaluator` with only the approved
55
+ goal, quality target, final candidate, and current verifier evidence. When it is
56
+ false or omitted, finish without evaluation. Record the report separately;
57
+ `PASS`, `FAIL`, and `INDETERMINATE` cannot reopen, rework, assign Developer work,
58
+ or change the already closed Triad run. A per-run `--evaluator` or
59
+ `--no-evaluator` request may override the configuration when the host exposes it.