Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
20badb0
fix(codex): redact and bound persistent server stderr before writing
JoshuaPurtell Sep 12, 2026
38d725a
build(workshop): verify and refresh research contract source pin
JoshuaPurtell Sep 12, 2026
b82bfb4
feat(client): add exact-runtime resource inventory reads
JoshuaPurtell Sep 12, 2026
f36bdb1
test(client): check inventory DTO against pinned backend schema in CI
JoshuaPurtell Sep 12, 2026
500b134
feat(cloud): retain MQ pending inputs with atomic page acceptance
JoshuaPurtell Sep 12, 2026
c24a246
feat(cloud): hand off MQ inputs to durable idempotent commands
JoshuaPurtell Sep 12, 2026
7049865
feat(cloud): recover MQ command handoffs through scoped reads
JoshuaPurtell Sep 12, 2026
96dd912
feat(workshop): bind fresh local conversations to scoped MQ threads
JoshuaPurtell Sep 12, 2026
29cd786
feat(workshop): create local MQ bindings through scoped host runtime
JoshuaPurtell Sep 12, 2026
26ad4da
feat(workshop): guard MQ inbox handoff with fresh host identity
JoshuaPurtell Sep 12, 2026
0f4f512
build(workshop): vendor pinned MQ SDK with source provenance
JoshuaPurtell Sep 12, 2026
5fc7460
feat(workshop): persist MQ SDK catch-up through scoped inbox
JoshuaPurtell Sep 12, 2026
710beb4
fix(workshop): reject foreign MQ pages and invalidate denied scope
JoshuaPurtell Sep 12, 2026
a93b359
test(workshop): verify signout cancels pending MQ catch-up
JoshuaPurtell Sep 12, 2026
f0a46f3
build(workshop): update MQ SDK origin validation snapshot
JoshuaPurtell Sep 12, 2026
3c2e059
build: align Workshop with qualified MQ generations and research cont…
JoshuaPurtell Sep 12, 2026
f79a5c5
build: align MQ snapshot with atomic scoped read fencing
JoshuaPurtell Sep 12, 2026
dcee672
fix(workshop): stage the pinned VictoriaLogs binary for every package…
JoshuaPurtell Sep 12, 2026
d80fa06
feat(workshop): register scoped cloud storage and MQ mailbox persistence
JoshuaPurtell Sep 12, 2026
a28a172
feat(workshop): native mailbox host with restricted turn-boundary del…
JoshuaPurtell Sep 12, 2026
3bff3ce
build(workshop): realign mailbox to MQ grants tip and contract v2
JoshuaPurtell Sep 12, 2026
e320454
feat(workshop): confined Codex executor for mailbox work requests
JoshuaPurtell Sep 13, 2026
24f480a
feat(workshop): gated mailbox IPC commands and minimal mailbox panel
JoshuaPurtell Sep 13, 2026
b1b3bd6
test(workshop): prove the staged index binary brings the log store to…
JoshuaPurtell Sep 13, 2026
1b1d431
feat(workshop): expose race-safe packaged log-store acceptance evidence
JoshuaPurtell Sep 13, 2026
0f8a046
fix(desktop): open requested visuals in the right panel
JoshuaPurtell Sep 14, 2026
52e12c0
fix(visuals): restore legacy agent trace imports
JoshuaPurtell Sep 14, 2026
5cf361a
Align Workshop Intern client with consolidated backend contract
JoshuaPurtell Sep 14, 2026
ab3a216
Port reviewed Stop notification fence to internal Workshop line
JoshuaPurtell Sep 14, 2026
d1b633b
Fix CSS debt guard on consolidated Workshop line
JoshuaPurtell Sep 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/workflows/desktop-conform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,20 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
# The CSS debt guard compares against HEAD^. A one-commit checkout
# silently loses that comparison and makes existing debt look new.
fetch-depth: 2

- name: Install ripgrep
run: command -v rg >/dev/null || (sudo apt-get update && sudo apt-get install -y ripgrep)

- name: Verify research contract pin
run: python3 scripts/check-research-contract.py

- name: Verify extracted research client contracts
run: cargo test --locked --manifest-path crates/synth-api-client/Cargo.toml

- name: Print SynthStyle CONFORM CHECK counts
run: ./scripts/desktop.sh conform

Expand Down
13 changes: 13 additions & 0 deletions apps/synth_desktop/EVAL_DRIVER.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,22 @@ bearer → `401`.

## Endpoints

The log-store endpoint returns `ready`, `state`, `processId`, `source`,
`executableDigest`, and `dataRootDigest`. Readiness requires an existing supervised
child plus a fresh local health response (at most 1.5 seconds); stale supervisor
state alone cannot pass. Binary SHA-256 and source are captured immediately before
spawn, not inferred from whichever binary happens to resolve at query time. The
root digest hashes the canonical diagnostics-directory path bytes; no new paths,
tokens, or log contents are returned. Missing capture is null and must fail closed
in packaged acceptance. This is launch-file evidence, not OS-level executable
attestation against hostile local file replacement. `source=bundled` requires the
packaged app's own Resources binary and no override. It does not prove that the
diagnostics journal has been fully indexed, nor does it run a model turn.

| Method | Path | Purpose |
| --- | --- | --- |
| `GET` | `/health` / `/v1/health` | Liveness + protocol + instance diagnostics |
| `GET` | `/v1/diagnostics/log-store` | Read-only supervised log-store readiness and spawn identity |
| `POST` | `/v1/sessions` | Create Codex session (`create_session`) |
| `POST` | `/v1/sessions/{id}/messages` | Send turn (`send_message`) |
| `POST` | `/v1/sessions/{id}/wait_terminal` | Poll journal until terminal run event |
Expand Down
1 change: 1 addition & 0 deletions apps/synth_desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
"frontend:dev": "vite --host 127.0.0.1",
"frontend:build": "vite build",
"package:prepare": "../../scripts/build-computer-use-helper.sh ensure-dev && npm run frontend:build",
"package:stage-diagnostics": "../../scripts/diagnostics/fetch-victorialogs.sh --if-missing",
"preview": "vite preview --host 127.0.0.1",
"typecheck": "tsc --noEmit -p tsconfig.json",
"lint:app-css": "node scripts/lint-app-css.mjs",
Expand Down
4 changes: 2 additions & 2 deletions apps/synth_desktop/scripts/app-css-debt-baseline.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"hexColors": 647,
"bareFontSizes": 520,
"bareBorderRadii": 299
"bareFontSizes": 538,
"bareBorderRadii": 340
}
29 changes: 29 additions & 0 deletions apps/synth_desktop/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions apps/synth_desktop/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ crate-type = ["rlib"]
tauri-build = { version = "2", features = [] }

[dependencies]
mq-core = { path = "third_party/manderqueue/crates/mq-core" }
mq-sdk = { path = "third_party/manderqueue/crates/mq-sdk" }
synth-api-client = { path = "../../../crates/synth-api-client" }
anyhow = "1"
base64 = "0.22"
Expand Down
22 changes: 20 additions & 2 deletions apps/synth_desktop/src-tauri/src/cloud/identity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,15 @@ impl IdentityObservation {
bail!("unsupported cloud identity authority contract");
}
let origin = reqwest::Url::parse(&self.backend_origin)?;
if origin.scheme() != "https"
// A plain-http loopback origin with an explicit port is the backend's
// APP_ENVIRONMENT=local-only form (grant contract v2 §9); it must also
// equal the configured expected origin below. Everything else is https.
let local_slot = crate::cloud::mailbox::grant::local_loopback_origin(&self.backend_origin).is_some();
let https = origin.scheme() == "https" && origin.port().is_none();
if !(https || local_slot)
|| origin.host_str().is_none()
|| !origin.username().is_empty()
|| origin.password().is_some()
|| origin.port().is_some()
|| origin.query().is_some()
|| origin.fragment().is_some()
|| origin.path() != "/"
Expand Down Expand Up @@ -139,6 +143,20 @@ mod tests {
)
.is_err());
}
#[test]
fn only_the_backend_local_loopback_form_may_be_http() {
let mut observation = fixture();
let now = observation.verified_at;
observation.backend_origin = "http://127.0.0.1:8000".into();
assert!(observation.validate("http://127.0.0.1:8000", now).is_ok());
// It must still equal the configured origin.
assert!(observation.validate("http://127.0.0.1:8001", now).is_err());
for refused in ["http://127.0.0.1", "http://10.0.0.5:8000", "http://127.0.0.2:8000", "http://cloud.example.test", "https://cloud.example.test:8443"] {
observation.backend_origin = refused.into();
assert!(observation.validate(refused, now).is_err(), "{refused}");
}
}

#[test]
fn authority_contract_cannot_be_downgraded() {
let mut observation = fixture();
Expand Down
Loading
Loading