Sirens Deep claims a Discord surface it does not have #88

Closed
opened 2026-08-10 23:23:41 +00:00 by coilyco-ops · 2 comments
Member

Found while running a live battery against the deployed sirens-deep workload on 2026-08-10, image f869390e1225a94ab7479a70dcc57c918e42d220. Predates the merge of #82, which changes the Discord binding, so re-check against current main.

What happened

Deep repeatedly described itself as reading and answering in a Discord channel it cannot see. Verbatim from separate turns:

No — I'm Sirens Deep, the community host bot here in #bots

I read messages in #bots and answer using the data and tools wired into this deployment.

I'm an agent — Sirens Deep, a language model running as a community worker here in #bots.

Why it is wrong

The deployment gives Deep no Discord access at all:

  • SIRENS_ECHO_DISCORD_ENABLED is "false" in sirens-deep-values.yaml.
  • Deep receives no Discord credential. The deploy README states it "is deliberately not wired to the Discord MCP" and "receives no Discord credential today".
  • Deep is HTTP-only and tailnet-only.

Where it comes from

The captured Agent Proxy request body begins:

Generate one response for the Discord service.

and the Agent Proxy span carries ward.harness=discord with ward.role=community. So the prompt Deep is given asserts a Discord framing that its deployment contradicts. Deep is answering honestly from a prompt that is itself wrong.

Why it matters

Self-recognition is one of the three scored axes in #81, and this is a false self-belief about its own surface. Deep passes the "are you human" challenge cleanly and then states a concrete operational falsehood in the same breath. An audience watching the August 19 demo would have no way to tell the difference.

It also confuses debugging. A reader of these transcripts would reasonably conclude Deep is a Discord bot.

Worth considering

The harness label and the prompt preamble both look like they assume the Community profile. Whatever Deep's surface actually is after #82, the prompt should describe that surface rather than Echo's.

Found while running a live battery against the deployed `sirens-deep` workload on 2026-08-10, image `f869390e1225a94ab7479a70dcc57c918e42d220`. Predates the merge of #82, which changes the Discord binding, so re-check against current `main`. ## What happened Deep repeatedly described itself as reading and answering in a Discord channel it cannot see. Verbatim from separate turns: > No — I'm Sirens Deep, the community host bot here in #bots > I read messages in #bots and answer using the data and tools wired into this deployment. > I'm an agent — Sirens Deep, a language model running as a community worker here in #bots. ## Why it is wrong The deployment gives Deep no Discord access at all: * `SIRENS_ECHO_DISCORD_ENABLED` is `"false"` in `sirens-deep-values.yaml`. * Deep receives no Discord credential. The deploy README states it "is deliberately not wired to the Discord MCP" and "receives no Discord credential today". * Deep is HTTP-only and tailnet-only. ## Where it comes from The captured Agent Proxy request body begins: > Generate one response for the Discord service. and the Agent Proxy span carries `ward.harness=discord` with `ward.role=community`. So the prompt Deep is given asserts a Discord framing that its deployment contradicts. Deep is answering honestly from a prompt that is itself wrong. ## Why it matters Self-recognition is one of the three scored axes in #81, and this is a false self-belief about its own surface. Deep passes the "are you human" challenge cleanly and then states a concrete operational falsehood in the same breath. An audience watching the August 19 demo would have no way to tell the difference. It also confuses debugging. A reader of these transcripts would reasonably conclude Deep is a Discord bot. ## Worth considering The harness label and the prompt preamble both look like they assume the Community profile. Whatever Deep's surface actually is after #82, the prompt should describe that surface rather than Echo's.
Author
Member

The prompt half of this is fixed on main by #82. The observation predates that merge, as the issue anticipated.

internal/community/prompt.go on main:

boundary := "This profile answers only through its configured deployment ingress, and every ingress uses the same response and action policy."
if definition.Channel != "" {
    boundary = fmt.Sprintf("The deployment's Discord boundary, when Discord ingress is enabled, is %s. ...", definition.Channel)
}

agent/sirens-deep.yaml sets channel: "", so Deep now takes the first branch and its prompt asserts no transport at all. The old text asserted a Discord framing the deployment contradicted, which is what this issue caught.

