feat(opencode): the OpenCode harness, checked against its goldens

The tool source generated from the schema, the home with its view, the
shared and per-process environments, the permission rules, the commands,
the warm-up under the supervisor, the event stream and the
classification, its patterns as hand-written scanners. The goldens record
the answer for each, a warm-up against a fake opencode included.

A timed-out supervised command now gets SIGTERM, so the supervisor takes
its tree down (SIGKILL 10 s later); any other child gets SIGKILL. :Json
gains DumpCompact.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jorijn van der Graaf 2026-10-31 08:32:51 +01:00
commit 5253fe3aff
Signed by: jorijnvdgraaf
GPG key ID: 2937E59CDCC1BCFB
10 changed files with 1946 additions and 7 deletions

View file

@ -13,7 +13,7 @@ using namespace Crafter;
namespace {
// The umbrella, then the partitions in import order: each after the ones
// it imports, which is also the order the module map in AGENTS.md uses.
constexpr std::array<std::string_view, 28> Interfaces = {
constexpr std::array<std::string_view, 29> Interfaces = {
"interfaces/Crafter.Review",
"interfaces/Crafter.Review-Unicode",
"interfaces/Crafter.Review-Json",
@ -40,10 +40,11 @@ namespace {
"interfaces/Crafter.Review-Mcp",
"interfaces/Crafter.Review-Seats",
"interfaces/Crafter.Review-SeatPool",
"interfaces/Crafter.Review-OpenCode",
"interfaces/Crafter.Review-Freeze",
"interfaces/Crafter.Review-Driver",
};
constexpr std::array<std::string_view, 25> Implementations = {
constexpr std::array<std::string_view, 26> Implementations = {
"implementations/Crafter.Review-Text",
"implementations/Crafter.Review-Crypto",
"implementations/Crafter.Review-Platform",
@ -67,6 +68,7 @@ namespace {
"implementations/Crafter.Review-Mcp",
"implementations/Crafter.Review-Seats",
"implementations/Crafter.Review-SeatPool",
"implementations/Crafter.Review-OpenCode",
"implementations/Crafter.Review-Freeze",
"implementations/Crafter.Review-Driver",
};
@ -78,7 +80,7 @@ namespace {
// One per directory under tests/, each an ordinary main() that links the
// library: exit 0 passes, nonzero fails, 77 skips.
constexpr std::array<std::string_view, 17> Tests = {
constexpr std::array<std::string_view, 18> Tests = {
"Crypto",
"Text",
"Platform",
@ -96,6 +98,7 @@ namespace {
"Seats",
"SeatPool",
"Drivers",
"OpenCode",
};
// The version the binary reports: CI sets it from the tag, a checkout