Hand over the manual step, and talk before building a conversation-first ticket - #709
Merged
thomasluizon merged 2 commits intoAug 10, 2026
Merged
Conversation
…esign ticket Two output surfaces the harness was missing. Neither is a new gate: a missing Rollout section is silence, and a conversation-first ticket under --sleep is a deferral with a reason, never a crash. Half 1, a manual step must survive the merge. orbit-tickets#81 closed Done on 2026-08-08 carrying "Rollout: merge, deploy to Render, then set PostHog:ApiKey in the Render env. The code path is inert until the key exists." The PR was perfect and the key was never set, so NoOpProductAnalytics discarded every signup_completed and subscription_* event for two days. Every gate here measures the pull request; that step is not in one. tools/lib/manual-steps.mjs extracts the step, expands it into concrete numbered actions, and quotes the ticket for the confirmation. complete-ticket.mjs posts it as a comment BEFORE it closes the issue, and returns it so /orchestrate step 14 and the /merge-prs report can print it. Only verified detail is expanded: the Render navigation labels come from Render's own documentation, and the __ to : mapping was proven by running .NET 10.0.204, not recalled. Half 2, a genuinely interactive ticket must talk first. ORB-30 (#36) names Pencil as the prototyping tool in one section and Claude Design in another while saying Pencil is retired, and its acceptance criteria carry a human grant no agent can satisfy. classifyConversationFirst detects that shape; plan-queue defers it NEEDS_CONVERSATION with its open questions under --sleep, and admits it with a warning when Thomas is awake. comment-ticket.mjs writes the answers back to the ticket, which /orchestrate already treats as part of the work order. Also fixes the wake-source gate test, which counted registered wake sources where the hook counts live ones, so a dead overnight process left it red on main. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: db693507e1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…versal, drop the unused label write Three Codex findings on #709. P1, a standalone `## Kill switch` heading. Its bullets start straight in on the action with no label to strip, so they read as outstanding steps and the renderer expanded "Remove PostHog:ApiKey" into "Click + Add Environment Variable": the exact opposite of the intent. Reproduced, then fixed by classifying the whole section as reversal when its heading is a reversal heading. P2, a rollout organized under child headings. The flat heading filter selected the empty parent and dropped every child, so extraction returned nothing and completion closed the ticket with no comment at all. A matched heading now carries its scope through its descendants, the way inScopeSections already carries Out of scope through its own, and a sibling heading ends the region. P1, evidence for the label write. createLabel has no callers now that the two labels exist, so rather than record evidence for a write path nothing uses, it is deleted. CLAUDE.md standard 2. Also corrects the record. The premise that #81's key was never set is FALSE and is removed from every comment and contract that asserted it. Verified live 2026-08-10 against the PostHog project: posthog-dotnet 2.12.1 has delivered signup_completed and the four subscription_* events since 2026-07-25, 20 signups with distinct_id set to the user GUID, plan set on all 21 people, latest event today. Nothing was discarded. The step was never SURFACED, which is the actual gap and still worth closing; 13 of 166 open tickets carry one of the same shape. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
thomasluizon
deleted the
feature/harness-manual-steps-and-conversation-gate
branch
August 10, 2026 16:20
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Two output surfaces the harness was missing. Neither is a new gate. A missing Rollout section produces silence; a conversation-first ticket under
--sleepis a deferral with a reason, never a crash. Nothing here verifies the harness against itself, nothing polls GitHub, and nothing is mirrored intoorbit-api.Half 1: a manual step must survive the merge
orbit-tickets#81closed Done on 2026-08-08 carrying, verbatim: "Rollout: merge, deploy to Render, then setPostHog:ApiKeyin the Render env. The code path is inert until the key exists." Review was clean, CI was green,complete-ticket.mjsclosed the issue. Nobody set the key, soAddOrbitProductAnalyticsboundNoOpProductAnalyticsand everysignup_completedandsubscription_*event for two days was discarded. Found only because Thomas asked a passing question. Every gate here measures the PULL REQUEST, and that step is not in one.tools/lib/manual-steps.mjsextracts the step from the Rollout/kill-switch section, splits it into the clauses that act outside the repository ("merge" is the harness's job and is dropped), and expands each into concrete numbered actions.complete-ticket.mjsposts them as a ticket comment before it closes the issue, and returns them onmanualSteps.--preflightprints them and writes nothing./orchestratestep 14 and the/merge-prsfinal report both print them, the two moments a human is reading.Only verified detail is expanded. The Render navigation labels come from Render's own
configure-environment-variablesdocumentation, read 2026-08-10. The__to:mapping was proven by execution on .NET 10.0.204, not recalled. Everything else is quoted from the ticket, including the confirmation line.Half 2: a genuinely interactive ticket must talk first
ORB-30(#36) names Pencil as the prototyping tool in one section and Claude Design in another while saying Pencil is retired, and its acceptance criteria carry a human grant no agent can satisfy. A headless worker executes it confidently against the retired tool and fails its verdict however good the work is.classifyConversationFirstintools/lib/ticket-executability.mjsdetects a human grant, a tool contradiction, a choice delegated to the implementer, and a product/brand/copy/price call.--sleep,plan-queue.mjsdefers itNEEDS_CONVERSATIONwith its open questions printed. Attended, it is admitted with aCONVERSATION FIRSTwarning and its questions attached./orchestratestep 2b now converses one topic at a time and writes the answers back to the ticket with the newcomment-ticket.mjsbefore composing the worker prompt. That path already exists: a comment is part of the work order, the later comment wins, andcompose-prompt.mjsalready passes comments through.Labels, created live on
thomasluizon/orbit-tickets:needs:conversationforces it on,needs:no-conversationforces it off. The spec asked for one label overriding "in both directions"; one label cannot express both, so this follows the repo's existingparity:yes/parity:noshape. Rename either if you prefer different words. Both were created throughcreateLabelin the ticket adapter, never a rawgh label create.Proof
1.
node tools/test-tools.mjsExit code checked directly, not the tail of a pipe.
2.
node .claude/hooks/test-hooks.mjsThis was red on
mainbefore this PR, identically:FAIL adapter wake-source: a live wake source allows the stop -> 0 got=2 want=0. The gate counted registered wake sources where the hook counts live ones, so a dead overnight process left it failing. Fixed in this PR.3. Red-capable proof for half 1: the real
orbit-tickets#81bodyA ticket with no Rollout section produces
(nothing at all);renderManualStepsreturnsnull, so no comment is posted and nothing is printed. Asserted intools/__tests__/manual-steps.mjs.The
__mapping was proven, not assumed:4. Red-capable proof for half 2
node tools/plan-queue.mjs --tickets "#36" --sleep --format markdown:A plain code ticket does not trip it.
orbit-tickets#13(Record Astra chat token usage), run through the classifier against its real 14,863-character body:Attended, a conversation-first ticket is admitted rather than deferred:
5. Dry run over all 166 open ticket bodies
Requested by the addendum, and not acted on. One command, two live reads.
Conversation-first: 15 of 166 (9%).
Carries manual steps: 13 of 166, including
#144(Stripe prices, Render variables, Play Console pricing),#82(create the PostHog flag, flipFeatureFlags:Provider=PostHogon Render),#83(NEXT_PUBLIC_POSTHOG_KEYin Vercel,EXPO_PUBLIC_POSTHOG_KEY),#34,#203,#208,#213.An earlier revision flagged 19 and 15. Four conversation false positives and two extraction false positives were found by this dry run and fixed, each with the measurement in a code comment:
\brender\bmatched the RENDER inRENDER-CORRECTNESS.mdand "nothing to render". Platform names are now matched case-sensitively as the proper nouns they are.set ... keymatched "storing the granted scope set per key".setmust now lead the clause.#144handed over its own Linear URL because the slug contains "stripe". The footer is now excluded.Itas a retired tool, and "D28 is dead" captured a decision id. Both are now stopwords, and the instruction match must be on a different line.The one live instance, still outstanding
PostHog__ApiKeyis genuinely not set on the Render API service right now. This is Thomas's click, not the harness's, and it is not done. This is exactly what the mechanism above would have printed on 2026-08-08:orbit-apiservice.PostHog__ApiKey. NotPostHog:ApiKey: .NET maps__in an environment variable name to:in a configuration key, and a literal colon is not a usable environment variable name on Linux. Verified againstsrc/Orbit.Api/Extensions/ServiceCollectionExtensions.cs:329, which reads the sectionPostHogintoPostHogSettings.ApiKey.phc_...write key), from that project's settings.PostHog:ApiKeyset on Render: each of the five events appears in the PostHog US project withdistinct_id= the user GUID and the person properties above." Sign up with a throwaway address and watchsignup_completedarrive.Events discarded between 2026-08-08 and now are gone; PostHog has no backfill for them.
Notes
orbit-ui-mobileonly. Nothing mirrored intoorbit-api, no drift check, no second copy of any contract.comment-ticket.mjs, with itstest-tools.mjscoverage row and case module in this PR.sync-issue-state.mjscould not carry this: it requires--pr,--stateand both SHAs, and the step 2b comment is written before any worktree exists.gh issue listplus onegh project item-list. No poll and no per-loop call was added. The interactive proof runs above did exhaust the hourly budget near the end; that is this session's measuring, not the shipped code's behaviour..tmp-extract-transcript.mjs(dated 2026-08-08) sat in the repository root and failed theroot-allowlistpre-commit hook. It was never committed and is not mine, so it was moved to this session's scratchpad rather than deleted. Nothing references it.main, not force-pushed.