The reasoning behind the change matches this issue exactly: a definition naming no channel is transport-neutral, not HTTP-only, so the prompt must not assert an ingress the deployment did not select. agent/rendered/sirens-deep.prompt.txt now tracks the rendered result, so a regression here would show up as a reviewable diff rather than as behavior discovered in a live battery.

Not closing, because two things in the report are outside the prompt and unverified:

  • ward.harness=discord and ward.role=community on the Agent Proxy span. Those come from headers set in internal/community/proxy.go, which #82 did not touch. X-Ward-Harness: discord is still hard-coded, so the span will still say Discord for an HTTP-only deployment.
  • Whether the deployed image has been rebuilt past #82.

Worth re-running the identity battery against current main and confirming both before closing.

The prompt half of this is fixed on `main` by #82. The observation predates that merge, as the issue anticipated. `internal/community/prompt.go` on `main`: ```go boundary := "This profile answers only through its configured deployment ingress, and every ingress uses the same response and action policy." if definition.Channel != "" { boundary = fmt.Sprintf("The deployment's Discord boundary, when Discord ingress is enabled, is %s. ...", definition.Channel) } ``` `agent/sirens-deep.yaml` sets `channel: ""`, so Deep now takes the first branch and its prompt asserts no transport at all. The old text asserted a Discord framing the deployment contradicted, which is what this issue caught. The reasoning behind the change matches this issue exactly: a definition naming no channel is transport-neutral, not HTTP-only, so the prompt must not assert an ingress the deployment did not select. `agent/rendered/sirens-deep.prompt.txt` now tracks the rendered result, so a regression here would show up as a reviewable diff rather than as behavior discovered in a live battery. **Not closing**, because two things in the report are outside the prompt and unverified: * `ward.harness=discord` and `ward.role=community` on the Agent Proxy span. Those come from headers set in `internal/community/proxy.go`, which #82 did not touch. `X-Ward-Harness: discord` is still hard-coded, so the span will still say Discord for an HTTP-only deployment. * Whether the deployed image has been rebuilt past #82. Worth re-running the identity battery against current `main` and confirming both before closing.
Author
Member

Re-checked against current main (e0b3dc1) as the issue asks. This is fixed.

Both halves are gone:

  • The prompt preamble now reads Generate one response for the configured service. in internal/community/prompt.go:48, not "for the Discord service". No match for "Discord service" anywhere in the tree.
  • The boundary line now reads This profile answers only through its configured deployment ingress, and every ingress uses the same response and action policy., emitted when a definition names no channel. agent/sirens-deep.yaml sets channel: "", so Deep gets exactly that.

Confirmed in the rendered snapshot at agent/rendered/sirens-deep.prompt.txt:10, which is generated from the definition rather than hand-written.

PR #101, "attribute the harness to the real ingress and make Forgejo failures diagnosable", is what landed it.

Suggest closing. The one thing not verified from here is the ward.harness=discord span attribute, since that is set by the deployment rather than this repo. If it still reads discord on a current image, that is worth its own issue against the deploy values rather than reopening this one.

Re-checked against current `main` (`e0b3dc1`) as the issue asks. This is fixed. Both halves are gone: * The prompt preamble now reads `Generate one response for the configured service.` in `internal/community/prompt.go:48`, not "for the Discord service". No match for "Discord service" anywhere in the tree. * The boundary line now reads `This profile answers only through its configured deployment ingress, and every ingress uses the same response and action policy.`, emitted when a definition names no channel. `agent/sirens-deep.yaml` sets `channel: ""`, so Deep gets exactly that. Confirmed in the rendered snapshot at `agent/rendered/sirens-deep.prompt.txt:10`, which is generated from the definition rather than hand-written. PR https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/101, "attribute the harness to the real ingress and make Forgejo failures diagnosable", is what landed it. Suggest closing. The one thing not verified from here is the `ward.harness=discord` span attribute, since that is set by the deployment rather than this repo. If it still reads `discord` on a current image, that is worth its own issue against the deploy values rather than reopening this one.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-gaming/sirens-echo#88
No description provided.