Skip to content

docs(adr): write ADRs 0001–0011 and 0013–0017 in ASD-STE100 - #3729

Open
thymikee wants to merge 55 commits into
mainfrom
docs/adr-ste100-foundations
Open

thymikee wants to merge 55 commits into
mainfrom
docs/adr-ste100-foundations

Conversation

@thymikee

@thymikee thymikee commented Oct 16, 2026 •

Copy link
Copy Markdown
Member

Summary

Rewrite the prose of 16 ADRs (0001–0011, 0013–0017) and the index in ASD-STE100. Add the missing "Rules at a glance" sections. Meaning is frozen: where STE wording and exact meaning conflict, the base sentence wins.

The fixup commits ("restore the frozen meaning in ADR NNNN") fix the round-1 review. They restore operative content that the history commits deleted: ADR 0005 preflight gate, ADR 0011 open migration step 3, ADR 0013 gesture/snapshot-session rule, ADR 0016 #1533 invariant, ADR 0003 interim-owner sentence. ADRs 0002, 0003, 0005, and 0016 now delete no history. About 3.5 KB of completed history stays deleted in ADRs 0001, 0004, 0008, 0009, 0011, 0013, and 0014.

Discrepancies found, not changed

  • ADR 0003: lines name daemon-command-registry.ts as the trait declaration site, but traits are inline daemon: {…} fields in packages/command-registry/src/registry.ts; catalog.ts holds no per-command data. Maintainer: is the inline facet an accepted change to Invariant 1? Should the ADR point at registry.ts?
  • ADR 0011: the text says the fake runner derives tap-point behavior from the golden table. No fake runner reads contracts/fixtures/tap-point-policy.json.
  • Code comments cite deleted ADR text: interaction-guarantees.ts:6 ("phase 3"), registry.ts:1602-1606 and command-descriptor-ref-frame-effect.test.ts:51 ("ADR 0014 escape hatch").
  • ADR 0007 "five minutes" vs the 60 s lease default; ADR 0015 scrollUntilVisible: agent-device fails to find an element real Maestro finds (layer-3 differential) #1299 is closed; ADR 0013 codec caller list is dated 2026-07.

Review and validation

  • Round 1 (Claude Opus): 5 high, about 20 medium; fixed. Round 2 (Codex): 15 ADRs and the index equivalent to base; one medium in ADR 0017 fixed in ea9be72adc. No finding open.
  • check:affected passed, exactCommit=true, 0 checks selected (ADR-only). check:agent-guidance passed.

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

16 issues found across 17 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="docs/adr/0009-apple-platform-consolidation.md">

<violation number="1" location="docs/adr/0009-apple-platform-consolidation.md:106">
P3: The visionOS discovery test reference points to the implementation module instead of its test file. Refer to `inventory-classification.test.ts` so readers can locate the claimed unit coverage.</violation>
</file>

<file name="docs/adr/0006-daemon-rpc-protocol-version.md">

<violation number="1" location="docs/adr/0006-daemon-rpc-protocol-version.md:31">
P2: State the required outcome of the comparison: an incompatible peer must be refused before sending command RPC. As written, this decision only requires comparing the values, so readers could interpret the comparison as diagnostic rather than as a pre-dispatch compatibility gate.</violation>

<violation number="2" location="docs/adr/0006-daemon-rpc-protocol-version.md:90">
P3: This overstates the released-surface gate: newly added wire declarations are accepted without a protocol bump or `compatibleChanges` entry, but this sentence says every change since the release needs one. Limit the rule to changed or removed existing declarations, and state that additions are additive if that distinction is intentional.</violation>
</file>

<file name="docs/adr/0011-interaction-guarantee-contract.md">

<violation number="1" location="docs/adr/0011-interaction-guarantee-contract.md:13">
P2: This glance rule overstates the sharing requirement: `responseIdentity` is explicitly closed through per-path capability work below. Limit the rule to shared implementations where the guarantee has a common implementation, and keep path-specific capabilities separate.</violation>

<violation number="2" location="docs/adr/0011-interaction-guarantee-contract.md:383">
P3: This says scroll keyboard probing waits for known healthy AX, but the runner probes while AX health is `unknown` too. Document the actual condition so the ADR does not mislead future policy changes.</violation>
</file>

<file name="docs/adr/0010-error-system.md">

<violation number="1" location="docs/adr/0010-error-system.md:81">
P2: This claims every error carries both diagnostic fields, but normalized errors can omit them and remote errors intentionally replace `logPath` with `logPathUnavailable`. Document these fields as conditional so consumers do not assume a readable path is always present.</violation>
</file>

