mirror of
https://github.com/stablyai/orca.git
synced 2026-09-22 00:02:31 +00:00
* test(runtime): capture real agent PTY transcripts before rewriting Antigravity readiness
Antigravity readiness has been written five times against a five-line screen
typed from memory. There is no Antigravity transcript in this repository, so
every attempt was a guess tested against another guess. This adds the recorder,
the protocol and the fixture-driven suite so the sixth attempt can be written
against evidence, and changes no detector logic.
- config/scripts/capture-agent-pty-transcript.mjs records a live agent session
through a real PTY, escapes and wrapping intact. Ctrl-] is consumed by the
recorder and never forwarded, which is the only way to end a capture while a
dialog still owns the screen.
- config/scripts/pty-transcript-secret-scan.mjs finds account identifiers and
credentials, redacts them with same-length placeholders so wrapping survives,
and recognises its own placeholders so a scrubbed file verifies clean.
- src/main/runtime/antigravity-readiness-transcripts.test.ts asserts a verdict
per transcript and skips by name until the transcripts land, with a
doc-coverage ratchet and a guard that a fixture contains escape bytes.
The escape-byte guard exists because the three cursor-agent fixtures carry a
comment claiming they were captured verbatim through Orca, yet contain zero ESC
bytes and zero carriage returns. That comment is corrected here to say what
those files are; the fixtures and the rules built on them are untouched.
* test(runtime): capture real Antigravity transcripts, and pin what they prove
`agy` 1.1.25 turned out to be installed, so the transcripts this scaffold was
built for now exist. Six are recorded from live sessions and committed; the
rest are named as skipped, because reaching them would mean signing the
operator out or deleting their config.
The captures invert the story. On real output the shipped detector refuses a
genuinely ready screen and accepts a live `/model` picker:
- Antigravity paints a block-glyph logo down the left, so the model row never
starts a line. `startsWith('gemini', trimmedStart)` cannot match a real ready
screen, on any account or model. Stripping the logo flips the same screen to
ready, which means a decorative glyph decides readiness today.
- The `/model` picker prints `Gemini 3.x Flash` one per line, at line start, and
a bare `>` composer sits earlier in the tail. Both halves of the rule are
satisfied while a dialog owns the screen.
- For an API-key user the identity row reads `Gemini API key` — no `@`, no
domain — and `AGY_CLI_HIDE_ACCOUNT_INFO=1` removes the row entirely. The
account-row requirement of attempts 4 and 5 can never pass for those users.
- The banner is printed once and never reprinted after a dialog is dismissed, so
`headerIndex` cannot be the ordering anchor.
Four suite cases are pinned as KNOWN DEFECT: they assert what the detector does
so CI stays honest instead of permanently red, and flip to failing the moment
someone fixes it. No detector logic changed.
The recorder gains `--send "<ms>:<text>"` because a dialog capture has to be
driven and an unattended run has no TTY, and the scrub scanner gains a UUID rule
because agy prints a resumable conversation id on exit.
* test(runtime): capture agy mid-turn, and make the scan file reviewable
Answers the busy-frame question a P1 review raised against attempt six, with
two new captures from a live turn.
At the frame level the review is right: a busy frame parks the caret with the
same bytes as an idle one, `CR ESC[2A ESC[2C`, and the only differing row —
`esc to cancel` versus `? for shortcuts` — is erased by that park.
At the retained-tail level it does not reproduce. Each spinner tick is its own
repaint with its own `CR ESC[2A`, two rows higher than the frame's, which
splices the composer away: a live turn's tail ends on `⣟ Generating...`, with
no bare caret to match. A constructed input that keeps the park and edits only
the status text is not faithful, because a live turn has a spinner row
repainting below the composer.
The residual is the gap between a frame park and the next tick, where the tail
does end on the bare caret. Quiescence-gated paths are safe there because ticks
keep arriving; text-only paths are not, and for those the capture supports one
clause: a braille glyph on the last visible line means working. That predicate
already exists here for cursor-agent and should be reused, scoped to the last
line — a first-run transcript prints `⠾ Signing in...` during startup.
Also in this commit, from the same review:
- pty-transcript-secret-scan.mjs held raw 0x00-0x1f bytes in a character class,
so the one file gating real PTY data into history was binary to git and
unreviewable in a diff. It now tests codepoints, which the formatter cannot
fold back into control bytes.
- Pin `src/main/runtime/__fixtures__/*.txt` as -text. A Windows checkout would
otherwise normalise line endings and rewrite the CR bytes that make these
files evidence.
The recorder now stops appending at the stop moment rather than through
shutdown: an agent repaints an idle frame on its way out, which was overwriting
the mid-turn state the capture existed to record.
* test(tooling): allowlist the transcript scan test in the batch-shim ratchet
pty-transcript-secret-scan.test.mjs asserts that the capture recorder routes
an 'agy.cmd' shim through cmd.exe, so the shim literal it names is the
assertion, not a spawn. Fits the existing assert-on-shim-files category.
178 lines
4.6 KiB
Plaintext
178 lines
4.6 KiB
Plaintext
# Build artifacts
|
|
tsconfig.*.tsbuildinfo
|
|
|
|
# TypeScript emit artifacts next to sources (tsc produced these accidentally;
|
|
# real source lives in .ts/.tsx). Hand-authored declaration files are
|
|
# re-included below.
|
|
src/**/*.js
|
|
src/**/*.d.ts
|
|
/electron.vite.config.js
|
|
/electron.vite.config.d.ts
|
|
!src/main/types/hosted-git-info.d.ts
|
|
!src/preload/api-types.d.ts
|
|
!src/preload/index.d.ts
|
|
!src/renderer/src/env.d.ts
|
|
!src/renderer/src/mermaid.d.ts
|
|
!src/types/build-constants.d.ts
|
|
|
|
# Dependencies
|
|
node_modules/
|
|
# Why: the trailing-slash form matches directories only, so a node_modules SYMLINK (how agent
|
|
# worktrees share an install) slipped past a bulk `git add` and got committed — twice.
|
|
node_modules
|
|
|
|
# Build output
|
|
dist/
|
|
dist-electron/
|
|
out/
|
|
/build/
|
|
release/
|
|
native/**/.build/
|
|
|
|
# pnpm
|
|
.pnpm-store/
|
|
package-lock.json
|
|
|
|
# Environment
|
|
.env
|
|
.env.local
|
|
.env.*.local
|
|
|
|
# IDE
|
|
.vscode/
|
|
.idea/
|
|
.serena/
|
|
*.swp
|
|
*.swo
|
|
*~
|
|
|
|
# OS
|
|
# Keep these in step with isOsMetadataSkillEntryName (skill-package-identity.ts): both disk
|
|
# walkers skip a plain file with one of these names, the git-tree producer does not, and
|
|
# ignoring them here is what keeps `git add -A` from committing a stray one.
|
|
*.stackdump
|
|
.DS_Store
|
|
._*
|
|
Thumbs.db
|
|
ehthumbs.db
|
|
desktop.ini
|
|
|
|
# Lint/cache
|
|
.oxlintcache
|
|
|
|
# Logs
|
|
*.log
|
|
*.log.*
|
|
npm-debug.log*
|
|
pnpm-debug.log*
|
|
|
|
# Coverage
|
|
coverage/
|
|
|
|
# Prod release scan output (accidental adds)
|
|
prod-release-scan-*.md
|
|
|
|
# Benchmark run output
|
|
/tests/tools/benchmarks/results/*.json
|
|
/.bench-fixtures/
|
|
|
|
# Temp
|
|
tmp/
|
|
.tmp/
|
|
design-docs/
|
|
.context/
|
|
.atl/
|
|
|
|
# Machine-local agent hook endpoint files may contain auth tokens.
|
|
/agent-hooks/
|
|
|
|
# Local-only design/planning docs (not checked in), including most of docs/reference/.
|
|
# Durable docs that should be tracked must live in one of the allow-listed
|
|
# locations below (assets, readme, STYLEGUIDE, mobile terminal shortcut bar,
|
|
# and the tracked reference docs linked from AGENTS.md / README.md).
|
|
docs/**
|
|
!docs/
|
|
# The deployable docs app is source, not local engineering notes.
|
|
!docs/site/
|
|
!docs/site/**
|
|
!docs/assets/
|
|
!docs/assets/**
|
|
!docs/readme/
|
|
!docs/readme/**
|
|
!docs/STYLEGUIDE.md
|
|
!docs/agent-skill-sharing-implementation-checklist.md
|
|
!docs/mobile-terminal-shortcut-bar.md
|
|
!docs/reference/
|
|
!docs/reference/agent-pty-transcript-capture.md
|
|
!docs/reference/agent-status-store.md
|
|
!docs/reference/antigravity-readiness-evidence.md
|
|
!docs/reference/git-compatibility.md
|
|
!docs/reference/headless-linux-server.md
|
|
!docs/reference/ime-regression-checklist.md
|
|
!docs/reference/linux-glibc-compatibility.md
|
|
!docs/reference/macos-press-and-hold.md
|
|
!docs/reference/orcad-operations.md
|
|
!docs/reference/relay-grace-time-reconfiguration.md
|
|
!docs/reference/windows-cmd-shim-resolution.md
|
|
!docs/reference/windows-daemon-host-relocation.md
|
|
!docs/reference/windows-edr-posture.md
|
|
!docs/reference/windows-process-enumeration.md
|
|
!docs/reference/wsl-runner-verification.md
|
|
!docs/reference/remote-wire-compatibility.md
|
|
!docs/reference/renderer-agent-status-performance.md
|
|
!docs/reference/ssh-execution-boundary.md
|
|
!docs/reference/ssh-host-key-verification.md
|
|
!docs/reference/ssh-reconnect-source-recovery.md
|
|
!docs/reference/windows-setup-shell.md
|
|
!docs/reference/worktree-scan-fingerprint.md
|
|
!docs/reference/wsl-command-execution.md
|
|
!docs/reference/wsl-probe-failure-semantics.md
|
|
!docs/reference/xterm-patch-regeneration.md
|
|
|
|
# Stably CLI (only docs/ are tracked)
|
|
.stably/*
|
|
!.stably/docs/
|
|
.playwright-cli
|
|
.validate-ui-screenshots/
|
|
validation-screenshots/
|
|
.stably-browser
|
|
|
|
# Local scratch notes and PR evidence screenshots (not part of the product).
|
|
/notes/
|
|
/pr-evidence/
|
|
|
|
# Playwright
|
|
test-results/
|
|
playwright-report/
|
|
|
|
# Agent skill installations (machine-local, populated by agent tooling)
|
|
/.claude/skills/
|
|
/.agents/skills/
|
|
/skills-lock.json
|
|
|
|
# Generated Clawpatch state includes machine-local paths and review records.
|
|
/.clawpatch/
|
|
/mobile/.clawpatch/
|
|
|
|
# Agent hook runtime endpoints (machine-local secrets)
|
|
/agent-hooks/
|
|
validation-screenshots/
|
|
|
|
# Localization bootstrap cache (regenerated by bootstrap:*-catalog)
|
|
src/renderer/src/i18n/locales/.zh-catalog-cache.json
|
|
src/renderer/src/i18n/locales/.ko-catalog-cache.json
|
|
src/renderer/src/i18n/locales/.ja-catalog-cache.json
|
|
src/renderer/src/i18n/locales/.es-catalog-cache.json
|
|
src/renderer/src/i18n/locales/.fr-catalog-cache.json
|
|
|
|
# Bench result JSONs are working artifacts
|
|
tests/tools/benchmarks/results/terminal-pipeline-*.json
|
|
|
|
# Old release trees the cross-version wire harness extracts on demand
|
|
tests/e2e/.cross-version-checkouts/
|
|
|
|
# Bundler's install path for the mobile release toolchain (mobile/Gemfile.lock
|
|
# IS committed). Also keeps oxfmt/oxlint, which honor this file, from walking
|
|
# vendored gems.
|
|
/mobile/vendor/
|