instar 1.2.23 → 1.2.24

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.
@@ -0,0 +1,87 @@
1
+ # Side-effects review — org-intent session-start injection (Phase 2)
2
+
3
+ Spec: `docs/specs/ORG-INTENT-SESSION-START-INJECTION-SPEC.md`
4
+ ELI16: `docs/specs/ORG-INTENT-SESSION-START-INJECTION-SPEC.eli16.md`
5
+ Phase: 2 of 4. Phase 1 (gate wiring) shipped as v1.2.23 (PR #315). Phase 3 (tradeoff helper) and Phase 4 (drift detection job) are queued.
6
+
7
+ ## Surface map
8
+
9
+ | Change | File | Type |
10
+ |---|---|---|
11
+ | Exported `formatOrgIntentForSessionStart()` formatter | `src/core/OrgIntentManager.ts` | Additive function export |
12
+ | New `GET /intent/org/session-context` HTTP route | `src/server/routes.ts` | Additive route |
13
+ | Session-start hook fetches + injects parsed ORG-INTENT block | `src/core/PostUpdateMigrator.ts` (`getSessionStartHook`) | Behavior change to agent-installed hook script |
14
+ | CLAUDE.md ORG-INTENT subsection updated (mentions Phase 2) | `src/scaffold/templates.ts` + `PostUpdateMigrator.migrateClaudeMd()` | Doc + migration |
15
+ | Tier 1 unit tests (formatter + migration) | `tests/unit/OrgIntentManager-session-start-format.test.ts`, extended `PostUpdateMigrator-org-intent-runtime.test.ts` | Test addition |
16
+ | Tier 2 integration tests | Extended `tests/integration/org-intent-routes.test.ts` | Test addition |
17
+ | Tier 3 E2E test | `tests/e2e/org-intent-session-context-lifecycle.test.ts` | Test addition |
18
+
19
+ ## Over-block analysis
20
+
21
+ **Could the injection push the agent's context over a token budget?**
22
+
23
+ The block size scales with the `ORG-INTENT.md` file size — the formatter doesn't add content; it just labels and structures what's already there. A typical authored `ORG-INTENT.md` is dozens of bullets across four sections — comfortably under 500 tokens. The cap is the source file itself; an organization with a 10-page ORG-INTENT.md will see 10 pages injected. That's a feature, not a bug — but operators should be aware that very large intent files consume context.
24
+
25
+ **Could the hook fail in a way that disrupts session start?**
26
+
27
+ No. The hook uses `curl -sf --max-time 4` and a wrapping `if [ -n "$ORG_INTENT_RESPONSE" ]; then ... fi`. Any failure path (route unreachable, 503, network timeout, malformed JSON) results in silent skip. The session continues normally. The Coherence Gate from Phase 1 still enforces the contract at outbound message time, so missing the session-start injection never compromises constraint enforcement.
28
+
29
+ **Could the new route be abused / DoS'd?**
30
+
31
+ The route reads `ORG-INTENT.md` from the agent's state dir on every request — bounded local disk read, no LLM call, no DB query. The auth middleware enforces Bearer-token gating. Rate at which an attacker could call it is also bounded by the same auth gate. No new abuse surface beyond `GET /intent/org` (which already existed).
32
+
33
+ ## Under-block analysis
34
+
35
+ **What does the injection NOT catch?**
36
+
37
+ - A subtle constraint violation the agent doesn't recognize when drafting. The injection helps the agent *understand* the constraints; the gate is what actually *enforces* them. If the agent's reasoning misses a constraint applicability, the gate catches it.
38
+ - Constraint applicability scoping. A constraint like "never quote internal pricing externally" depends on knowing if the recipient is external. The injection surfaces the constraint; the agent must reason about applicability. Phase 3+ may add scoping metadata to constraints.
39
+ - Mid-session ORG-INTENT.md changes. The injection happens at session start. Edits during a session do not propagate until next session.
40
+
41
+ ## Level-of-abstraction fit
42
+
43
+ The formatter lives in `src/core/OrgIntentManager.ts` alongside the parser — the right place for a pure rendering function. The HTTP route lives in `src/server/routes.ts` next to `GET /intent/org`. The hook update lives in `PostUpdateMigrator.getSessionStartHook()`, the canonical source for session-start hook content. No new abstractions introduced.
44
+
45
+ ## Signal-vs-authority compliance
46
+
47
+ The session-start injection is **SIGNAL** — it informs the agent's reasoning but has no authority to refuse or modify outbound messages. The Coherence Gate (Phase 1) remains the **AUTHORITY**: constraint violations are blocked at outbound-message review time regardless of whether the agent saw the injection at session start.
48
+
49
+ This separation is intentional. A signal-only injection is robust to malformed `ORG-INTENT.md`, route failures, and hook timeouts — the worst case is "the agent doesn't see the contract this session," not "the agent ignores the contract." The authority layer (the gate) catches what the signal misses.
50
+
51
+ ## Interactions with existing systems
52
+
53
+ | System | Interaction | Risk |
54
+ |---|---|---|
55
+ | Coherence Gate (Phase 1) | None — different layer, different lifecycle | None |
56
+ | `GET /intent/org` | Sibling route — same data, different formatting | None |
57
+ | Session-start hook (existing) | Adds one new fetch + inject block alongside identity, topic, integrated-being, soul, working-memory, etc. | Low — fail-open, bounded by curl --max-time 4 |
58
+ | Working memory injection | Independent — both contribute to session-start context | Token cost is additive but bounded |
59
+ | PostUpdateMigrator other migrations | New migration path operates on an isolated content region | Low — content-sniff guards |
60
+ | Existing `getSessionStartHook()` content | Added inline block; rest unchanged | Low — verified by template parity test pattern |
61
+
62
+ ## Rollback cost
63
+
64
+ Low. Three options:
65
+
66
+ 1. **Code revert**: `git revert <PR-merge-sha>` removes route + hook block + format function. Tests would need removal too.
67
+ 2. **Soft revert via hook bypass**: edit installed `session-start.sh` to remove the curl/python3 block. The route remains but is just an unused HTTP endpoint.
68
+ 3. **Soft revert via empty file**: replace `ORG-INTENT.md` with template-only content; the route returns `{ present: false }` and no injection happens. The Phase 1 gate also gracefully degrades on template-only.
69
+
70
+ No data migration to roll back. No file format changes. The Phase 1 wiring is unaffected by this change.
71
+
72
+ ## Test coverage summary
73
+
74
+ | Tier | File | Tests | Status |
75
+ |---|---|---|---|
76
+ | 1 (unit) | `tests/unit/OrgIntentManager-session-start-format.test.ts` | 6 | ✓ passing |
77
+ | 1 (unit) | `tests/unit/PostUpdateMigrator-org-intent-runtime.test.ts` (extended) | 7 (2 new for Phase 2) | ✓ passing |
78
+ | 2 (integration) | `tests/integration/org-intent-routes.test.ts` (extended) | 11 (4 new for Phase 2) | ✓ passing |
79
+ | 3 (E2E lifecycle) | `tests/e2e/org-intent-session-context-lifecycle.test.ts` | 3 | ✓ passing |
80
+
81
+ ## Open follow-ups (deferred to later phases, NOT this PR)
82
+
83
+ - Phase 3: `POST /intent/tradeoff-resolve` standalone helper.
84
+ - Phase 4: periodic drift detection job sampling recent outbound actions vs intent.
85
+ - Mid-session ORG-INTENT.md change propagation (fs.watch or signal-based reinject).
86
+ - Per-channel constraint scoping (some constraints external-only, others universal).
87
+ - Cache layer in front of the route if call rate becomes notable (currently bounded by session-start frequency, which is ~1 per session).