Files
PaperClipAI/server/src
Nicky LeachandPaperclip 4d8770f6dd test(plugins): assert runtime delivery by event identity (#16871)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Plugins receive committed runtime events without polling.
> - The delivery test checks that an independent writer is visible after
commit.
> - Startup baseline callbacks can still arrive during that transaction.
> - A total callback count mixes startup work with the event under test.
> - This pull request checks the transaction's specific event ID
instead.

## Linked Issues or Issue Description

**What happened?**

The runtime-delivery test failed during #16604 verification. It expected
one callback before an independent transaction committed, but received
two. The test waits for a total callback count derived before startup
baseline delivery is known to be complete. An older baseline event can
arrive during the transaction and fail that assertion.

The failing test and delivery implementation are unchanged from master.
This PR isolates the test-only correction from #16604.

**Expected behavior**

The event created by the independent transaction is absent from
delivered callbacks before commit. That exact event arrives after
commit. Other committed startup callbacks can arrive at any time.

**Steps to reproduce**

1. Start lifecycle delivery with startup events still pending.
2. Begin an independent agent update after the expected callback count
is first reached.
3. Let a baseline callback arrive before that transaction commits.
4. The old global-count assertion fails even though the transaction's
event is not delivered early.

**Additional context**

Scoped maintenance follow-up for #16604. No runtime behavior or feature
files change here. #16605 remains a draft without review requests.

## What Changed

- Read the new journal event ID inside the independent writer's
transaction.
- Assert that this ID is not delivered before commit.
- Wait for that same ID after commit and check its company, resource,
and type.
- Remove the total callback-count assumption.
- Wait for the company startup baseline, its acknowledgments, and
coordinator idleness. Flush earlier listener notifications with a
barrier, then wait for that barrier wake to settle before the
independent write.

## Verification

- The earlier full feature run passed 821/822 tests and failed this
exact count assertion with two callbacks instead of one. That failure
remains recorded in #16604.
- The failing test file is byte-identical on the reviewed feature head
and master. Neither the profile-replacement correction nor this PR
changes the delivery implementation.
- `pnpm exec vitest run
server/src/__tests__/agent-runtime-hooks.test.ts`: all 17 tests pass
with the event-ID assertion.
- `pnpm --filter @paperclipai/server typecheck`: passed.
- Standard Greptile initially returned 4/5: startup delivery could still
hide a missing independent wake. The correction adds observable startup
acknowledgment, listener flushing, and coordinator idleness. All 17
runtime-hook tests and server typechecking pass with it. A negative
control drops runtime notifications while forwarding the barrier and
fails the after-commit delivery assertion; startup work cannot mask that
loss.
- `git diff --check` and the full PR diff scan for secrets and personal
data passed.
- Full local build and repository-wide tests were not run for this
test-only correction. At `714a74bf0991617c9ad85ce17bae22c533d1ed22`,
hosted CI run 39295664656 passed: all 55 checks succeeded, with two
optional Storybook checks skipped. Standard Greptile returned 5/5, the
security scan passed, all review threads are resolved, and the branch is
mergeable against master. The tests use real PostgreSQL and controlled
plugin callbacks; live provider behavior is not qualified.

## Risks

Test-only change. The commit boundary assertion remains: the new event
ID must be absent inside the transaction and present after commit.
Existing startup callbacks no longer count as early delivery of a
different event. Runtime notification and retry behavior are unchanged.

## Model Used

OpenAI Codex, GPT-6, with reasoning, repository inspection, code
execution, and testing. The exact deployment model ID and context window
are not exposed in this session.

## Checklist

- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have searched GitHub for duplicate or related PRs and linked
them above
- [x] I have either (a) linked existing issues with `Fixes: #` / `Closes
#` / `Refs #` OR (b) described the issue in-PR following the relevant
issue template
- [x] I have not referenced internal/instance-local Paperclip issues or
links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip`
URLs)
- [x] My branch name describes the change (e.g. `docs/...`, `fix/...`)
and contains no internal Paperclip ticket id or instance-derived details
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green
- [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
- [x] I will address all Greptile and reviewer comments before
requesting merge

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-10-19 10:55:37 -07:00
..
…
…
…
…