<file name="docs/adr/0017-parameterized-recorded-inputs.md">

<violation number="1" location="docs/adr/0017-parameterized-recorded-inputs.md:10">
P2: The session-event presentation does not retain `${VAR}`: it redacts fill positionals as `<text>` and omits the value. Describe event data as redacted instead of claiming it uses the placeholder.</violation>

<violation number="2" location="docs/adr/0017-parameterized-recorded-inputs.md:123">
P2: This amendment retains each non-empty literal in session memory, contradicting the data-flow boundary's claim that the literal exists only on the live request path. Clarify that the literal is retained in the ephemeral, non-serialized session registry and state its security/lifetime limits consistently.</violation>
</file>

<file name="docs/adr/0014-session-ref-frame-lifetime.md">

<violation number="1" location="docs/adr/0014-session-ref-frame-lifetime.md:25">
P2: This summary overstates partial issuance: empty `find`/diff/divergence results do not activate or supersede a frame. Qualify the rule with the non-empty ref-and-epoch condition so the at-a-glance contract matches the implementation and the detailed rule below.</violation>
</file>

<file name="docs/adr/0001-provider-first-integration-scenarios.md">

<violation number="1" location="docs/adr/0001-provider-first-integration-scenarios.md:187">
P3: This list omits several exclusion buckets that the progress model reports, including cloud artifact lookup, daemon lifecycle, local contention, and Apple screenshot/private-AX options. List every bucket or label these six as examples so the ADR does not present an incomplete classification as exhaustive.</violation>
</file>

<file name="docs/adr/0002-persistent-platform-helper-sessions.md">

<violation number="1" location="docs/adr/0002-persistent-platform-helper-sessions.md:19">
P2: This rule incorrectly requires every Android touch command to use the bundled helper, excluding the provider-native injection path documented in ADR 0013. Limit it to instrumentation-backed touch injection.</violation>
</file>

<file name="docs/adr/0013-unified-gesture-plans.md">

<violation number="1" location="docs/adr/0013-unified-gesture-plans.md:129">
P3: `One-contact plans` is too broad here: target-authored drag includes source, movement, and destination-hold samples, while the next paragraph says those authored samples are preserved. Qualify this as `canonical one-contact endpoint plans` so the ADR does not contradict its drag schedule.</violation>
</file>

<file name="docs/adr/0005-ios-runner-interaction-lifecycle.md">

<violation number="1" location="docs/adr/0005-ios-runner-interaction-lifecycle.md:44">
P2: The preflight policy omits the unconditional exemptions for `activate`, `terminate`, and `targetReset`. Document these alongside the startup, readiness-probe, and recent-mutation exceptions in both the summary and Decision.</violation>

<violation number="2" location="docs/adr/0005-ios-runner-interaction-lifecycle.md:56">
P2: This allowlist is incomplete: `desktopScroll` and `gesture` also qualify for the healthy-mutation preflight skip. Add both commands so the ADR matches `RUNNER_COMMAND_TRAITS`.</violation>
</file>

<file name="docs/adr/0008-command-descriptor-registry.md">

<violation number="1" location="docs/adr/0008-command-descriptor-registry.md:61">
P2: This decision still names a `capability` descriptor facet, but the amended model and current descriptor use typed runtime declarations under `platformExecution`. Name the actual runtime-use facet so new command additions follow the accepted contract.</violation>

<violation number="2" location="docs/adr/0008-command-descriptor-registry.md:100">
P2: This consequence points to a nonexistent `descriptor.execute` field. The current extension point is the descriptor's `platformExecution` declaration, so name that property instead.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

Comment thread docs/adr/0009-apple-platform-consolidation.md Outdated
daemon, cannot safely communicate over the HTTP RPC boundary for existing commands. Bump it for
breaking changes to:
The daemon HTTP `/health` payload advertises integer `rpcProtocolVersion` beside service and package version metadata.
Before JSON-RPC requests, remote clients compare this value.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: State the required outcome of the comparison: an incompatible peer must be refused before sending command RPC. As written, this decision only requires comparing the values, so readers could interpret the comparison as diagnostic rather than as a pre-dispatch compatibility gate.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At docs/adr/0006-daemon-rpc-protocol-version.md, line 31:

<comment>State the required outcome of the comparison: an incompatible peer must be refused before sending command RPC. As written, this decision only requires comparing the values, so readers could interpret the comparison as diagnostic rather than as a pre-dispatch compatibility gate.</comment>

