Tom Boucher
6df9b44297
fix( #3018 ): codex adapter must stop and ask, not silently default decisions ( #3027 )
...
* fix(#3018 ): codex adapter must stop and ask, not silently default decisions
@jon-hendry: running `\$gsd-discuss-phase 81` in Codex Default mode
proceeded toward writing CONTEXT.md / DISCUSSION-LOG.md / checkpoint
artifacts without surfacing the discussion questions to the user. The
generated Codex skill adapter explicitly told it to do that:
Execute mode fallback:
- When `request_user_input` is rejected (Execute mode), present a
plain-text numbered list and pick a reasonable default.
That instruction is wrong for any workflow whose contract is to
discuss with the user (most prominently `$gsd-discuss-phase`). The
fallback now requires the agent to:
1. STOP. Present the questions as a plain-text numbered list, then
wait for the user's reply.
2. Only proceed without a user answer when one of these is true:
(a) invocation included --auto / --all,
(b) user explicitly approved a default for this question, or
(c) workflow's documented contract permits autonomous defaults.
3. Do NOT write CONTEXT.md, DISCUSSION-LOG.md, PLAN.md, or checkpoint
files until the user has answered or one of (a)-(c) above applies.
Tests:
- bug-3018-codex-discuss-fallback.test.cjs (5 tests, structural-IR):
parses the generated header into sections via regex, asserts on
the Execute-mode-fallback section's content (must contain stop/
wait + plain-text directives, must NOT contain "pick a reasonable
default", must name a permission path, must forbid artifact
writing). No raw text snapshot — the assertions describe the
behavioral invariant, so prose can be reworded without test churn.
- codex-config.test.cjs:128 still passes — section still mentions
"Execute mode" as required.
Verification:
- 5/5 pass on new regression test
- 116/116 pass on bug-3018 + codex-config combined
- 6763/6763 pass on full suite
- lint-no-source-grep clean
Closes #3018
* test(#3018 ): parse fallback into typed semantic-flag record (CR)
CodeRabbit nitpick on PR #3027 : the regression tests grepped the
generated header prose with regex, which is brittle and tests wording
rather than semantics. Per CONTRIBUTING.md "no-source-grep" standard.
Refactored to a structural-IR shape:
- New `parseExecuteModeFallback(section)` walks the section text once
and returns a typed record:
{
ok, sectionLength,
instructsStop, // STOP/HALT/WAIT directive
presentsPlainTextQuestions, // plain-text / numbered list
namesPermissionPath, // --auto / --all / explicit approval
forbidsWritingArtifactsBeforeAnswer, // write-ban + named artifact class
silentlyPicksDefaults, // anti-pattern guard (must be false)
}
- Each positive invariant gets its own test asserting on the parsed
boolean, so a failure points at the exact invariant that broke.
- A final test does a single assert.deepStrictEqual against the full
expected contract — gives a structured diff when any flag flips.
- The artifact-write ban now requires BOTH a "do not write" intent
AND a named artifact class (was a single broad regex), so generic
"do not write" prose elsewhere in the section can't satisfy it.
Verification: 8/8 pass; lint-no-source-grep clean.
2026-05-02 11:45:36 -04:00
..
2026-04-25 10:50:54 -04:00
2026-04-04 14:29:03 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-25 10:50:54 -04:00
2026-04-11 03:39:29 -07:00
2026-04-20 09:31:34 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-11 03:30:05 -07:00
2026-04-07 17:27:20 -04:00
2026-05-01 19:50:10 -04:00
2026-04-04 14:29:03 -04:00
2026-04-25 10:50:54 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-04 07:24:31 -04:00
2026-04-11 08:50:44 -04:00
2026-04-07 08:13:52 -04:00
2026-04-05 17:49:20 -04:00
2026-05-02 11:45:33 -04:00
2026-04-05 18:05:32 -04:00
2026-04-05 18:20:11 -04:00
2026-04-19 16:35:32 -05:00
2026-04-25 11:34:55 -04:00
2026-04-22 12:04:06 -04:00
2026-04-07 17:19:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-10 10:48:00 -04:00
2026-05-01 19:50:10 -04:00
2026-04-11 03:37:34 -07:00
2026-04-10 10:50:17 -04:00
2026-04-10 11:19:32 -04:00
2026-04-10 11:25:55 -04:00
2026-04-10 11:15:59 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-15 14:58:41 -04:00
2026-04-23 11:58:06 -04:00
2026-04-17 09:20:26 -04:00
2026-04-25 10:50:54 -04:00
2026-04-22 10:41:58 -04:00
2026-04-25 12:02:58 -04:00
2026-04-17 09:20:42 -04:00
2026-04-29 07:56:51 -04:00
2026-04-20 18:37:42 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-20 10:09:33 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-30 00:43:47 -04:00
2026-05-01 19:50:10 -04:00
2026-04-20 10:11:00 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-20 10:08:46 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-21 09:46:01 -04:00
2026-05-01 19:50:10 -04:00
2026-04-21 21:20:27 -04:00
2026-04-21 10:10:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-22 12:09:12 -04:00
2026-04-22 10:41:58 -04:00
2026-04-21 20:33:43 -04:00
2026-05-01 19:50:10 -04:00
2026-04-21 21:18:58 -04:00
2026-04-22 11:28:25 -04:00
2026-04-29 22:56:59 -04:00
2026-04-22 12:04:17 -04:00
2026-05-01 19:50:10 -04:00
2026-04-22 12:03:56 -04:00
2026-04-22 12:04:06 -04:00
2026-05-01 19:50:10 -04:00
2026-04-25 12:09:27 -04:00
2026-04-24 18:05:10 -04:00
2026-04-24 18:10:45 -04:00
2026-04-24 18:05:33 -04:00
2026-04-29 22:56:59 -04:00
2026-04-24 18:05:18 -04:00
2026-05-02 09:27:23 -04:00
2026-04-24 20:22:17 -04:00
2026-04-24 20:22:29 -04:00
2026-05-01 19:50:10 -04:00
2026-04-25 12:10:01 -04:00
2026-04-25 12:16:04 -04:00
2026-04-25 12:10:01 -04:00
2026-04-25 12:15:39 -04:00
2026-05-02 09:27:23 -04:00
2026-05-01 19:50:10 -04:00
2026-04-28 18:28:53 -04:00
2026-04-27 12:31:43 -04:00
2026-04-27 12:31:49 -04:00
2026-05-01 19:50:10 -04:00
2026-04-27 12:31:15 -04:00
2026-05-01 19:50:10 -04:00
2026-04-27 12:31:26 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-28 20:37:47 -04:00
2026-04-28 20:22:59 -04:00
2026-04-28 20:23:32 -04:00
2026-04-28 20:16:27 -04:00
2026-05-02 09:27:23 -04:00
2026-04-28 20:21:44 -04:00
2026-04-29 21:52:20 -04:00
2026-04-28 20:21:48 -04:00
2026-04-28 20:23:29 -04:00
2026-05-01 19:50:10 -04:00
2026-04-29 07:59:30 -04:00
2026-05-01 19:50:10 -04:00
2026-04-29 08:00:17 -04:00
2026-05-02 09:27:23 -04:00
2026-04-29 07:56:32 -04:00
2026-04-29 21:52:20 -04:00
2026-04-29 21:51:58 -04:00
2026-04-29 23:27:27 -04:00
2026-04-30 17:30:19 -04:00
2026-04-30 21:08:26 -04:00
2026-04-30 21:57:27 -04:00
2026-05-01 09:23:02 -04:00
2026-05-01 09:22:13 -04:00
2026-05-02 09:27:23 -04:00
2026-05-01 11:25:26 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 11:25:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 13:04:39 -04:00
2026-05-01 16:10:30 -04:00
2026-05-01 17:25:20 -04:00
2026-05-01 15:15:20 -04:00
2026-05-01 15:15:20 -04:00
2026-05-02 00:29:34 -04:00
2026-05-02 00:29:45 -04:00
2026-05-02 00:40:09 -04:00
2026-05-01 17:25:20 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 17:25:20 -04:00
2026-05-01 21:13:25 -04:00
2026-05-01 17:39:35 -04:00
2026-05-02 00:29:43 -04:00
2026-05-02 00:29:31 -04:00
2026-05-02 00:29:34 -04:00
2026-05-02 00:29:34 -04:00
2026-05-01 21:14:14 -04:00
2026-05-02 09:38:34 -04:00
2026-05-02 09:30:58 -04:00
2026-05-02 11:45:30 -04:00
2026-05-02 11:45:36 -04:00
2026-05-02 11:45:33 -04:00
2026-05-01 19:50:10 -04:00
2026-04-23 08:36:03 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 18:12:20 -04:00
2026-05-01 18:12:20 -04:00
2026-05-01 18:12:20 -04:00
2026-05-01 18:12:20 -04:00
2026-05-01 18:12:20 -04:00
2026-05-01 18:12:20 -04:00
2026-05-01 19:50:10 -04:00
2026-04-11 09:15:36 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-20 09:31:34 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-12 08:10:30 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-02 11:45:30 -04:00
2026-04-29 22:56:59 -04:00
2026-05-01 19:50:10 -04:00
2026-04-05 17:02:20 -04:00
2026-04-10 10:56:09 -04:00
2026-05-01 19:50:10 -04:00
2026-04-25 11:34:55 -04:00
2026-04-07 17:25:11 -04:00
2026-05-01 19:50:10 -04:00
2026-04-24 18:05:16 -04:00
2026-04-15 16:46:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-30 01:04:41 -04:00
2026-05-02 09:38:34 -04:00
2026-05-01 19:50:10 -04:00
2026-04-11 09:20:27 -04:00
2026-04-04 14:29:03 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-05 09:15:41 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-25 11:34:55 -04:00
2026-05-01 19:50:10 -04:00
2026-04-27 09:03:36 -04:00
2026-04-01 08:47:31 -06:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-25 16:26:15 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-25 14:23:40 -04:00
2026-04-22 12:04:21 -04:00
2026-04-29 08:14:11 -04:00
2026-04-30 01:04:41 -04:00
2026-04-30 01:04:41 -04:00
2026-04-30 00:48:49 -04:00
2026-05-01 19:50:10 -04:00
2026-04-25 12:04:16 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-22 20:49:52 -04:00
2026-04-05 18:33:17 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-26 21:40:38 -04:00
2026-05-01 19:50:10 -04:00
2026-04-30 00:57:17 -04:00
2026-05-02 09:27:23 -04:00
2026-05-01 19:50:10 -04:00
2026-04-30 14:04:50 -04:00
2026-05-01 19:50:10 -04:00
2026-04-20 10:08:46 -04:00
2026-04-15 22:46:31 -04:00
2026-04-04 14:37:54 -04:00
2026-04-04 14:29:03 -04:00
2026-05-02 11:45:33 -04:00
2026-04-30 22:48:08 -04:00
2026-05-01 19:50:10 -04:00
2026-04-04 14:29:03 -04:00
2026-04-20 09:31:34 -04:00
2026-05-02 09:27:23 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-15 14:59:07 -04:00
2026-04-17 09:20:26 -04:00
2026-04-27 12:31:49 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 09:23:20 -04:00
2026-05-01 22:37:48 -04:00
2026-04-23 11:53:51 -04:00
2026-04-15 14:59:24 -04:00
2026-05-01 19:50:10 -04:00
2026-04-20 09:39:05 -04:00
2026-04-20 09:39:05 -04:00
2026-05-01 19:50:10 -04:00
2026-04-26 13:33:54 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-05 19:09:14 -04:00
2026-04-30 11:38:13 -04:00
2026-04-14 17:57:38 -04:00
2026-05-01 19:50:10 -04:00
2026-04-04 14:29:03 -04:00
2026-05-01 19:50:10 -04:00
2026-04-25 11:34:55 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-26 11:48:47 -04:00
2026-04-25 12:09:27 -04:00
2026-04-30 22:48:08 -04:00
2026-04-05 18:05:32 -04:00
2026-04-07 08:13:46 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 16:10:30 -04:00
2026-05-01 19:50:10 -04:00
2026-04-25 11:34:55 -04:00
2026-05-01 19:50:10 -04:00
2026-04-06 15:13:23 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-16 17:15:29 -04:00
2026-04-04 14:29:03 -04:00
2026-04-11 15:02:55 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-30 14:10:28 -04:00
2026-04-04 14:29:03 -04:00
2026-04-25 12:02:58 -04:00
2026-05-01 19:50:10 -04:00
2026-04-25 14:18:34 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-30 11:38:13 -04:00
2026-05-01 19:50:10 -04:00
2026-04-30 12:13:55 -04:00
2026-04-30 14:19:46 -04:00
2026-04-30 14:19:46 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-04 14:29:03 -04:00
2026-05-01 19:50:10 -04:00
2026-04-16 17:22:31 -04:00
2026-05-01 19:50:10 -04:00
2026-04-17 10:11:08 -04:00
2026-04-30 21:57:27 -04:00
2026-04-04 14:29:03 -04:00
2026-04-05 10:23:41 -04:00
2026-05-01 19:50:10 -04:00
2026-04-11 11:19:47 -04:00
2026-05-01 19:50:10 -04:00
2026-04-04 14:29:03 -04:00
2026-05-01 19:50:10 -04:00
2026-04-16 17:22:31 -04:00
2026-04-30 00:43:47 -04:00
2026-04-30 00:43:47 -04:00
2026-04-26 13:33:45 -04:00
2026-04-30 14:10:28 -04:00
2026-04-23 11:53:20 -04:00
2026-05-01 19:50:10 -04:00
2026-04-15 14:59:56 -04:00
2026-05-01 19:50:10 -04:00
2026-04-01 16:53:20 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-02 09:27:23 -04:00
2026-04-20 10:08:18 -04:00
2026-05-01 19:50:10 -04:00
2026-04-04 07:10:21 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-10 13:55:27 -04:00
2026-04-15 10:35:29 -04:00
2026-04-11 15:02:55 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-11 15:39:50 -04:00
2026-04-11 09:15:00 -04:00
2026-05-01 19:50:10 -04:00
2026-04-05 17:49:20 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-20 10:08:18 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 09:22:13 -04:00
2026-04-30 01:04:41 -04:00
2026-04-12 17:56:19 -04:00
2026-04-25 16:26:15 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-04 14:29:03 -04:00
2026-05-01 19:50:10 -04:00
2026-04-04 14:29:03 -04:00
2026-04-06 08:40:37 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-30 00:43:47 -04:00
2026-04-02 21:36:36 -05:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-05-01 19:50:10 -04:00
2026-04-04 14:29:03 -04:00