gate-46 spec-anchor-existence went 201 → 25 on hermiq (PR #180) by retargeting 176 tags at canonical requirements that already exist under openspec/specs/. The remaining 25 are left dangling on purpose: each would require writing the requirement the tag is supposed to be checked against, and authoring the spec you were sent to check against is how a false claim gets into a spec and stays there.
Measured with ConductionNL/.github@main run-hydra-gates.sh, re-run after every batch (201 → 151 → 116 → 98 → 59 → 32 → 25).
1. Conversation-title deferral is UNSPECIFIED — 20 findings
| tag |
sites |
openspec/changes/session-context-performance/specs/agent-engine-port/spec.md#requirement-the-deferred-title-write-preserves-the-whole-conversation-object |
lib/Service/Engine/ConversationTitleWriter.php (5), tests/Unit/Service/Engine/ConversationTitleWriterTest.php (12) |
…#requirement-conversation-title-generation-does-not-block-the-reply |
lib/Cron/ConversationTitleJob.php (3) |
The change session-context-performance does not exist in this repo — not active, not archived. Canonical openspec/specs/agent-engine-port/spec.md carries only two requirements (no-LLM-API-key, legacy-cleartext-keys-deleted), and grepping all of openspec/ for "conversation title" / "deferred title" / "block the reply" returns nothing.
So there is shipped, tested behaviour — a background title write that must not block the reply and must preserve the whole conversation object — with no requirement anywhere. That is a spec gap, not a tagging gap. It needs an openspec change that states the two requirements, written by someone who owns the behaviour.
2. flow-engine is OpenRegister's spec, not hermiq's — 4 findings
lib/Service/ScheduleService.php:233, lib/Flow/HermiqAgentNode.php:147, src/store/flowEditor.js:895, src/modals/Flow/RunLogModal.vue:128 point at openspec/specs/flow-engine/spec.md#requirement-a-run-records-what-each-node-received-returned-and-logged and #requirement-a-node-type-declares-its-own-form-and-its-own-run-log-actions.
flow-engine belongs to OpenRegister (ADR-065). Hermiq's own flow-authoring / flow-canvas specs are UI-facing and carry no run-recording requirement, so pointing these there would be a false claim.
This needs a fleet decision, not an app fix: either gate-46 learns to resolve a cross-app @spec against the owning app's repo, or the convention gains an explicit cross-app spelling (compare x-external-register for the same problem in the relation dialect — see ADR-062 rule 7). Worth raising on ConductionNL/.github: any app implementing an OpenRegister interface will hit this.
3. Scaffold leftover — 1 finding
src/formFields/EmailField.vue:19 → openspec/changes/scaffold-v2/specs/scaffold-v2/spec.md. A leftover scaffold demo component ("Replace or delete when scaffolding a new app"); no scaffold-v2 change or capability exists in hermiq. Resolves itself when the component goes.
What was NOT done
No requirement was written to point a tag at. No tag was deleted to make the count fall. Where a method carried both a dangling tasks.md#task-N-M tag and a resolving requirement tag naming the same requirement, the pair was collapsed to the single canonical tag — every affected method still carries a @spec.
gate-46 spec-anchor-existencewent 201 → 25 on hermiq (PR #180) by retargeting 176 tags at canonical requirements that already exist underopenspec/specs/. The remaining 25 are left dangling on purpose: each would require writing the requirement the tag is supposed to be checked against, and authoring the spec you were sent to check against is how a false claim gets into a spec and stays there.Measured with ConductionNL/.github@main
run-hydra-gates.sh, re-run after every batch (201 → 151 → 116 → 98 → 59 → 32 → 25).1. Conversation-title deferral is UNSPECIFIED — 20 findings
openspec/changes/session-context-performance/specs/agent-engine-port/spec.md#requirement-the-deferred-title-write-preserves-the-whole-conversation-objectlib/Service/Engine/ConversationTitleWriter.php(5),tests/Unit/Service/Engine/ConversationTitleWriterTest.php(12)…#requirement-conversation-title-generation-does-not-block-the-replylib/Cron/ConversationTitleJob.php(3)The change
session-context-performancedoes not exist in this repo — not active, not archived. Canonicalopenspec/specs/agent-engine-port/spec.mdcarries only two requirements (no-LLM-API-key, legacy-cleartext-keys-deleted), and grepping all ofopenspec/for "conversation title" / "deferred title" / "block the reply" returns nothing.So there is shipped, tested behaviour — a background title write that must not block the reply and must preserve the whole conversation object — with no requirement anywhere. That is a spec gap, not a tagging gap. It needs an
openspecchange that states the two requirements, written by someone who owns the behaviour.2.
flow-engineis OpenRegister's spec, not hermiq's — 4 findingslib/Service/ScheduleService.php:233,lib/Flow/HermiqAgentNode.php:147,src/store/flowEditor.js:895,src/modals/Flow/RunLogModal.vue:128point atopenspec/specs/flow-engine/spec.md#requirement-a-run-records-what-each-node-received-returned-and-loggedand#requirement-a-node-type-declares-its-own-form-and-its-own-run-log-actions.flow-enginebelongs to OpenRegister (ADR-065). Hermiq's ownflow-authoring/flow-canvasspecs are UI-facing and carry no run-recording requirement, so pointing these there would be a false claim.This needs a fleet decision, not an app fix: either gate-46 learns to resolve a cross-app
@specagainst the owning app's repo, or the convention gains an explicit cross-app spelling (comparex-external-registerfor the same problem in the relation dialect — see ADR-062 rule 7). Worth raising onConductionNL/.github: any app implementing an OpenRegister interface will hit this.3. Scaffold leftover — 1 finding
src/formFields/EmailField.vue:19→openspec/changes/scaffold-v2/specs/scaffold-v2/spec.md. A leftover scaffold demo component ("Replace or delete when scaffolding a new app"); noscaffold-v2change or capability exists in hermiq. Resolves itself when the component goes.What was NOT done
No requirement was written to point a tag at. No tag was deleted to make the count fall. Where a method carried both a dangling
tasks.md#task-N-Mtag and a resolving requirement tag naming the same requirement, the pair was collapsed to the single canonical tag — every affected method still carries a@spec.