<file context>
@@ -4,83 +4,94 @@
-daemon, cannot safely communicate over the HTTP RPC boundary for existing commands. Bump it for
-breaking changes to:
+The daemon HTTP `/health` payload advertises integer `rpcProtocolVersion` beside service and package version metadata.
+Before JSON-RPC requests, remote clients compare this value.
+
+Package `version` is diagnostic only and must not control compatibility.
</file context>
Suggested change
Before JSON-RPC requests, remote clients compare this value.
Before JSON-RPC requests, remote clients compare this value and refuse incompatible peers before sending command RPC.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR keeps the base sentence: "Remote clients compare this value before sending JSON-RPC requests" (base line 21). The base does not state a refusal outcome here, so the suggestion adds meaning. If the base is wrong, docs/adr-stale-facts (umbrella #3744) handles it.


- Classify every dispatch-path × guarantee cell in the typed registry.
- Link each gap waiver to a tracking issue. Keep command-scoped claims within the path's command set.
- Give each TypeScript rule one shared implementation. Prove runner-side equivalents through golden fixtures.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: This glance rule overstates the sharing requirement: responseIdentity is explicitly closed through per-path capability work below. Limit the rule to shared implementations where the guarantee has a common implementation, and keep path-specific capabilities separate.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At docs/adr/0011-interaction-guarantee-contract.md, line 13:

<comment>This glance rule overstates the sharing requirement: `responseIdentity` is explicitly closed through per-path capability work below. Limit the rule to shared implementations where the guarantee has a common implementation, and keep path-specific capabilities separate.</comment>

<file context>
@@ -2,65 +2,71 @@
+
+- Classify every dispatch-path × guarantee cell in the typed registry.
+- Link each gap waiver to a tracking issue. Keep command-scoped claims within the path's command set.
+- Give each TypeScript rule one shared implementation. Prove runner-side equivalents through golden fixtures.
+- Prove every non-waived cell through a tagged contract scenario.
+- Delegation-on-error does not prove success-path parity.
</file context>
Suggested change
- Give each TypeScript rule one shared implementation. Prove runner-side equivalents through golden fixtures.
- Give each shared TypeScript rule one implementation. Prove runner-side equivalents through golden fixtures.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The glance bullet restates base Layer 2: "Each guarantee has exactly one home that all TS paths import" (base line 130). Narrowing it changes the frozen meaning. If the base is wrong, docs/adr-stale-facts (umbrella #3744) handles it.

Comment thread docs/adr/0003-daemon-command-registry.md
Comment thread docs/adr/0010-error-system.md Outdated
Comment thread docs/adr/0002-persistent-platform-helper-sessions.md Outdated
Comment thread docs/adr/0013-unified-gesture-plans.md Outdated
Without one, the same helper runs one-shot.
- **Apple.** iOS lowers one-contact endpoint-hold plans to the established fast-swipe synthesis profile.
It reaches the endpoint in 100 ms, holds for the planned duration, then lifts, as Maestro's XCTest driver does.
One-contact plans are linear and carry only start/end samples with the authored duration between them.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: One-contact plans is too broad here: target-authored drag includes source, movement, and destination-hold samples, while the next paragraph says those authored samples are preserved. Qualify this as canonical one-contact endpoint plans so the ADR does not contradict its drag schedule.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At docs/adr/0013-unified-gesture-plans.md, line 129:

<comment>`One-contact plans` is too broad here: target-authored drag includes source, movement, and destination-hold samples, while the next paragraph says those authored samples are preserved. Qualify this as `canonical one-contact endpoint plans` so the ADR does not contradict its drag schedule.</comment>

<file context>
@@ -4,215 +4,255 @@
+  Without one, the same helper runs one-shot.
+- **Apple.** iOS lowers one-contact endpoint-hold plans to the established fast-swipe synthesis profile.
+  It reaches the endpoint in 100 ms, holds for the planned duration, then lifts, as Maestro's XCTest driver does.
+  One-contact plans are linear and carry only start/end samples with the authored duration between them.
+  Two-contact plans convert every planned point to native orientation and send the exact arrays to the private XCTest event bridge.
+  macOS lowers one-contact plans to its drag executor.
</file context>
Suggested change
One-contact plans are linear and carry only start/end samples with the authored duration between them.
Canonical one-contact endpoint plans are linear and carry only start/end samples with the authored duration between them.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This text matches the base (59fdf008b9), so it is not drift from this PR. This PR keeps the base meaning. If the base is wrong, docs/adr-stale-facts (umbrella #3744) handles it. Base line 96: "One-contact plans are linear".

Comment thread docs/adr/README.md
Comment thread docs/adr/0008-command-descriptor-registry.md Outdated
Comment thread docs/adr/0003-daemon-command-registry.md Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 issues found across 17 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="docs/adr/0014-session-ref-frame-lifetime.md">

<violation number="1" location="docs/adr/0014-session-ref-frame-lifetime.md:28">
P3: This rule names the wrong owner for frame construction: `ref-frame-slot.ts` contains the private class and frame factories, while `ref-frame.ts` owns transitions and admission. Point the invariant at the value module so future changes follow the actual encapsulation boundary.</violation>
</file>

<file name="docs/adr/0015-direct-maestro-engine.md">

<violation number="1" location="docs/adr/0015-direct-maestro-engine.md:162">
P3: The Layer 1 outcome list omits the verifier's `we-are-lenient` classification. Add it so the ADR accurately describes every classification the conformance check can produce.</violation>

<violation number="2" location="docs/adr/0015-direct-maestro-engine.md:165">
P3: Layer 2 does not read parser-observed defaults from bytecode: the harness parses a minimal flow with `YamlCommandReader` to obtain the swipe duration. Update this description so the ADR does not misstate the conformance evidence source.</violation>
</file>

Requires human review: Auto-approval blocked because this review re-detected 1 unresolved issue already reported by Cubic.

View guided diff | Turn on auto-fix | Re-trigger cubic

Comment thread docs/adr/0017-parameterized-recorded-inputs.md
Comment thread docs/adr/0003-daemon-command-registry.md
The frame is one value on `SessionState`.
A transition replaces the frame whole and never edits it in place.
The frame type is nominal (`#`-private fields).
Thus, no module outside `packages/daemon/src/core/ref-frame.ts` can construct a frame, edit a frame, or derive a frame from an existing frame.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: This rule names the wrong owner for frame construction: ref-frame-slot.ts contains the private class and frame factories, while ref-frame.ts owns transitions and admission. Point the invariant at the value module so future changes follow the actual encapsulation boundary.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At docs/adr/0014-session-ref-frame-lifetime.md, line 28:

<comment>This rule names the wrong owner for frame construction: `ref-frame-slot.ts` contains the private class and frame factories, while `ref-frame.ts` owns transitions and admission. Point the invariant at the value module so future changes follow the actual encapsulation boundary.</comment>

<file context>
@@ -2,64 +2,72 @@
+  The frame is one value on `SessionState`.
+  A transition replaces the frame whole and never edits it in place.
+  The frame type is nominal (`#`-private fields).
+  Thus, no module outside `packages/daemon/src/core/ref-frame.ts` can construct a frame, edit a frame, or derive a frame from an existing frame.
+  The type cannot judge a whole frame that moves unchanged, for example when code clears the field or assigns the frame of another session.
+  The field-owner gate still covers these moves.
</file context>
Suggested change
Thus, no module outside `packages/daemon/src/core/ref-frame.ts` can construct a frame, edit a frame, or derive a frame from an existing frame.
The frame's nominal representation is confined to `packages/daemon/src/core/ref-frame-slot.ts`; frame transitions and admission remain owned by `packages/daemon/src/core/ref-frame.ts`.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This text matches the base (59fdf008b9), so it is not drift from this PR. This PR keeps the base meaning. If the base is wrong, docs/adr-stale-facts (umbrella #3744) handles it. Base lines 22-23 name ref-frame.ts.

The verifier classifies every flow as identical / both-reject / we-reject / mismatch.
Each non-identical outcome must be a declared, on-the-record divergence.
2. Layer 2 reads upstream constants (retry cap, animation-wait threshold/timeout, erase cap) straight from the pinned bytecode.
It also reads parser-observed defaults (swipe duration) straight from the pinned bytecode.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: Layer 2 does not read parser-observed defaults from bytecode: the harness parses a minimal flow with YamlCommandReader to obtain the swipe duration. Update this description so the ADR does not misstate the conformance evidence source.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At docs/adr/0015-direct-maestro-engine.md, line 165:

<comment>Layer 2 does not read parser-observed defaults from bytecode: the harness parses a minimal flow with `YamlCommandReader` to obtain the swipe duration. Update this description so the ADR does not misstate the conformance evidence source.</comment>

<file context>
@@ -6,248 +6,256 @@ Accepted
+   The verifier classifies every flow as identical / both-reject / we-reject / mismatch.
+   Each non-identical outcome must be a declared, on-the-record divergence.
+2. Layer 2 reads upstream constants (retry cap, animation-wait threshold/timeout, erase cap) straight from the pinned bytecode.
+   It also reads parser-observed defaults (swipe duration) straight from the pinned bytecode.
+   It cross-checks each value against the live `MAESTRO_COMPATIBILITY_PRESETS` constant.
+3. Layer 3 runs a small set of app-observable differential scenarios through both engines against the real fixture app.
</file context>
Suggested change
It also reads parser-observed defaults (swipe duration) straight from the pinned bytecode.
It also observes parser defaults (swipe duration) by parsing a minimal flow with the pinned `YamlCommandReader`.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This text matches the base (59fdf008b9), so it is not drift from this PR. This PR keeps the base meaning. If the base is wrong, docs/adr-stale-facts (umbrella #3744) handles it. Base lines 141-143: "parser-observed defaults (swipe duration) straight from the pinned bytecode".

The pinned parser is SHA-verified at regeneration.
Layer 1 captures each parse.
The deterministic verifier replays that capture against our engine.
The verifier classifies every flow as identical / both-reject / we-reject / mismatch.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: The Layer 1 outcome list omits the verifier's we-are-lenient classification. Add it so the ADR accurately describes every classification the conformance check can produce.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At docs/adr/0015-direct-maestro-engine.md, line 162:

<comment>The Layer 1 outcome list omits the verifier's `we-are-lenient` classification. Add it so the ADR accurately describes every classification the conformance check can produce.</comment>

<file context>
@@ -6,248 +6,256 @@ Accepted
+   The pinned parser is SHA-verified at regeneration.
+   Layer 1 captures each parse.
+   The deterministic verifier replays that capture against our engine.
+   The verifier classifies every flow as identical / both-reject / we-reject / mismatch.
+   Each non-identical outcome must be a declared, on-the-record divergence.
+2. Layer 2 reads upstream constants (retry cap, animation-wait threshold/timeout, erase cap) straight from the pinned bytecode.
</file context>
Suggested change
The verifier classifies every flow as identical / both-reject / we-reject / mismatch.
The verifier classifies every flow as identical / both-reject / we-reject / we-are-lenient / mismatch.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This text matches the base (59fdf008b9), so it is not drift from this PR. This PR keeps the base meaning. If the base is wrong, docs/adr-stale-facts (umbrella #3744) handles it. Base line 140 lists four outcomes.

@thymikee

Copy link
Copy Markdown
Member Author

The ADR rewrite in ea9be72 has nothing that must change before merge. All 8 checks pass, and this docs-only diff touches no job route. No conflicts.

Not blocking: docs/adr/0008-command-descriptor-registry.md line 15 keeps "No parity test exists", but I could not find the base "do not add one" directive. Please restore it if the base had it, and qualify the claim (for example "no byte-for-byte table parity test"). The retired "capability facet" wording also stays at lines 62 and 104. I checked only 0008, so one pass over all 16 ADRs for dropped "do not", "must" and status clauses would be useful. You can take or leave these.

On the open threads: the 0008 parity-test claim, the 0008 capability facet, the 0002 fail-closed scope, the 0002 planned-touch helper and the 0007 refused commands still apply. The 0007 renew window is unchecked against the base. Please resolve 0016 line 165, which repeats the base wording, and 0007 lines 170-171, where the detail exists in the text. I did not read the other 22 open threads, so please sort each as drift from this PR or inherited from the base before you act on it.

I did not compare all 16 ADRs against the base, and I checked ADR claims against code only for the one parity test file. Before merge, run the per-ADR check for dropped clauses against the base and sort the open threads.

thymikee added a commit that referenced this pull request Oct 17, 2026
The base rule applies to the snapshot helper and forbids the uiautomator dump substitute. The glance bullet dropped both.

#3729 (comment)
thymikee added a commit that referenced this pull request Oct 17, 2026
The retired gate compared derived tables byte for byte. src/__tests__/command-descriptor-parity.test.ts compares name sets.

#3729 (comment)
@thymikee

Copy link
Copy Markdown
Member Author

Follow-up at d7b95ab. Docs only; meaning stays frozen against 59fdf008b9.

Commits

  • Threads: 4a2742c (0002 fail-closed scope), ea0c891 (0007 allow list), c5f4fe5 (0008 "no byte-for-byte table parity test"; the base "do not add" directive is at line 16).
  • Dropped-clause pass over all 16 ADRs (4 independent reviewers): e5fe92b (0016 ABORTED rule tense), 0956c6f (0007 glance limits), d905b79 (0005 precondition referent), d7b95ab (0008 live AgentDeviceClient import). I rejected 3 findings because they are completed history or round-1 fixes. No dropped "must", "do not", or status clause was found.

CI: all 8 checks pass. No conflicts.

Threads (36): 3 fixed. 4 already fixed. 6 fixed on docs/adr-stale-facts (#3744). 2 resolved as you asked (0016 L165, 0007 L170). 1 matches the base (0007 renew window). Cubic resolved 0017 L70 after my reply. 19 stay open. Their text matches the base, so they are stale facts for #3744, not drift. The 0008 capability facet and execute threads are open, and #3744 does not change those lines yet.

Validation: pnpm format clean; pnpm check:affected --run --head d7b95abd2d passed, exactCommit=true (0 checks selected).

@thymikee

Copy link
Copy Markdown
Member Author

The PR is ready: I found no problems at d7b95ab, and the earlier findings from ea9be72 are fixed. The 0002 fail-closed rule now applies only to Android snapshots, and the 0002 thread is fixed at this head.

CI is green on all 8 checks, and the change is docs-only. There are no conflicts. Nothing else blocks human review.

Not blocking: docs/adr/0016-active-session-script-publication.md:132 lost the sentence that points to the later amendment replacing the stored flag, so you can restore that pointer or leave it.

On the other review threads, the fixed one is #3729 (comment) (0002 fail-closed scope), so please resolve it. These do not apply, because they ask to change content that the base ADRs already had and this PR keeps the meaning frozen, so please resolve them: #3729 (comment) (0008 capability facet is in the base text), #3729 (comment) (descriptor.execute is in the base text), #3729 (comment) (asks for a rewording beyond the base 0006 text), #3729 (comment) (0011 glance rule is preserved from the base), #3729 (comment) (0010 diagnostic-field claim is base content), #3729 (comment) (0017 literal-retention tension is base amendment content), #3729 (comment) (0014 partial-issuance summary is base content), #3729 (comment) (0005 preflight exemptions are base content), #3729 (comment) (0005 allowlist is base content), #3729 (comment) (0017 event-presentation claim is base content).

For this round I read only the changed hunks since ea9be72 and spot-checked three base passages, so I did not diff all 16 ADRs against base again. I judged the thread claims on frozen meaning and did not check each factual claim against current code.

@thymikee thymikee added the ready-for-human Valid work that needs human implementation, judgment, or maintainer merge label Oct 17, 2026
@thymikee

Copy link
Copy Markdown
Member Author

The review of d7b95ab still stands, but this PR now conflicts with main in docs/adr/0006-daemon-rpc-protocol-version.md. I removed ready-for-human until it is rebased. After the rebase, please check that the ADR 0006 text keeps the decision that main now has.

@thymikee thymikee removed the ready-for-human Valid work that needs human implementation, judgment, or maintainer merge label Oct 17, 2026
Restore the deleted interim-owner sentence and the AGENTS.md rule at the end of the 2026-06 update.
Drop the Status history line, since no history stays deleted.
Use "pin" for the registry tests, and restore the exact denied-surface list and the "only"/export scope in the glance rules.
Leave owner drift (daemon-command-registry.ts vs registry.ts, catalog.ts) for a maintainer decision.
Restore the Status fact that the public surface stays two modes and that host AX is an acquisition route.
Restore the no-box condition on wire `hittable`, the Swift/TypeScript guard referents, the Simulator probe routing condition, and the layering gate's "only".
Rewrite the glance rules from the body: fallback disables the bridge except capture-scoped failures; restore body scope for node-count, raw transport, and facet rules.
Restore the technical term "ladder", the semantic layer ordinals, past-tense history facts, and dropped modals ("can", "never", "always", "for any node").
Restore the ADR 0005 preflight-reduction gate as a present-tense rule and link the
allowlisted uptime skip to it. Scope the RUNNER_BUSY glance rules so connect-failure
replay is not banned. Restore dropped causal links, "not only from", "bookkeeping",
and the base occupancy and close-and-pooling scopes.
Restore "may" and the proxied-upstream condition in the ADR 0006 cache glance rule,
and add the must-honor-conditional-headers rule to the glance. State the one remaining
wire-compat gap. Restore "fail before it sends", "is treated as", "instead of failing
clearly", and the "over bumping the whole protocol" preference.
Restore the caller-named window and the close-release case in the ADR 0007 glance
rules, and fix the "It allocates" referent. Restore the full request-lock list, past-tense
incident facts (#2946, orphaned allocations, expired admitted work), the dropped
heartbeat-default history, and the base terms "treated as", "is refused with", "is used".
Restore "As of 2026-07" on the descriptor-registry live list; the `read` alias it names was retired later in #1877.
Restore the "Parity gate retired (2026-09)" label and its reason, and the ADR ownership sentence.
Mark the import-cycle inversion as a migration risk while keeping the `Input`/`Result` ownership rule.
Restore "every", "never collapse", "must preserve", "is bound by", and "the remaining deferred work".
Restore "Implementation status as of 2026-08" with its Shipped / Decision-only support boundary / Retained compatibility / Deferred labels.
Restore the command-atomic cutover wording and ADR 0019's term "legal injected substrate transition".
Restore "no coverage is claimed" as a dated statement, not a ban, and the "registry and enforcement paths are authoritative" sentence.
Fix a false causal clause for visionOS and restore base terms (OS-agnostic, net-new, seam, must not be flattened).
Restore the hint-required condition in the ADR 0010 glance, and use "pin" for help-text guarantees.
Restore the scope "a user or agent can reach", "consumer surface", "most common agent failures", and "some consumers".
Restore the condition on the ADR 0019 cleanup sentence, and keep the code-selection list from reading as a ban on the correct codes.
Replace "subclasses" with the base term "sub-classification".
Restore ADR 0011 Migration plan step 3 as open: no fake runner reads tap-point-policy.json yet. Steps 1, 2, 4, and 5 stay deleted as complete.
Restore the dated status qualifier (implemented through Layer 3, 2026-07-04).
Restore both collapse conditions in the glance, name `RUNTIME_OPERATION_EFFECTS`, and restore "Remaining gaps".
Restore dropped conditions, "only"/"merely"/"deliberately", the causal links, and the base terms ("class of bug", "ladder", "Swift twin", "hand-rolled").
Restore the Android rule that gestures do not stop or restart the snapshot session (#1275), which the language commit dropped.
Restore the codec amendment date (#1216), "only remaining callers", and "nothing left to migrate off".
Make the glance rules match the body: removed-argument rejection, viewport failure code, 60 s scope, and drag resolve-versus-replay-verify.
Restore dropped conditions, owners, and causal links in the Android, Apple, codec, and drag sections.
Restore ADR 0014 meaning that the STE rewrite changed: "implemented and enforced on `main`",
the staged-plan pointer that code comments use, and the PR #1241 status sentence. Restore dropped
conditions and quantifiers ("only ... and only with their epoch", "any", "every", "all reach the
generic daemon leaf", "on that platform"), the side-effect "seam" term, "not the transition site",
and the base ADR-composition and Consequences claims.
Restore technical terms that code uses: bug class, bug-class flows, settle ordering, settle-loop ordering.
Restore "never authoritative" for observation frames, and the "as long as" condition on ADR 0013 internal rewrites.
Restore dropped facts: the oracle replaced the hand-typed fixture, Layer 3 is a small set, documented deviations are not silent mismatches, a unit test rather than a device scenario pins percent truncation.
Make the glance rules match the body: inline-settle exception, ambiguity rule under `optional`, failed-dispatch invalidation.
Restore the #1533 invariant that no lifecycle state name, transition, or entry point is added or altered, and the writer's single publication-blocked question.
Restore "only" for PUBLISHED in the body and glance, plus the "shipped" status of each amendment and the implemented-on-main status.
Put superseded behavior (pre-amendment close paths, the recordSession flag) back in the past tense, and keep "such as" non-exhaustive.
Restore dropped qualifiers: "own recorded evidence", "re-serialize", "for the matched element", "(2026-08-02 amendment)", "leaks ... exactly like", "entirely under #1336".
Restore the absolute "no secret-to-name table" rule and fix the "until its resolution" referent (#1348).
Rewrite the glance bullets as statements that match the body's conditions, including the full session-scoped echo guarantee.
Turn the PR's imperatives in landmark and action modes back into descriptive statements, and restore dropped "only", "re-serialize", "the literal is redacted either way", and "rather than an authoring convention".
Restore "replay healing" and the ADR 0032 "revisit triggers" term in the index.
Restore dropped nouns that carried scope ("error handling", "semantics", "cleanup fix", "where ... enforced", "that the table refused").
Scope the waiver/evidence-gap convention to the Status section again.
The STE rewrite read as if `is` and `get` also record landmark-mode evidence.
The base lists three read-only actions: `wait` in landmark mode, `is`, and
`get`. Found in review round 2.
The base rule applies to the snapshot helper and forbids the uiautomator dump substitute. The glance bullet dropped both.

#3729 (comment)
The retired gate compared derived tables byte for byte. src/__tests__/command-descriptor-parity.test.ts compares name sets.

#3729 (comment)
The base states the rule as current. The rewrite put it in the past tense and added a sentence that made it read as replaced.
…tense

src/commands/family/types.ts still imports AgentDeviceClient. That import is the reason for the retained Input/Result ownership rule.
@thymikee
thymikee force-pushed the docs/adr-ste100-foundations branch from d7b95ab to 4150630 Compare October 17, 2026 13:15
@thymikee

Copy link
Copy Markdown
Member Author

Rebased onto origin/main (92db564a30) at head 41506304f8; force-pushed with --force-with-lease.

Conflicts (2 files):

  • docs/adr/0006-daemon-rpc-protocol-version.md — main added "Daemon capabilities and quiesce" (feat(daemon): quiesce request that retires an idle daemon atomically #3764, fix(daemon-client): wait for an acknowledged quiesce instead of killing the daemon #3780). Kept main's decision verbatim in meaning and rewrote it in ASD-STE100. Example: main's "A client never signals a daemon that did not accept a quiesce, except an unreachable one it retires deliberately." → "A client never signals a daemon that did not accept a quiesce. The exception is an unreachable daemon that the client retires deliberately." Added three matching "Rules at a glance" bullets (capabilities absence, no-signal rule, force-retire conditions) synced with the body.
  • docs/adr/README.md — kept main's new ADR 0034 row alongside the STE rows for 0031–0033.

Checked every main-sourced hunk sentence-by-sentence against main: no condition, scope word, or modal changed. The 19 unresolved threads are stale-fact notes for the later fact-correction PR; untouched.

Receipt: pnpm install --frozen-lockfile && pnpm build ok; pnpm format clean; check:doc-prose, check:doc-links (incl. website build), check:command-docs pass; pnpm check:affected --run --head 41506304f8 → passed, exactCommit=true.

@thymikee

Copy link
Copy Markdown
Member Author

The conflict from d7b95ab is fixed, and I found no code problems in 4150630. This is a docs-only change, so there is no runtime risk. All 8 checks pass. There are no conflicts. Before this goes to human review, please fix the 0008, 0010 and 0002 statements below, which the open review threads also flag.

These still need a fix: 0008:62 and line 104 still name a "capability" facet, while the amendment at line 10 replaces it with typed runtime declarations under platformExecution, so rename both sites and drop the descriptor.execute mention near line 102. 0010:82 says every error carries a diagnosticId and logPath, but normalized errors can omit them and remote errors swap the path for a URL, so say they carry them when available. 0002:17 says Android planned-touch injection uses one bundled helper, which skips the provider-native path in ADR 0013, so name local ADB or add that exception.

I checked only 0002, 0006, 0008 and 0010 against the code. I did not check the other threads against code, and I did not look at the lower-priority threads. The delta diff includes upstream rebase content, so I could not isolate your changes beyond the two conflict files.

These review threads still apply: 0008 descriptor.execute, 0008 capability facet, 0002 provider-native path and 0010 overstated claim, which is inherited from main. Seven more accuracy threads are unchecked against code: 0006 outcome, 0011 responseIdentity, 0017 literal retention, 0014 empty-result frames, 0005 exemptions, 0005 allowlist and 0017 redaction. None of these are runtime defects.

@thymikee

Copy link
Copy Markdown
Member Author

At 41506304f84b52a51bdf1da64a8f1a503d599438, all required checks pass and the merge state is CLEAN. I read the issue comments, reviews, and inline threads.

The maintainer assigned all 19 unresolved fact threads to docs/adr-stale-facts under #3744. This includes the latest review's ADR 0008 facet and descriptor.execute claims, ADR 0010 diagnostic fields, and ADR 0002 provider-native exception.

After #3729 and #3731 merge, I will verify each claim against the code and include each valid correction in the stale-facts PR. Each thread stays open. I will reply with the PR link when it exists. No text changed in this round.

@thymikee

Copy link
Copy Markdown
Member Author

Thanks. The items left from my review of 4150630 (the ADR 0008 facet and descriptor.execute text, the ADR 0010 diagnostic fields, and the ADR 0002 provider-native exception) are now explicitly deferred to the stale-facts follow-up under #3744, which the maintainer assigned. That settles them for this PR. This is a docs-only change, all checks pass, and there are no conflicts, so it is ready for human review.

@thymikee thymikee added the ready-for-human Valid work that needs human implementation, judgment, or maintainer merge label Oct 17, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-for-human Valid work that needs human implementation, judgment, or maintainer merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant