Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1728 commits
Select commit Hold shift + click to select a range
46903b2
Merge pull request #576 from Boise-State-Development/docs/managed-har…
philmerrell Jul 7, 2026
67744d6
docs(memory): reframe spec as Memory Spaces — bindable, templated, sh…
philmerrell Jul 7, 2026
bdcc6f7
Merge pull request #579 from Boise-State-Development/feature/memory-s…
philmerrell Jul 7, 2026
f310684
docs(kaizen): recover resourceOauth2ReturnUrl shape section into harn…
philmerrell Jul 7, 2026
0cc1a31
Merge pull request #580 from Boise-State-Development/fix/harness-retu…
philmerrell Jul 7, 2026
ab91ae2
docs(memory): bake in full-ownership zip export of a Memory Space
philmerrell Jul 7, 2026
b6ce474
Merge pull request #581 from Boise-State-Development/feature/memory-s…
philmerrell Jul 7, 2026
eb578e0
feat(memory): Memory Spaces data layer (PR-1)
philmerrell Jul 7, 2026
ca34bc1
Merge pull request #582 from Boise-State-Development/feature/memory-s…
philmerrell Jul 7, 2026
e6d9299
docs(memory): re-slice phasing into primitive vs. agent-consumption w…
philmerrell Jul 7, 2026
4301555
Merge pull request #583 from Boise-State-Development/feature/memory-r…
philmerrell Jul 7, 2026
6f34352
feat(memory): Memory Spaces user surface — /memory/spaces CRUD (A2)
philmerrell Jul 7, 2026
3aa5e8f
Merge pull request #584 from Boise-State-Development/feature/memory-a…
philmerrell Jul 7, 2026
79f79d9
feat(memory): Memory Space zip export — /memory/spaces/{id}/export (A3)
philmerrell Jul 7, 2026
8eaa1ea
Merge pull request #585 from Boise-State-Development/feature/memory-a…
philmerrell Jul 7, 2026
8e581a2
feat(memory): Memory Space sharing + optimistic manifest concurrency …
philmerrell Jul 7, 2026
a7a1f67
Merge pull request #586 from Boise-State-Development/feature/memory-a…
philmerrell Jul 7, 2026
2d39e72
feat(memory): Memory Spaces SPA panel — list/detail/create/share/expo…
philmerrell Jul 7, 2026
2012b92
test(memory): mock MemorySpaceService in sidenav spec (fix unhandled …
philmerrell Jul 7, 2026
e1d9a8b
Merge pull request #587 from Boise-State-Development/feature/memory-a…
philmerrell Jul 7, 2026
0590f0b
fix(memory): wire memory-spaces table/bucket names onto app-api
philmerrell Jul 7, 2026
e2fcad8
docs(cdk): capture the "wire resource name to every compute" rule
philmerrell Jul 7, 2026
0944e73
Merge pull request #588 from Boise-State-Development/fix/memory-space…
philmerrell Jul 7, 2026
aabc32b
feat(memory): deterministic consolidation health pass (A6)
philmerrell Jul 7, 2026
2c0cbd4
Merge pull request #589 from Boise-State-Development/feature/memory-a…
philmerrell Jul 7, 2026
4ff2a55
docs(agent): Agent Designer spec — unified primitive-binding surface
philmerrell Jul 7, 2026
03b5209
Merge pull request #590 from Boise-State-Development/feature/agent-de…
philmerrell Jul 8, 2026
f94073d
feat(agents): Agent contract + compat mapping in shared assistants mo…
philmerrell Jul 8, 2026
8580e34
feat(agents): persist bindings + modelConfig with design-time validation
philmerrell Jul 8, 2026
c2329f8
Merge pull request #591 from Boise-State-Development/feature/agent-de…
philmerrell Jul 8, 2026
58ce8b8
feat(agents): /agents alias router behind AGENTS_API_ENABLED (dark)
philmerrell Jul 8, 2026
4403040
Merge pull request #592 from Boise-State-Development/feature/agent-de…
philmerrell Jul 8, 2026
c963fa8
feat(agents): wire AGENTS_API_ENABLED through CDK + Phase 1 docs
philmerrell Jul 8, 2026
20ded48
Merge pull request #593 from Boise-State-Development/feature/agent-de…
philmerrell Jul 8, 2026
0a963f3
feat(agents): thread AGENTS_API_ENABLED to the inference runtime (Pha…
philmerrell Jul 8, 2026
6801911
feat(agents): resolve Agent modelConfig at invocation, per invoker (P…
philmerrell Jul 8, 2026
9b576a3
feat(agents): Memory-Space hydration helper for prompt injection (Pha…
philmerrell Jul 8, 2026
2e69cab
feat(agents): inject bound Memory Space into the prompt, per invoker …
philmerrell Jul 8, 2026
3344e17
Merge pull request #594 from Boise-State-Development/feature/agent-de…
philmerrell Jul 8, 2026
0cd772b
fix(agents): rename app_api.agents package to avoid shadowing top-lev…
philmerrell Jul 8, 2026
e3ac783
Merge pull request #595 from Boise-State-Development/fix/agents-packa…
philmerrell Jul 8, 2026
6837c33
feat(agents): memory_* tools scoped to an Agent's bound Memory Space …
philmerrell Jul 8, 2026
0e4d55b
chore(memory): default Memory Spaces ON with a kill switch
philmerrell Jul 8, 2026
a875cce
Merge pull request #596 from Boise-State-Development/feature/agent-me…
philmerrell Jul 8, 2026
780b736
Merge pull request #597 from Boise-State-Development/feature/memory-s…
philmerrell Jul 8, 2026
6c26f32
feat(agent-designer): Phase 4 — Agent Designer UI + bindable catalog API
philmerrell Jul 8, 2026
31141bf
test(sidenav): stub AgentService probe to fix unhandled HTTP rejection
philmerrell Jul 8, 2026
7694afd
Merge pull request #598 from Boise-State-Development/claude/agent-des…
philmerrell Jul 8, 2026
128729a
fix(agent-designer): align model write-check with the bindable catalog
philmerrell Jul 8, 2026
5857457
Merge pull request #599 from Boise-State-Development/claude/agent-des…
philmerrell Jul 8, 2026
e393281
feat(sidenav): gate Memory Spaces + Agents to system-admin, add Previ…
philmerrell Jul 8, 2026
eb2bae8
Merge pull request #600 from Boise-State-Development/claude/preview-n…
philmerrell Jul 8, 2026
0b9b039
feat(agent-designer): resolve tool bindings at invocation (replace + …
philmerrell Jul 8, 2026
ebdcb47
feat(topnav): surface active assistant in the top nav
philmerrell Jul 8, 2026
290f9c3
Merge pull request #601 from Boise-State-Development/feature/agent-to…
philmerrell Jul 8, 2026
6dae289
feat(agent-designer): resolve skill bindings at invocation (replace +…
philmerrell Jul 8, 2026
470dfa8
feat(agent-designer): reflect governed agent bindings in the chat-inp…
philmerrell Jul 8, 2026
80d9a1c
Backmerge/main into develop
colinmxs Jul 8, 2026
c51b02e
Merge pull request #605 from Boise-State-Development/backmerge/main-i…
colinmxs Jul 8, 2026
fee9b1c
Merge pull request #602 from Boise-State-Development/feature/agent-sk…
philmerrell Jul 9, 2026
02680a8
Merge pull request #603 from Boise-State-Development/feature/agent-ch…
philmerrell Jul 9, 2026
6a9be1e
fix(agent-designer): release chat-input picker locks on new conversation
philmerrell Jul 9, 2026
098101a
feat(agent-designer): show only the bound tools/skills when an agent …
philmerrell Jul 9, 2026
360ea31
Merge pull request #606 from Boise-State-Development/fix/agent-lock-r…
philmerrell Jul 9, 2026
f16785f
chore(agent-designer): default AGENTS_API_ENABLED on with a kill switch
philmerrell Jul 9, 2026
df5e754
Merge pull request #607 from Boise-State-Development/chore/agents-api…
philmerrell Jul 9, 2026
35e7033
feat(agent-designer): manage an agent's knowledge base from the Agent…
philmerrell Jul 9, 2026
24a9f38
test(scheduled-runs): freeze dispatcher clock to de-flake cadence rea…
philmerrell Jul 9, 2026
be2e253
Merge pull request #608 from Boise-State-Development/feature/agent-kn…
philmerrell Jul 9, 2026
c5efe99
feat(agent-designer): govern model params + live editor preview
philmerrell Jul 9, 2026
c859e7d
Merge remote-tracking branch 'origin/develop' into feature/agent-desi…
philmerrell Jul 9, 2026
e35e645
Merge pull request #609 from Boise-State-Development/feature/agent-de…
philmerrell Jul 9, 2026
eeb5683
feat(agent-designer): lock preview model picker; trim preview nav
philmerrell Jul 9, 2026
897353f
Merge pull request #611 from Boise-State-Development/feature/agent-pr…
philmerrell Jul 9, 2026
93d999d
Merge remote-tracking branch 'origin/main' into backmerge/main-into-d…
colinmxs Jul 9, 2026
f640d32
Merge pull request #613 from Boise-State-Development/backmerge/main-i…
colinmxs Jul 9, 2026
92a6ca7
fix(memory-spaces): route namespaced entry slugs via :path converter
philmerrell Jul 9, 2026
5774ea7
feat(memory-spaces): let the agent read/write MEMORY.md via reserved …
philmerrell Jul 9, 2026
dd3f4c7
Merge pull request #614 from Boise-State-Development/feature/memory-s…
philmerrell Jul 9, 2026
cd77e7e
feat(schedules): target Agents instead of Assistants on scheduled runs
philmerrell Jul 9, 2026
2121dbe
chore(kaizen): weekly research scan 2026-07-10
philmerrell Jul 10, 2026
42e69bc
chore(deps): upgrade Strands to 1.47.0 and add aws-bedrock-token-gene…
philmerrell Jul 10, 2026
3fce83c
fix(scheduled-runs): remove RBAC gate causing prod 403 "Access Denied"
philmerrell Jul 10, 2026
6ded296
docs: consolidate release workflow into one auto-invoked steering doc…
colinmxs Jul 10, 2026
93aeb65
Merge pull request #618 from Boise-State-Development/docs/consolidate…
colinmxs Jul 10, 2026
67e2653
feat(models): Mantle Responses API + per-model region; drop endpoint-…
philmerrell Jul 10, 2026
45f5de4
Merge pull request #617 from Boise-State-Development/claude/prod-erro…
philmerrell Jul 10, 2026
5ac91d1
Merge pull request #615 from Boise-State-Development/feature/schedule…
philmerrell Jul 10, 2026
a8c323e
Merge pull request #619 from Boise-State-Development/feature/strands-…
philmerrell Jul 10, 2026
ac54a4d
Merge pull request #620 from Boise-State-Development/feature/mantle-r…
philmerrell Jul 10, 2026
f3ebd72
fix(api-converse): serve /chat/api-converse from app-api, not via inf…
philmerrell Jul 10, 2026
e6d46a8
fix(app-api): grant Bedrock streaming + inference-profile invoke
philmerrell Jul 10, 2026
82d7348
fix(settings): point API-key snippets at /api/chat/api-converse
philmerrell Jul 10, 2026
9192892
feat(api-converse): route Bedrock Mantle models via a shared builder
philmerrell Jul 10, 2026
154f55c
feat(app-api): grant bedrock-mantle:CreateInference for api-converse
philmerrell Jul 10, 2026
3833f74
Merge pull request #621 from Boise-State-Development/claude/api-key-b…
philmerrell Jul 10, 2026
d033279
Merge remote-tracking branch 'origin/main' into backmerge/main-into-d…
philmerrell Jul 10, 2026
46a3df9
Merge pull request #623 from Boise-State-Development/backmerge/main-i…
philmerrell Jul 10, 2026
f1e361a
feat(identity): MCP user identity forwarding via access-token enrichment
DerrickF Jul 10, 2026
1de3dca
Merge pull request #627 from Boise-State-Development/feature/mcp-user…
DerrickF Jul 10, 2026
a565cec
fix(app-api): grant bedrock-agentcore:CreateTokenVault for OAuth prov…
philmerrell Jul 10, 2026
8ae1dfe
Merge pull request #628 from Boise-State-Development/fix/app-api-crea…
philmerrell Jul 10, 2026
0d1406b
Merge remote-tracking branch 'origin/main' into backmerge/main-into-d…
philmerrell Jul 10, 2026
330e55a
Merge pull request #630 from Boise-State-Development/backmerge/main-i…
philmerrell Jul 11, 2026
3cca87a
fix(scripts): make sync-version.sh portable across GNU and BSD tools
philmerrell Jul 11, 2026
c1ea34a
Merge pull request #631 from Boise-State-Development/feature/portable…
philmerrell Jul 11, 2026
4ed5470
feat(admin): make admin sidebar nav sticky on desktop
philmerrell Jul 11, 2026
1bf847e
feat(frontend): redesign 404 page to match auth screens
philmerrell Jul 11, 2026
5c9510e
Merge pull request #632 from Boise-State-Development/claude/sticky-as…
philmerrell Jul 11, 2026
7b71880
Merge pull request #633 from Boise-State-Development/claude/404-page-…
philmerrell Jul 11, 2026
44fa167
fix(frontend): make shell scroll container real so sticky nav engages
philmerrell Jul 11, 2026
5500a62
Merge pull request #634 from Boise-State-Development/feature/frosted-…
philmerrell Jul 11, 2026
f5e9473
docs(specs): quota cooldown windows + platform ceiling spec and commi…
philmerrell Jul 11, 2026
acf27af
Merge pull request #635 from Boise-State-Development/claude/quota-coo…
philmerrell Jul 11, 2026
318edf0
fix(frontend): guarantee JIT compiler in vitest runs to stop Platform…
philmerrell Jul 11, 2026
18935a3
fix(frontend): size chat scroll space to the response, adapt to shell…
philmerrell Jul 11, 2026
b0e87c8
Merge pull request #637 from Boise-State-Development/feature/dynamic-…
philmerrell Jul 11, 2026
389e0dd
Merge pull request #636 from Boise-State-Development/fix/vitest-jit-c…
philmerrell Jul 11, 2026
1126d3d
feat(settings): make user settings sidebar nav sticky on desktop
philmerrell Jul 11, 2026
3539079
Merge pull request #638 from Boise-State-Development/claude/sticky-as…
philmerrell Jul 11, 2026
4aabdff
feat(admin-tools): discover OAuth-gated MCP servers with the admin's …
philmerrell Jul 11, 2026
ef70323
Merge pull request #639 from Boise-State-Development/feature/discover…
philmerrell Jul 11, 2026
62b0e54
feat(manage-models): add Sonnet 5 + GPT-5.4 curated cards, order by c…
philmerrell Jul 11, 2026
eb74b62
Merge pull request #641 from Boise-State-Development/feature/curated-…
philmerrell Jul 12, 2026
8e31b33
fix(mantle): route google.gemma-4-* to /openai/v1 base path
philmerrell Jul 13, 2026
cac3a59
Merge pull request #643 from Boise-State-Development/feature/curated-…
philmerrell Jul 13, 2026
b3f8b85
feat(manage-models): make max output tokens optional
philmerrell Jul 13, 2026
ae4dfd8
Merge pull request #644 from Boise-State-Development/feature/optional…
philmerrell Jul 13, 2026
74cd7b0
fix(docker): float curl security patch to survive Debian mirror purges
philmerrell Jul 14, 2026
dfba9f8
Merge pull request #645 from Boise-State-Development/feature/optional…
philmerrell Jul 14, 2026
b7e13c0
Merge remote-tracking branch 'origin/main' into backmerge/main-into-d…
philmerrell Jul 14, 2026
881d3e6
Merge pull request #647 from Boise-State-Development/backmerge/main-i…
philmerrell Jul 14, 2026
95cedd0
feat(web-sources): allow removing a web source
philmerrell Jul 14, 2026
27a3cdc
Merge pull request #648 from Boise-State-Development/feature/remove-w…
philmerrell Jul 14, 2026
e70a980
fix(web-sources): let editors start and view crawls
philmerrell Jul 14, 2026
30bab75
Merge pull request #650 from Boise-State-Development/feature/web-sour…
philmerrell Jul 14, 2026
9db6a93
fix(rbac): make AppRole the single source of truth for model access
philmerrell Jul 14, 2026
15bdb8c
Merge pull request #651 from Boise-State-Development/fix/model-role-p…
philmerrell Jul 14, 2026
cbc4b6c
fix(tests): repoint storage patch target and harden integration gate
philmerrell Jul 14, 2026
ef86f51
Merge pull request #652 from Boise-State-Development/fix/metadata-sto…
philmerrell Jul 15, 2026
747080c
fix(chat): keep SSE stream open across tab switches
philmerrell Jul 15, 2026
d364f08
fix(sessions): repair tool-use/tool-result pairing on restore
philmerrell Jul 15, 2026
cbcb574
test(sessions): make compaction fixtures valid Converse histories
philmerrell Jul 15, 2026
31fad03
fix(sessions): guard synthetic error persistence against role-alterna…
philmerrell Jul 15, 2026
35baee2
Merge pull request #653 from Boise-State-Development/fix/tool-pairing…
philmerrell Jul 15, 2026
00b475c
Merge pull request #654 from Boise-State-Development/fix/synthetic-er…
philmerrell Jul 15, 2026
b54246e
fix(chat): reject duplicate concurrent turns with a per-session singl…
philmerrell Jul 15, 2026
3b08701
Merge pull request #655 from Boise-State-Development/fix/session-sing…
philmerrell Jul 15, 2026
bf466e1
feat(chat): distributed turn cancellation — make Stop actually stop t…
philmerrell Jul 15, 2026
3602cd0
Merge pull request #656 from Boise-State-Development/feat/distributed…
philmerrell Jul 15, 2026
743e62c
fix(infra): grant app-api task role access to shared-conversations table
philmerrell Jul 15, 2026
57e6d47
Merge pull request #657 from Boise-State-Development/fix/app-api-shar…
philmerrell Jul 15, 2026
3d3e65a
feat(shares): offload large-conversation snapshots to S3
philmerrell Jul 15, 2026
731ac4e
Merge pull request #658 from Boise-State-Development/feature/share-la…
philmerrell Jul 15, 2026
c4f3a14
Merge remote-tracking branch 'origin/main' into backmerge/main-into-d…
philmerrell Jul 16, 2026
aaadcc4
Merge pull request #660 from Boise-State-Development/backmerge/main-i…
philmerrell Jul 16, 2026
66a8b41
fix(agents): resolve model provider for agent-bound invocations
philmerrell Jul 16, 2026
000e5f9
fix(inference): bind effective_enabled_tools on resume path
philmerrell Jul 16, 2026
eff43fe
Merge pull request #661 from Boise-State-Development/fix/agent-provid…
philmerrell Jul 16, 2026
b53ca90
Merge pull request #662 from Boise-State-Development/fix/resume-effec…
philmerrell Jul 16, 2026
37f060b
Merge remote-tracking branch 'origin/main' into backmerge/main-into-d…
philmerrell Jul 16, 2026
73f0e68
Merge pull request #664 from Boise-State-Development/backmerge/main-i…
philmerrell Jul 16, 2026
4b17080
Merge pull request #616 from Boise-State-Development/kaizen/research-…
philmerrell Jul 17, 2026
40eb412
chore(kaizen): weekly research scan 2026-07-17
philmerrell Jul 17, 2026
d053f84
docs: add session-metadata static sort key spec (issue #175)
philmerrell Jul 17, 2026
269a706
feat(infra): add SessionRecencyIndex GSI to sessions-metadata (issue …
philmerrell Jul 17, 2026
4fecac2
Merge pull request #666 from Boise-State-Development/feature/session-…
philmerrell Jul 17, 2026
6cfd665
feat(sessions): dual-scheme union read for session listing (issue #17…
philmerrell Jul 17, 2026
620066b
Merge pull request #667 from Boise-State-Development/feature/session-…
philmerrell Jul 17, 2026
060375c
fix(deps): bump strands-agents to 1.48.0 for cachePoint-attachment fix
philmerrell Jul 17, 2026
acc5793
Merge pull request #668 from Boise-State-Development/claude/agent-for…
philmerrell Jul 17, 2026
9bebe9a
Merge pull request #665 from Boise-State-Development/kaizen/research-…
philmerrell Jul 17, 2026
c10a824
fix(sessions): degrade to legacy-only on real ValidationException for…
philmerrell Jul 17, 2026
1a838e7
Add Word document tools (create/modify/list/read)
romanmeredith-rgb Jul 17, 2026
6336f6d
Merge pull request #670 from Boise-State-Development/feature/word-doc…
ramenNoodles1998 Jul 17, 2026
bb2e344
Merge pull request #669 from Boise-State-Development/fix/session-list…
philmerrell Jul 17, 2026
a65bab9
Merge remote-tracking branch 'origin/main' into backmerge/main-into-d…
philmerrell Jul 17, 2026
dcd0c46
Merge pull request #672 from Boise-State-Development/backmerge/main-i…
philmerrell Jul 17, 2026
b499a0f
feat(sessions): static-SK write path — born static, self-migrate, no …
philmerrell Jul 17, 2026
097b981
Merge pull request #673 from Boise-State-Development/feature/session-…
philmerrell Jul 17, 2026
fa7df15
Fix S3 PutObject PermanentRedirect in Word tools
romanmeredith-rgb Jul 17, 2026
d328c24
Merge pull request #674 from Boise-State-Development/fix/word-documen…
ramenNoodles1998 Jul 17, 2026
50ca7d2
Merge remote-tracking branch 'origin/main' into backmerge/main-into-d…
philmerrell Jul 17, 2026
be43c5f
feat(scripts): static-SK backfill for the cold tail + ghost cleanup (…
philmerrell Jul 17, 2026
0123319
Merge pull request #677 from Boise-State-Development/feature/session-…
philmerrell Jul 17, 2026
8b3c285
Merge pull request #676 from Boise-State-Development/backmerge/main-i…
philmerrell Jul 18, 2026
f642702
feat(sessions): contract session list to GSI-only once migration comp…
philmerrell Jul 18, 2026
3e32a78
Merge pull request #678 from Boise-State-Development/feature/session-…
philmerrell Jul 18, 2026
eb7e2bf
docs(specs): skills v2 — skills as a pure knowledge primitive bound o…
philmerrell Jul 18, 2026
2749660
Merge pull request #679 from Boise-State-Development/claude/agent-ski…
philmerrell Jul 18, 2026
005e5e9
refactor(agents): delete MCP tool-folding machinery and hook shims (s…
philmerrell Jul 18, 2026
c143891
refactor(skills): remove bound_tool_ids end-to-end (skills v2 PR-1)
philmerrell Jul 18, 2026
1d1f7d2
refactor(chat): remove skills mode — policy, toggle, and preference (…
philmerrell Jul 18, 2026
e7f2a03
docs(specs): mark skills-mode and tool-binding specs superseded by sk…
philmerrell Jul 18, 2026
9b36995
Merge pull request #680 from Boise-State-Development/feature/skills-v…
philmerrell Jul 18, 2026
0dbae0e
feat(skills): swap runtime to Strands AgentSkills plugin (skills v2 P…
philmerrell Jul 18, 2026
f0d522e
feat(skills): standard bundle layout + read_skill_file (skills v2 PR-2)
philmerrell Jul 18, 2026
2794f79
docs(specs): mark skills v2 PR-2 done in the plan
philmerrell Jul 18, 2026
a9606e2
Merge pull request #681 from Boise-State-Development/feature/skills-v…
philmerrell Jul 18, 2026
2c6472e
fix(agents): correct stale skills copy and surface invalid-save feedback
philmerrell Jul 18, 2026
54967ab
feat(skills): user-authored skills tier (skills v2 PR-3)
philmerrell Jul 18, 2026
b3aae21
fix(skills): preserve SKILL.md frontmatter through import (skills v2 …
philmerrell Jul 18, 2026
0cbb6d3
Merge pull request #682 from Boise-State-Development/fix/agent-form-s…
philmerrell Jul 18, 2026
5d27ef7
chore(skills): backfill script for v1 skill bundles (skills v2 PR-3)
philmerrell Jul 18, 2026
e041e07
fix(skills): seed example skill as a v2 bundle (skills v2 PR-3)
philmerrell Jul 18, 2026
5e7655c
Merge pull request #683 from Boise-State-Development/feature/skills-v…
philmerrell Jul 18, 2026
a343dc0
feat(skills): selection surfaces + invoke-through access (skills v2 P…
philmerrell Jul 18, 2026
6f35ba8
chore(assets): add GitHub connector logo variants
philmerrell Jul 18, 2026
2763b56
Merge pull request #684 from Boise-State-Development/feature/skills-v…
philmerrell Jul 18, 2026
1e9b217
feat(skills): enable Skills v2 + admin-only capability gate (skills v…
philmerrell Jul 18, 2026
eb62b95
Merge pull request #685 from Boise-State-Development/feature/skills-v…
philmerrell Jul 18, 2026
7c09961
refactor(rbac): remove dead AppRoleService.can_access_skill
philmerrell Jul 19, 2026
13dd0fa
refactor(skills): delete dead SkillAccessService
philmerrell Jul 19, 2026
79e39ab
Merge pull request #686 from Boise-State-Development/claude/remove-rb…
philmerrell Jul 19, 2026
c8653ed
Merge pull request #687 from Boise-State-Development/claude/remove-de…
philmerrell Jul 19, 2026
9b35685
docs(agents): draft the Agent Directory spec
philmerrell Jul 19, 2026
dfe2bc4
Merge pull request #688 from Boise-State-Development/feature/agent-di…
philmerrell Jul 19, 2026
422cf5d
refactor(artifacts): collapse the two catalog rows into one Artifacts…
philmerrell Jul 19, 2026
9f432dd
Merge pull request #689 from Boise-State-Development/feature/merge-ar…
philmerrell Jul 19, 2026
0ae5ff3
chore(sidenav): hide the My Skills nav entry
philmerrell Jul 19, 2026
19ab656
docs(skills): draft the Skill Creator spec
philmerrell Jul 19, 2026
004ce72
Merge pull request #690 from Boise-State-Development/feature/hide-my-…
philmerrell Jul 19, 2026
ee15eb0
Merge pull request #691 from Boise-State-Development/feature/skill-cr…
philmerrell Jul 19, 2026
c916503
feat(skills): drop the `skills` capability gate from user-facing routes
philmerrell Jul 19, 2026
ccc0b4b
Merge pull request #692 from Boise-State-Development/feature/skills-d…
philmerrell Jul 19, 2026
55871c9
refactor(rbac): delete the dead capabilities module
philmerrell Jul 19, 2026
217413f
Merge pull request #693 from Boise-State-Development/feature/drop-dea…
philmerrell Jul 19, 2026
d50780b
Merge remote-tracking branch 'origin/main' into backmerge/main-into-d…
philmerrell Jul 19, 2026
b276d36
Merge pull request #695 from Boise-State-Development/backmerge/main-i…
philmerrell Jul 19, 2026
f04cb95
fix(chat-input): make the textarea scrollable and reset it after submit
philmerrell Jul 19, 2026
097d22c
fix(compaction): make restored history byte-stable to preserve Bedroc…
philmerrell Jul 20, 2026
9cfec74
fix(skills): deterministic skill ordering to preserve Bedrock prompt …
philmerrell Jul 20, 2026
e745277
fix(cache): add tools + system cachePoints so message-level misses re…
philmerrell Jul 20, 2026
9a5738b
feat(observability): make prompt-cache economics measurable per model…
philmerrell Jul 20, 2026
2b67516
feat(observability): kill switch + prompt-cache conventions in CLAUDE.md
philmerrell Jul 20, 2026
e7d1a8b
Merge pull request #697 from Boise-State-Development/feature/prompt-c…
philmerrell Jul 20, 2026
0d57b26
Merge pull request #696 from Boise-State-Development/fix/chat-input-t…
philmerrell Jul 20, 2026
cbdde9f
chore: PR #697 follow-up breadcrumbs + token-cost-effectiveness tenet
philmerrell Jul 20, 2026
d491ea1
feat(observability): prompt-cache CloudWatch dashboard + alarms (PR #…
philmerrell Jul 20, 2026
49accd1
feat(admin-costs): add per-session cost-anatomy drill-down page
philmerrell Jul 20, 2026
090d97a
Merge pull request #698 from Boise-State-Development/chore/prompt-cac…
philmerrell Jul 20, 2026
06d4351
Merge pull request #699 from Boise-State-Development/feature/prompt-c…
philmerrell Jul 20, 2026
66395e7
Merge pull request #700 from Boise-State-Development/feature/admin-co…
philmerrell Jul 20, 2026
073272e
fix(observability): don't flag first cache write after below-threshol…
philmerrell Jul 20, 2026
b76bf39
Merge pull request #701 from Boise-State-Development/fix/cache-miss-a…
philmerrell Jul 20, 2026
2d3e66b
Set S3_USER_FILES_BUCKET_NAME on inference-api runtime
romanmeredith-rgb Jul 20, 2026
2e2ed84
Merge pull request #702 from Boise-State-Development/fix/inference-us…
ramenNoodles1998 Jul 20, 2026
2b43a5d
Fail loudly when Word doc storage bucket is unconfigured
romanmeredith-rgb Jul 20, 2026
ff21734
Merge pull request #706 from Boise-State-Development/harden/word-doc-…
ramenNoodles1998 Jul 20, 2026
e71b6b3
Release/1.9.0
philmerrell Jul 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,37 @@ All notable changes to this project are documented in this file. Format follows

For narrative release notes written for operators and product owners, see [RELEASE_NOTES.md](RELEASE_NOTES.md).

## [1.9.0] - 2026-07-20

Feature release making **Bedrock prompt-cache economics stable and measurable**. Three cache-busting defects in the model-call path are fixed (per-turn history mutation, nondeterministic skill ordering, single-cachePoint fragility), and a new observability layer makes every model call's cache behavior diagnosable: prefix fingerprints and a `cacheStatus` classification on each cost row, an admin Session Cost Anatomy drill-down page, CloudWatch EMF metrics, and a dashboard with alarms. Also fixes chat-input textarea sizing and points the deployed runtime's Word-document tools at the real user-files bucket. Requires a CDK deploy (new dashboard construct + one runtime env var); no data migration.

### 🚀 Added

- Prompt-cache observability per model call — `PrefixFingerprintHook` hashes the three cacheable prefix components (toolConfig, effective system prompt, message history) onto each cost row; write-time `cacheStatus` classification (`first_write | hit | miss_ttl_expired | miss_avoidable | uncached`) with `wastedUsd` for avoidable misses priced from the row's own pricing snapshot; session-row cache rollups (`totalCacheReadTokens`, `totalCacheWriteTokens`, `avoidableMissCount`, `wastedUsd`); `GET /admin/costs/sessions/{sessionId}/calls` admin endpoint; and per-call CloudWatch EMF metrics. Kill switch `PROMPT_CACHE_OBSERVABILITY_ENABLED=false` (default ON) (#697)
- Admin **Session Cost Anatomy** page at `/admin/costs/sessions/:id` — chronological per-call table with color-coded `cacheStatus` badges and prefix-fingerprint diffing that names which hash (tools/system/history) flipped versus the previous call, plus session-level cache summary and a session-id lookup form on the Cost Analytics dashboard (#700)

### ⚡ Performance

- Restored conversation history is now byte-stable between turns — tool-content truncation is driven by a persisted `truncation_anchor` in compaction state instead of a sliding window that re-mutated history every turn, which forced a full prompt-cache prefix re-write (~$2.50/MTok on a 35k–150k-token prefix) nearly every turn (#697)
- Skill records reach the `<available_skills>` system-prompt block in deterministic order (sorted at the repository, RBAC-union, and injection layers), removing a per-turn prompt-cache invalidator (#697)
- Model calls now carry 3 of Bedrock's max-4 cachePoints (toolConfig tail, system tail, last-user-message) so a message-level cache miss still reads the stable tools+system prefix from cache instead of re-writing everything; the added points are gated to models that support them (#697)

### 🐛 Fixed

- Chat input textarea is scrollable once content exceeds its max height, clamps its growth, and resets to its base height after sending (#696)
- The first cache write after a run of below-threshold (uncached) calls is classified `first_write`, not `miss_avoidable` — it no longer inflates the AvoidableMiss/WastedUsd metrics or the Session Cost Anatomy page (#701)
- Word-document tools on the deployed runtime save to the real user-files bucket — `S3_USER_FILES_BUCKET_NAME` is now set on the inference-api Runtime, where its absence made the tools fall back to a literal `user-files` bucket and fail with `AccessDenied` (#702)
- Word-document tools fail fast with a clear "storage is not configured" message when the bucket env var is unset, instead of surfacing a confusing S3 `PermanentRedirect`/`AccessDenied` mid-run (#706)

### 🏗️ Infrastructure

- `PromptCacheObservabilityConstruct` (`lib/constructs/observability/`) — CloudWatch dashboard over the `AgentCoreStack/PromptCache` EMF metrics (cache read/write tokens, cache-efficiency expression, AvoidableMiss, WastedUsd) with a Logs Insights widget grouped by `cacheStatus`, plus console-only alarms on AvoidableMiss and WastedUsd (stricter in prod; `NOT_BREACHING` on missing data so the kill switch stays quiet) (#699)
- `S3_USER_FILES_BUCKET_NAME` added to the inference-api AgentCore Runtime environment (#702)

### 📚 Docs

- CLAUDE.md — prompt-cache determinism/byte-stability contract, the fingerprint-based cache-miss debugging recipe, and a token-cost-effectiveness design tenet (#697, #698)

## [1.8.0] - 2026-07-19

Feature release delivering **Skills v2** — skills are redesigned from tool-binding containers into pure, portable knowledge bundles that Agents load on demand, and for the first time **any signed-in user can author their own**. Skills ship enabled by default. Also completes the session-metadata static-sort-key migration (issue #175 Phases 2–3) with an operator backfill and a GSI-only read contraction, and consolidates the two artifact tool-catalog rows into a single "Artifacts" toggle. **Three backfill scripts must be run per environment** — see [RELEASE_NOTES.md](RELEASE_NOTES.md) deployment notes. No new AWS resources; a CDK deploy is needed only to set the `SKILLS_ENABLED` env var explicitly.
Expand Down
3 changes: 3 additions & 0 deletions CLAUDE.MD
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ npx cdk deploy {prefix}-PlatformStack
- **Admin endpoints** go under `/admin/<domain>/`, user-facing under `/<domain>/`
- **Errors stream as assistant messages** via SSE (not HTTP error codes)
- **Signal-based state** throughout frontend (`signal()`, `computed()`)
- **Prompt-cache stability is a contract.** Bedrock prompt caching is exact-prefix-match: any list that reaches the system prompt or `toolConfig` (skills, tools, models, MCP tool listings) must be deterministically ordered at its source, and restored conversation history must be byte-stable between compaction-state changes (see the truncation anchor in `TurnBasedSessionManager`). An order flip or history mutation between turns silently re-writes a 30k–150k-token prefix at the $2.50/MTok cache-write premium. `PROMPT_CACHE_OBSERVABILITY_ENABLED=false` disables the observability layer (fingerprint hook, cacheStatus derivation, EMF metrics) — the caching itself stays on
- **Token cost effectiveness is a design tenet — engineer against waste, not against context.** Before merging a change that touches the model call path, answer: what does this add to the prompt, on every turn, for the life of every session? (1) Anything in the cacheable prefix (system prompt, `toolConfig`, restored history) must be deterministic and append-only — see the prompt-cache contract above. (2) Per-turn payloads (tool results, MCP responses, retrieved documents) should be bounded or offloaded, never unbounded pass-through. (3) Don't guess — verify: `cacheStatus` + fingerprint hashes on the session's `C#` rows, `GET /admin/costs/sessions/{id}/calls`, and the `AgentCoreStack/PromptCache` EMF metrics exist to prove a change's cost impact. The balance: "cost effective" means eliminating waste (avoidable cache re-writes, duplicated context, oversized payloads) — it never means stripping context the model needs for a quality answer. When cost and answer quality genuinely conflict, quality wins; look for the cheaper path to the *same* quality, not a cheaper answer
- **All dependencies use exact version pins** — no `^`, `~`, or `>=`
- **Never install packages without explicit user approval**

Expand Down Expand Up @@ -118,6 +120,7 @@ Do not reintroduce a Bearer-only `Depends(...)` on any user-facing route. If you
- **Tool not appearing:** Check `__init__.py` export, RBAC permissions, `enabled_tools`, ToolRegistry
- **Session not persisting:** Check AgentCore Memory config, session_id, TurnBasedSessionManager flush
- **SSE stream disconnecting:** Check 600s timeout, client connection, quota exceeded events
- **Cost spike / cache miss:** Check `cacheStatus` + `toolConfigHash`/`systemPromptHash`/`historyHash` on the session's `C#` rows in sessions-metadata (or `GET /admin/costs/sessions/{id}/calls`) — the hash that changed between consecutive calls names the cache-buster

## Coding Standards

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
**An open-source, production-ready Generative AI platform for institutions**
*Built by Boise State University, designed for everyone.*

[![Release](https://img.shields.io/badge/Release-v1.8.0-6366f1?style=flat&logo=github&logoColor=white)](RELEASE_NOTES.md)
[![Release](https://img.shields.io/badge/Release-v1.9.0-6366f1?style=flat&logo=github&logoColor=white)](RELEASE_NOTES.md)
[![Nightly](https://github.com/Boise-State-Development/agentcore-public-stack/actions/workflows/nightly.yml/badge.svg)](https://github.com/Boise-State-Development/agentcore-public-stack/actions/workflows/nightly.yml)

![Python](https://img.shields.io/badge/Python-3.13+-3776AB?style=flat&logo=python&logoColor=white)
Expand Down Expand Up @@ -296,7 +296,7 @@ agentcore-public-stack/

See [RELEASE_NOTES.md](RELEASE_NOTES.md) for the full changelog, including new features, bug fixes, platform upgrades, and deployment notes for each release.

**Current release:** v1.8.0
**Current release:** v1.9.0

---

Expand Down
66 changes: 66 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,69 @@
# Release Notes — v1.9.0

**Release Date:** July 20, 2026
**Previous Release:** v1.8.0 (July 19, 2026)

---

> 🏗️ **CDK deploy required this release** — a new CloudWatch dashboard construct and one new env var on the inference-api Runtime. No data migration, no backfills, no dependency changes. Standard order: `platform.yml` → `backend.yml` → `frontend-deploy.yml`.

---

## Highlights

v1.9.0 makes **Bedrock prompt-cache spend stable and measurable**. A production conversation audit found 75% of one session's cost was avoidable cache re-writes; this release fixes the three defects behind that waste — restored history that mutated every turn, skills injected in nondeterministic order, and a single fragile cachePoint — and adds the observability to prove it and catch regressions: every model call now records prefix fingerprints and a `cacheStatus` verdict, admins get a per-session **Cost Anatomy** drill-down page, and operators get a CloudWatch dashboard with alarms on avoidable waste. Smaller fixes: the chat input textarea scrolls and resets correctly, and Word-document saves work on the deployed runtime (the container wasn't told which S3 bucket to use).

## Prompt-cache stability — stop paying for avoidable re-writes

Bedrock prompt caching is exact-prefix-match: if any byte of the cached prefix changes between turns, the whole prefix re-writes at the $2.50/MTok cache-write premium instead of reading at the ~$0.30/MTok cache-read rate. On a typical 35k–150k-token session prefix, one silent cache-buster costs more per turn than most turns' actual work. Three were found and fixed (#697):

- **Restored history is now byte-stable.** Tool-content truncation ran on every session restore behind a sliding protected-turns window, so each new turn re-mutated the turn that had just aged past the window — invalidating the cache nearly every turn. Truncation is now driven by a persisted `truncation_anchor` in the session's compaction state: it advances only when the compaction checkpoint advances (where the slice already pays a single re-write) or opportunistically when the cache TTL (default 300s, `AGENTCORE_MEMORY_COMPACTION_CACHE_TTL_SECONDS`) has lapsed since the previous turn and the cache entry is dead anyway — so pending truncations apply for free.
- **Skills inject in deterministic order.** Skill records reached the `<available_skills>` system-prompt block in whatever order DynamoDB `batch_get_item` and Python set iteration produced, changing the system prompt between turns of the same session. Ordering is now sorted at three layers: the skills repository, the RBAC grant-union resolver (which returned `list(set)` — order varies per process via hash randomization), and the injection point itself.
- **Three cachePoints instead of one.** The auto strategy places a single message-level cachePoint; when its lookup misses (one proven mode: a wide parallel tool fan-out pushes the previous checkpoint past Anthropic's ~20-block cache lookback), *nothing* was read and the entire prefix re-wrote. Requests now carry 3 of Bedrock's max-4 cachePoints — toolConfig tail, system-prompt tail, and the existing last-user-message point — so a message-level miss still reads the stable tools+system prefix from cache. The added points are gated on `ModelConfig.bedrock_cache_points_supported()` since non-Anthropic models reject them.

## Prompt-cache observability — every model call explains its cache behavior

Diagnosing the waste above originally took hours of manual forensics against raw DynamoDB cost rows. That whole class of investigation is now a column diff (#697, #700, #699, #701).

### Backend

- `PrefixFingerprintHook` (a Strands `BeforeModelCallEvent` hook) hashes the three cacheable prefix components per model call — toolConfig (order-sensitive canonical JSON), the effective system prompt captured *after* AgentSkills injection, and message history excluding the newest message — and the stream coordinator persists them on the turn's cost rows. When a cache miss happens, the hash that changed between consecutive calls names the cache-buster.
- Each cost row gets a write-time `cacheStatus` — `first_write`, `hit`, `miss_ttl_expired`, `miss_avoidable`, or `uncached` — derived against the session's previous cost row, plus `wastedUsd` for avoidable misses priced at the cache-write premium over cache-read from the row's own pricing snapshot. Turn rows now write sequentially so each call classifies against its true predecessor. A follow-up fix (#701) classifies the first write after a run of below-threshold calls as `first_write` rather than `miss_avoidable`, so short-prompt sessions don't inflate the waste metrics.
- Session rows carry rollups next to `totalCost` — `totalCacheReadTokens`, `totalCacheWriteTokens`, `avoidableMissCount`, `wastedUsd` — so lists and admin views get a cache-efficiency ratio without scanning cost rows.
- `GET /admin/costs/sessions/{sessionId}/calls` (admin-only) returns the chronological per-call rows with token splits, cost, `cacheStatus`, and fingerprints, plus a session-level cache summary.
- Everything derived is behind `PROMPT_CACHE_OBSERVABILITY_ENABLED` (default ON, `=false` to disable the hook, the classification's extra GSI read, and EMF emission). Raw cache read/write token rollups are unaffected — they're usage passthrough, not derived.

### Frontend

- New **Session Cost Anatomy** page at `/admin/costs/sessions/:id`: summary tiles (total cost, cache efficiency, avoidable misses, wasted USD, cache read/write tokens) over a chronological calls table with color-coded `cacheStatus` badges. Fingerprint diffing flags which hash — tools, system, or history — flipped versus the previous fingerprinted call, which is the diagnosis on any `miss_avoidable` row. Expandable rows show full hashes and message counts; a session-id lookup form on the Cost Analytics dashboard is the entry point.

### Infrastructure

- `PromptCacheObservabilityConstruct` (new `lib/constructs/observability/` area, composed into `PlatformStack`) builds a CloudWatch dashboard over the `AgentCoreStack/PromptCache` EMF namespace both APIs emit into: cache read/write token trends, a cache-efficiency MathExpression, AvoidableMiss and WastedUsd, and a Logs Insights widget grouped by `cacheStatus`. Console-only alarms on AvoidableMiss and WastedUsd Sums (stricter thresholds in prod, `NOT_BREACHING` on missing data so the kill switch keeps them quiet). Deliberately no SNS — alerting infra remains out of scope, matching kb-sync and scheduled runs.

### Test Coverage

~1,800 lines of new tests: fingerprint/classification unit tests (including the below-threshold regression), cachePoint position and budget assertions, forced-order skill-sorting regressions, CDK construct assertions, and Vitest specs for the anatomy page, diff util, and HTTP service.

## 🐛 Bug fixes

- **The chat input became unusable on long prompts.** The textarea carried `overflow-hidden` with unclamped height growth, so past its 200px cap the content could neither be seen nor scrolled — and after sending, the box stayed expanded. Growth is now clamped with scrolling enabled past the cap, and the input resets to its base height on submit (#696)
- **Word-document saves failed on the deployed runtime with `AccessDenied`.** The AgentCore Runtime env set the user-files *table* name but not `S3_USER_FILES_BUCKET_NAME`, so the Word tools fell back to a literal `user-files` bucket the role has no access to. The env var is now set on the Runtime (#702), and the tools fail fast with a clear "storage is not configured" message — before spending a Code Interpreter run — if the variable is ever missing again (#706)

## 🏗️ Infrastructure

- New CloudWatch dashboard + alarms construct (see spotlight above) — CloudWatch-console resources only, no SNS, no new IAM of note.
- `S3_USER_FILES_BUCKET_NAME` on the inference-api Runtime environment; the role's existing `UserFilesBucketAccess` grant already covers the bucket (#702)
- New env var `PROMPT_CACHE_OBSERVABILITY_ENABLED` on app-api and inference-api (default ON; set `=false` per environment to disable the observability layer — caching itself stays on).

## 🚀 Deployment notes

Standard order, and this release uses all three: **`platform.yml` first** (the dashboard construct and the Runtime env var are CDK changes; the runtime picks up its current image via SSM, so the infra deploy is safe on its own) → `backend.yml` → `frontend-deploy.yml`. No backfills, no data migration, no dependency changes.

After deploy, the **PromptCache dashboard** appears in the CloudWatch console. Expect `first_write` rows at the start of sessions and after idle gaps — only `miss_avoidable` indicates regression. The observability layer is per-call metadata; if it ever needs to be silenced in an environment, set `PROMPT_CACHE_OBSERVABILITY_ENABLED=false` and redeploy that service — the alarms go quiet on missing data by design.

---

# Release Notes — v1.8.0

**Release Date:** July 19, 2026
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.8.0
1.9.0
2 changes: 1 addition & 1 deletion backend/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "agentcore-stack"
version = "1.8.0"
version = "1.9.0"
requires-python = ">=3.10"
description = "Multi-agent conversational AI system with AWS Bedrock AgentCore"
readme = "README.md"
Expand Down
Loading