instar 1.3.1219 → 1.3.1221
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +25 -2
- package/dist/commands/server.js.map +1 -1
- package/dist/core/AspAuthorshipJoin.d.ts +1 -0
- package/dist/core/AspAuthorshipJoin.d.ts.map +1 -1
- package/dist/core/AspAuthorshipJoin.js +9 -1
- package/dist/core/AspAuthorshipJoin.js.map +1 -1
- package/dist/core/AspInboundClassifier.d.ts +22 -0
- package/dist/core/AspInboundClassifier.d.ts.map +1 -1
- package/dist/core/AspInboundClassifier.js +33 -0
- package/dist/core/AspInboundClassifier.js.map +1 -1
- package/dist/core/ForwardedTopicContext.d.ts +3 -0
- package/dist/core/ForwardedTopicContext.d.ts.map +1 -1
- package/dist/core/ForwardedTopicContext.js +2 -1
- package/dist/core/ForwardedTopicContext.js.map +1 -1
- package/dist/core/MessagingToneGate.d.ts.map +1 -1
- package/dist/core/MessagingToneGate.js +5 -1
- package/dist/core/MessagingToneGate.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +9 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +37 -3
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/SessionManager.d.ts +7 -0
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +2 -2
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/StageBActivationGate.d.ts +31 -1
- package/dist/core/StageBActivationGate.d.ts.map +1 -1
- package/dist/core/StageBActivationGate.js +69 -10
- package/dist/core/StageBActivationGate.js.map +1 -1
- package/dist/core/aspClassifierRef.d.ts +14 -0
- package/dist/core/aspClassifierRef.d.ts.map +1 -0
- package/dist/core/aspClassifierRef.js +8 -0
- package/dist/core/aspClassifierRef.js.map +1 -0
- package/dist/data/stageBCertifiedSet.d.ts +271 -0
- package/dist/data/stageBCertifiedSet.d.ts.map +1 -0
- package/dist/data/stageBCertifiedSet.js +366 -0
- package/dist/data/stageBCertifiedSet.js.map +1 -0
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/messaging/TelegramAdapter.d.ts +2 -0
- package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
- package/dist/messaging/TelegramAdapter.js.map +1 -1
- package/dist/messaging/shared/signedInbound.d.ts +59 -0
- package/dist/messaging/shared/signedInbound.d.ts.map +1 -0
- package/dist/messaging/shared/signedInbound.js +67 -0
- package/dist/messaging/shared/signedInbound.js.map +1 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +2 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/routes.d.ts +2 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +21 -8
- package/dist/server/routes.js.map +1 -1
- package/dist/types/pipeline.d.ts +1 -1
- package/dist/types/pipeline.d.ts.map +1 -1
- package/dist/types/pipeline.js +13 -10
- package/dist/types/pipeline.js.map +1 -1
- package/package.json +1 -1
- package/scripts/stage-b-certified-fingerprint.mjs +177 -0
- package/scripts/verify-codex-stage-b-release-evidence.mjs +9 -0
- package/src/data/builtin-manifest.json +65 -65
- package/src/data/stageBCertifiedSet.ts +367 -0
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/upgrades/1.3.1220.md +87 -0
- package/upgrades/1.3.1221.md +24 -0
- package/upgrades/side-effects/asp-signed-inbound-label.md +117 -0
- package/upgrades/side-effects/file-path-advisory-default.md +82 -0
- package/upgrades/side-effects/stage-b-evidence-code-binding.md +93 -0
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage-B certified-set manifest (spec: stage-b-evidence-code-binding).
|
|
3
|
+
* Maintained ONLY by scripts/stage-b-certified-fingerprint.mjs --write, which
|
|
4
|
+
* refuses to rebind old evidence onto changed code. Every closure member is
|
|
5
|
+
* either certified (fingerprinted) or excluded with a written reason; the
|
|
6
|
+
* --check partition is fail-closed for anything new.
|
|
7
|
+
*/
|
|
8
|
+
export const STAGE_B_CERTIFIED_SET = {
|
|
9
|
+
"roots": [
|
|
10
|
+
"src/core/InboundDeliveryStore.ts",
|
|
11
|
+
"src/core/CodexDeliveryObserver.ts",
|
|
12
|
+
"src/core/CodexComposerAdapter.ts",
|
|
13
|
+
"src/core/CodexLifecycleProductionComposition.ts",
|
|
14
|
+
"src/core/StageBStartupReadiness.ts"
|
|
15
|
+
],
|
|
16
|
+
"certified": [
|
|
17
|
+
"src/core/CodexComposerAdapter.ts",
|
|
18
|
+
"src/core/CodexDeliveryObserver.ts",
|
|
19
|
+
"src/core/CodexLifecycleProductionComposition.ts",
|
|
20
|
+
"src/core/InboundDeliveryStore.ts",
|
|
21
|
+
"src/core/SessionRecoveryChannel.ts",
|
|
22
|
+
"src/core/SessionRecoveryConsumer.ts",
|
|
23
|
+
"src/core/StageBStartupReadiness.ts"
|
|
24
|
+
],
|
|
25
|
+
"excluded": [
|
|
26
|
+
{
|
|
27
|
+
"file": "src/core/AccountFollowMeGrants.ts",
|
|
28
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"file": "src/core/AccountFollowMeSpendSlice.ts",
|
|
32
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"file": "src/core/AnthropicSubscriptionRouter.ts",
|
|
36
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"file": "src/core/CircuitBreakingIntelligenceProvider.ts",
|
|
40
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"file": "src/core/ClaudeCliIntelligenceProvider.ts",
|
|
44
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"file": "src/core/CodexCliIntelligenceProvider.ts",
|
|
48
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"file": "src/core/Config.ts",
|
|
52
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"file": "src/core/CredentialAuditEmit.ts",
|
|
56
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"file": "src/core/CredentialWriteFunnel.ts",
|
|
60
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"file": "src/core/GateSignalDetectors.ts",
|
|
64
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"file": "src/core/GeminiCliIntelligenceProvider.ts",
|
|
68
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"file": "src/core/InFlightSyncOpMarker.ts",
|
|
72
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"file": "src/core/InstrumentAssessment.ts",
|
|
76
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"file": "src/core/InteractivePoolIntelligenceProvider.ts",
|
|
80
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"file": "src/core/JargonDetector.ts",
|
|
84
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"file": "src/core/JudgmentProvenanceLog.ts",
|
|
88
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"file": "src/core/LlmCircuitBreaker.ts",
|
|
92
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"file": "src/core/MessagingToneGate.ts",
|
|
96
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"file": "src/core/ModelTierEscalation.ts",
|
|
100
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"file": "src/core/OAuthRefresher.ts",
|
|
104
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"file": "src/core/PhysicalEffectLock.ts",
|
|
108
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"file": "src/core/PiCliIntelligenceProvider.ts",
|
|
112
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"file": "src/core/ProjectRoundLock.ts",
|
|
116
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"file": "src/core/SafeFsExecutor.ts",
|
|
120
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"file": "src/core/SafeGitExecutor.ts",
|
|
124
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"file": "src/core/SecretMigrator.ts",
|
|
128
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"file": "src/core/SecretStore.ts",
|
|
132
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"file": "src/core/SessionLivenessOracle.ts",
|
|
136
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"file": "src/core/SourceTreeGuard.ts",
|
|
140
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"file": "src/core/SpawnCapIntelligenceProvider.ts",
|
|
144
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"file": "src/core/SqliteRegistry.ts",
|
|
148
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"file": "src/core/StageBActivationGate.ts",
|
|
152
|
+
"reason": "release policy, not canaried delivery behavior; binding it would force irrelevant two-hour canaries for gate-policy fixes (incl. the code-binding fix itself), and it adds no adversarial protection since the manifest is equally PR-editable"
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"file": "src/core/canonicalFeedback.ts",
|
|
156
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"file": "src/core/claudeForbiddenGuard.ts",
|
|
160
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"file": "src/core/decisionQualityTypes.ts",
|
|
164
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"file": "src/core/deferral-floor.ts",
|
|
168
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"file": "src/core/devAgentGate.ts",
|
|
172
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"file": "src/core/durableSecretScrub.ts",
|
|
176
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"file": "src/core/dynamicMcpConfig.ts",
|
|
180
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"file": "src/core/frameworkFacts.ts",
|
|
184
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"file": "src/core/hostSemaphoreCore.ts",
|
|
188
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"file": "src/core/hostSpawnSemaphore.ts",
|
|
192
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"file": "src/core/inboundQueueConfig.ts",
|
|
196
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"file": "src/core/intelligenceProviderFactory.ts",
|
|
200
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"file": "src/core/internal-id-leak.ts",
|
|
204
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"file": "src/core/machineCoherenceAdvert.ts",
|
|
208
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"file": "src/core/machineCoherenceManifest.ts",
|
|
212
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"file": "src/core/machineServesChannel.ts",
|
|
216
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"file": "src/core/models.ts",
|
|
220
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"file": "src/core/seamlessnessConfig.ts",
|
|
224
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"file": "src/core/self-stop-floor.ts",
|
|
228
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"file": "src/core/types.ts",
|
|
232
|
+
"reason": "universal shared type module; changes routinely for every subsystem"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"file": "src/data/codexStageBReleaseEvidence.ts",
|
|
236
|
+
"reason": "the evidence itself; bound by artifactDigest, fingerprinting it would be circular"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"file": "src/data/provenanceCoverage.ts",
|
|
240
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"file": "src/data/stageBCertifiedSet.ts",
|
|
244
|
+
"reason": "this manifest; self-reference would be circular"
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"file": "src/monitoring/CredentialProvider.ts",
|
|
248
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"file": "src/monitoring/DegradationReporter.ts",
|
|
252
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"file": "src/monitoring/ErrorCodeExtractor.ts",
|
|
256
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"file": "src/monitoring/Redactor.ts",
|
|
260
|
+
"reason": "cross-cutting utility shared far beyond Codex delivery, certified by its own suite; binding it would re-freeze releases on unrelated churn"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"file": "src/providers/adapters/gemini-cli/models.ts",
|
|
264
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"file": "src/providers/adapters/gemini-cli/observability/geminiCapacityPolicy.ts",
|
|
268
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"file": "src/providers/adapters/gemini-cli/transport/geminiSpawn.ts",
|
|
272
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"file": "src/providers/adapters/openai-codex/errors.ts",
|
|
276
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"file": "src/providers/adapters/openai-codex/models.ts",
|
|
280
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
"file": "src/providers/adapters/openai-codex/observability/eventNormalizer.ts",
|
|
284
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"file": "src/providers/adapters/openai-codex/transport/codexSpawn.ts",
|
|
288
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"file": "src/providers/adapters/openai-codex/transport/codexUsageParser.ts",
|
|
292
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"file": "src/providers/adapters/pi-cli/config.ts",
|
|
296
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"file": "src/providers/adapters/pi-cli/errors.ts",
|
|
300
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"file": "src/providers/adapters/pi-cli/policy.ts",
|
|
304
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
"file": "src/providers/adapters/pi-cli/transport/oneShotCompletion.ts",
|
|
308
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"file": "src/providers/adapters/pi-cli/transport/piSpawn.ts",
|
|
312
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
"file": "src/providers/capabilities.ts",
|
|
316
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
"file": "src/providers/costAwareRouting.ts",
|
|
320
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"file": "src/providers/errors.ts",
|
|
324
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"file": "src/providers/events.ts",
|
|
328
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
"file": "src/providers/primitives/observability/usageMeterProvider.ts",
|
|
332
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
"file": "src/providers/primitives/transport/oneShotCompletion.ts",
|
|
336
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
"file": "src/providers/registry.ts",
|
|
340
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"file": "src/providers/routing.ts",
|
|
344
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"file": "src/providers/types.ts",
|
|
348
|
+
"reason": "LLM-provider plumbing reached through a dynamic import in a certified module; shared across every internal LLM feature and certified by its own suites — binding it would re-freeze releases on unrelated provider churn"
|
|
349
|
+
}
|
|
350
|
+
],
|
|
351
|
+
"fingerprint": "6aafe889d2bf5e21aeb821348fdbc593e0ca34282de706d53a5eb44cd848ea4b",
|
|
352
|
+
"artifactDigest": "7499d16a6ab0b986757121c3d1b3f97f93f7204d341e0a07aaecb360863c75eb",
|
|
353
|
+
"fileHashes": {
|
|
354
|
+
"src/core/CodexComposerAdapter.ts": "8d4753c45f317092f3d1e8d6e5a73a875dbf046cbac20066220fa036b4f0e065",
|
|
355
|
+
"src/core/CodexDeliveryObserver.ts": "7de40edfd2f64adfcef9e18bf6191acb4bdeb294886f0369895b948e1be345dd",
|
|
356
|
+
"src/core/CodexLifecycleProductionComposition.ts": "a94897fbd317af61c5ea8d09da7484b2799b985ef44af2e2cc304f769fff62a4",
|
|
357
|
+
"src/core/InboundDeliveryStore.ts": "93009f9b2cc2c4ee2124c09e8fe3f8ac30edf17b033c13864ff61b0e14ea0e88",
|
|
358
|
+
"src/core/SessionRecoveryChannel.ts": "d38b8ebc6d073008ae2d9f9109a254019813499d5d327a3ff00e4b2a72272b65",
|
|
359
|
+
"src/core/SessionRecoveryConsumer.ts": "6a00ca4993d188f1c95eaa7d156795804f00f7e10e600ea12fa2e8cd40423268",
|
|
360
|
+
"src/core/StageBStartupReadiness.ts": "92275608368d44abc98802f9a445acc6419fd57bddb8c2e4935f32961d401183"
|
|
361
|
+
},
|
|
362
|
+
"boundAt": "2026-09-04",
|
|
363
|
+
"boundBy": "echo (operator-approved rebinding, topic 52075, 2026-09-03)",
|
|
364
|
+
"note": "Initial binding: certified sources verified byte-identical to the evidence commit (git diff 92a21075d..1b46533a7 over the certified set is empty), so the approved 2026-08-31 canary evidence remains the honest witness."
|
|
365
|
+
} as const;
|
|
366
|
+
|
|
367
|
+
export type StageBCertifiedSet = typeof STAGE_B_CERTIFIED_SET;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"generatedFrom": "source-tree",
|
|
4
4
|
"registrySha256": "8e6606a6722433c5ffc15b3870402283c5406083a14cdbd0e18e735731e2aae2",
|
|
5
|
-
"packageVersion": "1.3.
|
|
5
|
+
"packageVersion": "1.3.1221",
|
|
6
6
|
"guards": [
|
|
7
7
|
{
|
|
8
8
|
"ref": "docs/audits/phase-b/f10-triage.md",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"sha256": "
|
|
2
|
+
"sha256": "5fa578c9e59c4db0835d48d02776497a23b3fbc74c2f0048192dd5ad9da9c679",
|
|
3
3
|
"registrySha256": "8e6606a6722433c5ffc15b3870402283c5406083a14cdbd0e18e735731e2aae2",
|
|
4
|
-
"packageVersion": "1.3.
|
|
4
|
+
"packageVersion": "1.3.1221"
|
|
5
5
|
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
A message an agent signs and delivers through a human's Telegram account (for
|
|
9
|
+
example, this agent posting through the operator's own login to reach a sister
|
|
10
|
+
session) was already recognised by the signature classifier, but that verdict
|
|
11
|
+
lived only in a ledger. The receiving session was still told the message came
|
|
12
|
+
from the human, and the topic-operator auto-bind still seated that human as the
|
|
13
|
+
topic's verified operator on the strength of a message they did not write.
|
|
14
|
+
|
|
15
|
+
Now the routing path reads the classifier's own verdict for each message (by
|
|
16
|
+
platform message id, from in-process state, never from content) at the point
|
|
17
|
+
where both ingress paths converge. A verified-signed message is injected with a
|
|
18
|
+
tag that names the signing agent and the account that carried it, the thread
|
|
19
|
+
history a fresh session reads says the same, and operator auto-bind is refused
|
|
20
|
+
for it. Existing agents receive the awareness bullet through the CLAUDE.md
|
|
21
|
+
migration.
|
|
22
|
+
|
|
23
|
+
The Stage-B publish gate bound its signed canary evidence to a version number,
|
|
24
|
+
which can match exactly once: the named version shipped, every later release
|
|
25
|
+
failed the binding check, and publishing froze for the whole fleet. The gate
|
|
26
|
+
now binds the evidence to the code the canary actually certified. A reviewed
|
|
27
|
+
manifest lists the certified Stage-B sources (their import closure is
|
|
28
|
+
recomputed on every check, and every member must be certified or excluded with
|
|
29
|
+
a written reason — anything new fails closed), a fingerprint of their exact
|
|
30
|
+
bytes, and the canonical digest of the signed evidence. Publishing verifies
|
|
31
|
+
the sources still match the manifest; the runtime fleet-activation path,
|
|
32
|
+
which had the same version binding and would have kept Stage B silently dark
|
|
33
|
+
on every later release, verifies the same linkage. The rebinding tool
|
|
34
|
+
structurally refuses to re-stamp old evidence onto changed code: changed
|
|
35
|
+
certified sources require fresh embedded canary evidence. The canary
|
|
36
|
+
thresholds themselves — two hours, fifty deliveries, full case matrix, zero
|
|
37
|
+
failures, signed approval — are unchanged.
|
|
38
|
+
|
|
39
|
+
## What to Tell Your User
|
|
40
|
+
|
|
41
|
+
If I post a message into one of my own topics through your Telegram account,
|
|
42
|
+
the session on the other end now sees it labelled as coming from me, signed,
|
|
43
|
+
via your account, rather than as you speaking. That message can never make
|
|
44
|
+
you the operator of that topic by itself; only a message you actually wrote
|
|
45
|
+
does that. Nothing changes for messages you type yourself.
|
|
46
|
+
|
|
47
|
+
Updates flow again. Releases were frozen for two days by a safety gate that
|
|
48
|
+
tied its proof to a version number; the proof is now tied to the code it
|
|
49
|
+
actually vouches for, so releases pass while that code is unchanged and a real
|
|
50
|
+
change to it still demands a fresh certification run first.
|
|
51
|
+
|
|
52
|
+
## Summary of New Capabilities
|
|
53
|
+
|
|
54
|
+
- A verified agent-signed message delivered through a human's account is
|
|
55
|
+
injected with a tag naming the signing agent and the carrying account, and the
|
|
56
|
+
thread history a fresh session reads carries the same label.
|
|
57
|
+
- Operator auto-bind is refused for such a message; a human's own messages keep
|
|
58
|
+
today's behaviour exactly.
|
|
59
|
+
- The signature classifier now answers "what was the verdict for this message?"
|
|
60
|
+
for the routing path without verifying twice.
|
|
61
|
+
|
|
62
|
+
- Releases publish again: the two days of merged fixes (including the
|
|
63
|
+
signed-message labelling fix) ship in the next release.
|
|
64
|
+
- A change to certified Stage-B code still blocks publishing until a fresh
|
|
65
|
+
canary is approved, and now the block names exactly which files drifted.
|
|
66
|
+
- The certified/excluded partition is explicit, reviewed, and fail-closed for
|
|
67
|
+
new imports, so coverage cannot rot silently.
|
|
68
|
+
|
|
69
|
+
## Evidence
|
|
70
|
+
|
|
71
|
+
Unit tests cover the tag builder's new clause (byte-identical output when
|
|
72
|
+
absent, charset-sanitised agent id), the classifier's bounded per-message
|
|
73
|
+
verdict lookup (verified, human, replay-rejected, id-less, outbound, eviction),
|
|
74
|
+
the read-time authorship join exposing the agent id only on a verified verdict,
|
|
75
|
+
the history label, the auto-bind refusal, and the idempotent CLAUDE.md
|
|
76
|
+
migration. Source-level wiring tests pin that the verdict is resolved before
|
|
77
|
+
the auto-bind, that the bind is gated on it, that the injection carries it, and
|
|
78
|
+
that every thread-history renderer uses the shared label.
|
|
79
|
+
|
|
80
|
+
Eighteen new unit tests cover the canonical digest (order stability, field
|
|
81
|
+
and signature sensitivity, manifest linkage), the version-independent
|
|
82
|
+
verifier on both publish and runtime paths, the tampered-evidence and
|
|
83
|
+
config-binding refusals, the manifest partition invariants, and the tool and
|
|
84
|
+
hook wiring. The existing Stage-B activation, readiness, forensics, and
|
|
85
|
+
publish-gate suites pass unchanged except two tests updated for the
|
|
86
|
+
override-seam scoping. The live publish verifier passes on this tree for a
|
|
87
|
+
future version number.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
The outbound tone gate previously treated any `B2_FILE_PATH` verdict as a hard stop unless the broader advisory-migration experiment was enabled. That made a contextual writing preference capable of blocking legitimate artifact links and exact paths. `B2_FILE_PATH` is now advisory on every install. The agent may revise the prose or explicitly override the nudge with a reason; credential exposure and autonomous self-stop rules remain hard blockers.
|
|
9
|
+
|
|
10
|
+
Existing agents receive the revised behavior awareness through an idempotent CLAUDE.md migration, while fresh installs inherit it directly from the current template.
|
|
11
|
+
|
|
12
|
+
## What to Tell Your User
|
|
13
|
+
|
|
14
|
+
Exact file paths and artifact links are allowed when they are useful. The agent may still get a clarity suggestion, but that suggestion can no longer prevent delivery merely because it contains a path. Secret values remain blocked.
|
|
15
|
+
|
|
16
|
+
## Summary of New Capabilities
|
|
17
|
+
|
|
18
|
+
- File-path feedback is advisory by default across fresh and upgraded agents.
|
|
19
|
+
- Agents can send a necessary path after recording why the nudge does not apply.
|
|
20
|
+
- Credential-safety walls remain unchanged.
|
|
21
|
+
|
|
22
|
+
## Evidence
|
|
23
|
+
|
|
24
|
+
Focused unit and integration coverage verifies the runtime disposition with the broader migration both off and on, behavior when decision recording is unavailable, fresh-install awareness, replacement of legacy installed guidance, and migration idempotency.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Side-Effects Review — Agent-signed inbound messages are labelled, not laundered
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `asp-signed-inbound-label`
|
|
4
|
+
**Date:** `2026-09-02`
|
|
5
|
+
**Author:** `Echo`
|
|
6
|
+
**Second-pass reviewer:** `Codex independent reviewer (see below)`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
A message an agent signs and delivers through a human's Telegram account already receives an `agent-verified` verdict from the ASP inbound classifier, but that verdict lived only in a ledger. The receiving session was still told the message came `from <human>`, and the topic-operator auto-bind still seated that human as the topic's verified operator. This change reads the classifier's own verdict at the routing convergence point (`telegram.onTopicMessage` in `src/commands/server.ts`), by platform message id from in-process state, and does three things for a verified-signed message: the injection tag names the signing agent and the carrying account (`src/types/pipeline.ts`, `src/core/SessionManager.ts`), the thread-history renderers say the same via one shared label (`src/server/routes.ts`, `src/core/ForwardedTopicContext.ts`, `src/core/AspAuthorshipJoin.ts`), and operator auto-bind is refused. The classifier gains a bounded per-message verdict lookup (`src/core/AspInboundClassifier.ts`); the helpers live in `src/messaging/shared/signedInbound.ts`; the CLAUDE.md awareness bullet and its idempotent migration live in `src/core/PostUpdateMigrator.ts`.
|
|
11
|
+
|
|
12
|
+
## Decision-point inventory
|
|
13
|
+
|
|
14
|
+
- `telegram.onTopicMessage` operator auto-bind (`src/commands/server.ts`) — modify — the bind is additionally gated on "this message is not agent-signed"; every other condition is unchanged.
|
|
15
|
+
- Lifeline-forward operator auto-bind (`src/server/routes.ts`) — modify — the same gate, on the same cached verdict (the message is logged, and therefore classified, before this bind runs).
|
|
16
|
+
- `AspInboundClassifier.classify` — pass-through — unchanged verdict logic; it now also remembers each verdict by message id.
|
|
17
|
+
- `buildInjectionTag` / `injectTelegramMessage` — modify — an additive sender clause; no block/allow surface.
|
|
18
|
+
- Thread-history renderers — modify — label only; no block/allow surface.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 1. Over-block
|
|
23
|
+
|
|
24
|
+
The only thing this change withholds is operator auto-bind, and only for a message whose signature the classifier verified as an agent's. A human's own message is never withheld: an unsigned message, a message with a malformed or forged tag (`rejected`), and a message the classifier never saw all keep today's auto-bind behaviour. Over-block would require the classifier to verify a signature a human typed — which requires the agent's private key. If a topic's very first message is agent-signed, that topic simply has no verified operator until the human writes; that is the correct state, not a regression.
|
|
25
|
+
|
|
26
|
+
## 2. Under-block
|
|
27
|
+
|
|
28
|
+
An agent that never signs its messages is still indistinguishable from the account holder (the ASP limit already stated in the awareness section). The durable inbound queue path (`dmsg.senderEnvelope`, ships dark) does not carry the flag yet, so a message delivered through that path would arrive with today's tag; it still cannot mis-bind, because the bind decision happens at the convergence point before either delivery path. A message classified before this process started (ledger only, no in-memory verdict) is labelled by the history join but injected with today's tag. Rejected-but-genuine signatures (the plain-text-only limit) fall to `human` behaviour, which is the pre-existing fail direction.
|
|
29
|
+
|
|
30
|
+
## 3. Level-of-abstraction fit
|
|
31
|
+
|
|
32
|
+
This is a low-level invariant at the identity layer, exactly where Know Your Principal says it belongs: the one place both ingress paths converge, reading the one cryptographic authority that already exists. It does not add a second verifier (the nonce is single-use, so it must not), and it does not add a judgment. The higher-level gate it feeds is the existing operator-binding path, which now has a truthful input.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 4. Signal vs authority compliance
|
|
37
|
+
|
|
38
|
+
**Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
|
|
39
|
+
|
|
40
|
+
- [x] No — this change has no block/allow surface beyond withholding one automatic grant on cryptographic proof.
|
|
41
|
+
|
|
42
|
+
The label is a signal to the session. The one authority it exercises — refusing operator auto-bind — is deterministic on an exact, unforgeable match (a valid Ed25519 signature bound to a single-use nonce), which is the ruled shape for structure deciding alone. It never blocks, delays, rewrites, or drops a message; every failure path delivers the message unlabelled.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 4b. Judgment-point check (Judgment Within Floors standard)
|
|
47
|
+
|
|
48
|
+
No new static heuristic at a competing-signals decision point. "Was this message signed by an agent?" is enumerable (verified / not), and the auto-bind refusal is a safety guard on an identity grant, deterministic by design.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 5. Interactions
|
|
53
|
+
|
|
54
|
+
- **Shadowing:** the verdict is read from the classifier, which runs on the `onMessageLogged` seam BEFORE routing on both ingress paths (polling: `appendToLog` precedes `onTopicMessage`; lifeline: `logInboundMessage` precedes the `onTopicMessage` fire in `routes.ts`). If logging is deduplicated for a repeated message id, the first verdict is reused, which is correct.
|
|
55
|
+
- **Double-fire:** none. The classifier still verifies exactly once; the routing path reads, never re-verifies (a second verify would classify the genuine message as a replay).
|
|
56
|
+
- **Races:** the in-memory map is written and read on the same event-loop turn sequence; bounded at 1000 entries with oldest-first eviction.
|
|
57
|
+
- **Feedback loops:** none. The label does not feed the classifier.
|
|
58
|
+
- The `routes.ts` lifeline-side operator bind runs BEFORE the convergence point, so gating only the convergence point would have left an agent-signed lifeline message able to seat the operator (raised by the second-pass reviewer). It is now gated on the same verdict, read through a context getter to the one classifier; the log call that classifies the message precedes it in the same handler.
|
|
59
|
+
- The convergence point OWNS `metadata.signedByAgent`: it is rewritten from the verdict on every message and removed when the verdict is not agent-verified, so a value arriving on the Message from a wire body, a replay, or a queue row can never reach the injection (also raised by the second-pass reviewer).
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 6. External surfaces
|
|
64
|
+
|
|
65
|
+
- Other agents on the same machine: none.
|
|
66
|
+
- Install base: every agent gets the labelling on the next server restart; the awareness bullet arrives through the CLAUDE.md migration.
|
|
67
|
+
- External systems: none. No Telegram send changes.
|
|
68
|
+
- Persistent state: none new. The ASP ledger format is unchanged; the history join reads it as before and adds a derived field.
|
|
69
|
+
- Timing: none.
|
|
70
|
+
- Operator surface: no operator-facing actions.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 6b. Operator-surface quality (Operator-Surface Quality standard)
|
|
75
|
+
|
|
76
|
+
No operator surface — not applicable.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 7. Multi-machine posture (Cross-Machine Coherence)
|
|
81
|
+
|
|
82
|
+
**Proxied-on-read.** The verdict is machine-local by nature (the classifier on the receiving machine verifies the signature and holds the nonce store), and the label follows the message to whichever session is injected on that machine. For a topic that has moved, the forwarded thread history carries `authorship` and `authorshipAgentId` from the previous machine's history read, so the relayed history block shows the same label. It emits no user-facing notice, holds no durable state that could strand on transfer, and generates no URL.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 8. Rollback cost
|
|
87
|
+
|
|
88
|
+
Pure code change — revert and ship a patch. No persistent state, no data migration. The awareness bullet would then overstate behaviour until a correcting migration lands; a rollback would carry one.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Conclusion
|
|
93
|
+
|
|
94
|
+
The change closes a real identity-bleed path with the smallest possible authority: one deterministic refusal on cryptographic proof, and otherwise labels. The review moved the verdict lookup from "verify again at routing" (wrong: single-use nonce) to "remember the log-time verdict by message id", and added the charset sanitisation on the agent id so a ledger row can never inject text into a tag. Two honest limits are recorded above (dark inbound-queue path; lifeline-side first bind). Clear to ship after the independent second pass and the full test gate.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Second-pass review (if required)
|
|
99
|
+
|
|
100
|
+
**Reviewer:** Codex independent reviewer (GPT-5.6, read-only, artifact + diff)
|
|
101
|
+
**Independent read of the artifact:** concern on the first pass, both points accepted and fixed. (1) The lifeline-forward operator bind ran before the convergence point, so the claimed under-block protection did not hold for that ingress — now gated on the same verdict. (2) The injection trusted a pre-existing `metadata.signedByAgent` — the convergence point now rewrites the field from the verdict and strips any other value. The reviewer confirmed the auto-bind at the convergence point depends only on the classifier-derived value, that no second signature verification occurs, that the tag change is backward-compatible, and that the label grants no authority. Second pass on the revised diff (same reviewer, same read-only setup): **concur, no issues** — the lifeline-forward bind is gated on the cached verdict after the log call, the convergence point owns the metadata field, no second verification exists, and the label grants no authority.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Evidence pointers
|
|
106
|
+
|
|
107
|
+
- `tests/unit/signed-inbound-label.test.ts`
|
|
108
|
+
- `tests/unit/asp-inbound-classifier-verdictFor.test.ts`
|
|
109
|
+
- `tests/unit/asp-authorship-join-agentid.test.ts`
|
|
110
|
+
- `tests/unit/PostUpdateMigrator-aspSignedInboundBullet.test.ts`
|
|
111
|
+
- `tests/unit/redelivery-marker.test.ts` (parameter-count guard updated with its reasoning)
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Class-Closure Declaration (display-only mirror)
|
|
116
|
+
|
|
117
|
+
No agent-authored-artifact defect — not applicable. This change fixes routing code (TypeScript source), not an LLM prompt, hook, config, skill, or standards text, and it adds no self-triggered controller: nothing here fires a restart, swap, respawn, spawn, notify, retry, re-drive, or kill on its own.
|