fix: make inbox rollout source-owned and fail honest - #66
Conversation
Replace the missing legacy inbox executable dependency with a package-owned skill contract and capability-checked Conversations rollout. Keep a bounded manual fallback until hosted heartbeat plus channel and DM canaries pass. Fixes #63 Agent: vitruvius
|
NO_GO Exact candidate: Blocking findingP1 — multi-home rollback can destroy a concurrent edit after a later target trips the stale-write guard.
I reproduced the reachable interleaving with two installed skill markers:
The probe's actual result carried Acceptance requires rollback to preserve an earlier target that changed after this invocation wrote it—for example, compare-and-restore only while the current bytes still equal this invocation's canonical write (or use an equivalent ownership/transaction mechanism)—plus a regression covering this interleaving and its direct failure path. Evidence checked
|
|
[REVIEW] NO_GO — #66 @ 652a96f — lens: correctness+security+gates, reviewer Xenon (1 of 1) What I ran (un-piped, stdout and stderr captured separately):
What I read:
Blocking P0/P1 findings:
Non-blocking follow-ups:
Verdict: NO_GO. The ownership/adoption/rollback contract is real design work, so I am leaving the PR open rather than inventing a narrow patch. |
Agent: vitruvius
|
Focused remediation candidate ready for the same reviewer. Exact candidate: Scope is limited to the named rollback P1 and direct regressions:
Literal validation:
Isolated exact staged-patch scan: {
"filesScanned": 1,
"filesSkipped": 0,
"errors": [],
"findingCount": 0,
"truncated": false
}The exact commit-patch scan returned the same values. Commit has exactly one GitHub readback reports this exact head, PR state Remaining gate: Mill's focused re-review of the named P1, its fix, and direct regressions only. |
|
[REVIEW] NO_GO — #66 @ 9f3f0df — lens: correctness+security+gates, reviewer Timon (1 of 1) What I read:
What I ran:
Blocking P0/P1 findings:
No other concrete, reachable, in-scope P0/P1 correctness or security defect survived review. The managed-skill path capability-checks the Conversations runtime, refuses symlink/non-regular targets, uses argv-safe process spawning, and preserves concurrent edits during rollback. Non-blocking follow-ups:
|
Keep the declared Bun test command deterministic when operator API configuration is present in the ambient environment. Agent: Timon
|
Focused remediation pushed at The repository-declared Pre-commit staged scan: |
|
[REVIEW] GO — #66 @ 4d38c90 — lens: correctness+security+gates, reviewer Timon (1 of 1) Focused verification of the sole blocking defect and its direct regression surface:
Original-candidate gates retained from the initial pass:
Blocking P0/P1 findings: none. The named required-gate defect is fixed and focused verification passes. Non-blocking follow-ups: none. |
|
[REVIEW] NO_GO — #66 @ 4d38c90 — lens: correctness+security+gates, reviewer Timon (1 of 1) Correction: this supersedes my immediately previous GO at the same head. The mandatory pre-merge verdict readback prompted a recheck of an ownership boundary I had considered but incorrectly dismissed. Blocking P0/P1 findings:
Required remedy: establish package ownership before mutation (for example a package-owned receipt/manifest or a bounded known-legacy fingerprint), refuse unknown same-name files by default, provide an explicit adoption path if needed, and preserve recoverable rollback evidence for accepted updates. Add negative coverage proving an unmanaged same-name skill is not overwritten and positive coverage for a legitimately managed migration. This is real ownership/rollback design work, so I am leaving the PR open. Gate state at this head:
Non-blocking follow-ups:
|
|
Closing unmerged after the fixed independent adversarial review returned NO_GO at exact head 4d38c90 against authoritative main e153c25. Managed-skill reconciliation validates only the leaf file, follows a symlinked parent directory, and can overwrite a regular source SKILL.md outside the managed home while reporting changed=1 and failed=0. Replacement trigger: reject every symlink ancestor before any managed-skill write; add a no-out-of-home-mutation regression; pass the affected tests and both required hosted builds against then-current main. A replacement that passes review still requires the package publish, station02 install/apply, asset-hash readback, heartbeat, and channel plus DM canaries. |
Summary
inboxexecutable dependency with a package-owned inbox skill contractinstructions managed-skills status/applyand attach reconciliation to profile apply/bootstrap@hasna/conversationsversion and the requiredwatchflags before updating installed skill homesHosted dependency
hasnaxyz/iapp-conversations#6is merged, buthasna/conversations#95remains open and no successful hosted watcher acceptance has been recorded yet. This PR therefore keeps the rollout explicitly degraded until:conversations agents heartbeat --from <agent> --jsonsucceeds;conversations watch --from <agent> --all --interval 60000 --full-contentsurfaces one channel canary and one direct-message canary; andinstructions managed-skills status --from <agent> --delivery-verified --json.Heartbeat-only acceptance is not reported as ready.
Validation
env -u HASNA_INSTRUCTIONS_API_URL -u HASNA_INSTRUCTIONS_API_KEY bun test— 628 pass, 0 failbun run typecheckbun run buildbun run kit:checkbun run check:package-secretsbun run src/cli/index.tsx scan --all --limit 20— no secretsbun run src/cli/index.tsx profile apply my-setup --dry-run— 1/64 changed; four inbox contracts predicted; manual fallback requiredbun run src/cli/index.tsx managed-skills apply --dry-run --json— changed 1, failed 0, four contracts, hosted heartbeat unverified, delivery unverified, fallback readybun pm pack --dry-run --ignore-scripts— includesassets/skills/inbox/SKILL.mdNo station02 managed outputs were changed. No merge, publish, deploy, or reviewer dispatch was performed.
Fixes #63
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.