GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — feat: add chat project instructions API by jaaydenh · Pull Request #30368 · coder/coder

Conversation

@jaaydenh

@jaaydenh jaaydenh commented Oct 5, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

Adds the experimental API for chat project instructions: GET, PUT, and DELETE /api/experimental/organizations/{organization}/chats/projects/{project}/instructions, behind the chat-projects experiment.

  • GET returns 200 with empty instructions and null updated_by/updated_at when nothing is set, so clients don't need a 404 path.
  • PUT requires update access only (the read-back runs under a system context, so a custom role with update but not read can save). It sanitizes the text with SanitizePromptText. It rejects blank text with 400, pointing the caller to DELETE, and rejects text over the chat prompt byte limit. It records the caller as updated_by. The upsert and the read-back that returns the editor's profile run in one transaction.
  • DELETE returns 204, including when nothing is set.
  • Users without access to the project get 404, like the other project routes.
  • PUT and DELETE are audited as a new chat_project_instructions resource (write and delete), with the project as the resource ID and its name as the target. The diff tracks only the instruction text. Saving unchanged text and deleting unset instructions are not audited. A per-project advisory lock serializes reading the previous value with the write, so concurrent edits produce accurate diffs. Migration 000615 adds the enum value.

The codersdk client gains ChatProjectInstructions, UpdateChatProjectInstructions, and DeleteChatProjectInstructions.

What to scrutinize: writes are last-writer-wins with no version precondition, matching the deployment, user, and organization prompt settings.

Generated: coderd/apidoc/docs.go, coderd/apidoc/swagger.json, and docs/reference/api/schemas.md come from the Swagger annotations; site/src/api/typesGenerated.ts comes from codersdk; docs/admin/security/audit-logs.md, coderd/database/dump.sql, and coderd/database/models.go come from the audit table and migration. Together they are about 400 of this PR's lines.

Validation: make gen leaves no diff. go test ./coderd -run TestChatProject and go test ./enterprise/coderd -run TestChatProjectInstructions pass. TestChatProjectInstructionsAudit checks the audit entries for create, update, and delete, and that no-op saves and deletes are not audited. It covers unset GET, create, update, blank and oversized PUT, delete, access denial, and cascade on project delete.


Stack (merge top to bottom). #30377 through #29583 are f0ssel's split of the original #29583, and this stack sits on #29583:

  • feat(site/src): add the chat projects data layer and project dialog #30377 data layer and project dialog (f0ssel)
  • feat: lock the new-chat form to a project's organization #30378 new-chat form locked to a project (f0ssel)
  • feat(site/src): add the chat project page #30379 project page route (f0ssel)
  • feat: add chat project folders to the sidebar #29583 sidebar folders (f0ssel), the base of this stack
  • refactor(site): move the composer layout out of AgentCreateForm #30291 composer frame
  • feat(site): keep project chat list caches in sync #30292 project chat list caches
  • feat(site): redesign the project page header #30293 project page header
  • feat(site): list project chats on the project page #30294 project chats list
  • feat(coderd): add chat project instructions storage and prompt injection #30367 instructions storage and prompt injection
  • feat: add chat project instructions API #30368 instructions API 👈
  • feat(site): add the project instructions editor dialog #30369 instructions editor dialog
  • feat(site): show project instructions in the project page details panel #30370 instructions Details panel

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
f0ssel added 30 commits September 21, 2026 14:26
@f0ssel
fix(coderd): scope project names to their creator and validate the pr…
679cd04
…oject before other chat updates
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-projects' into f0sse…
df4d197
…l/chat-project-memories

# Conflicts:
#	coderd/database/dump.sql
#	coderd/database/unique_constraint.go
@f0ssel
fix(coderd): extract memory from unpruned history, hand off leftover …
37761d8
…drains, and gate memory lists on the memory resource
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-project-memories' in…
c6be116
…to f0ssel/chat-memory-consolidation

# Conflicts:
#	coderd/x/chatd/memory_extract.go
@f0ssel
refactor(coderd): name the chat project creator column owner_id
3721834
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-projects' into f0sse…
35dcf5e
…l/chat-project-memories

# Conflicts:
#	coderd/database/dump.sql
#	coderd/database/foreign_key_constraint.go
#	coderd/database/unique_constraint.go
#	docs/admin/security/audit-logs.md
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-project-memories' in…
433e8ad
…to f0ssel/chat-memory-consolidation
@f0ssel
fix(coderd): send full memory bodies through a rotating consolidation…
92413eb
… window and reject overlapping mutations
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-memory-consolidation…
f6ee5b4
…' into f0ssel/chat-projects-ui-folders
@f0ssel
fix(site): keep cached project data usable and surface project failur…
40b82ba
…es in the chat sidebar and composer
@f0ssel
Merge remote-tracking branch 'origin/main' into f0ssel/chat-projects
1ad6a2f
# Conflicts:
#	coderd/chat_routes.go
#	codersdk/chats.go
#	site/src/api/typesGenerated.ts
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-projects' into f0sse…
580f015
…l/chat-project-memories

# Conflicts:
#	coderd/chat_routes.go
#	codersdk/chats.go
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-project-memories' in…
0a97292
…to f0ssel/chat-memory-consolidation

# Conflicts:
#	coderd/chat_routes.go
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-memory-consolidation…
4fdadfe
…' into f0ssel/chat-projects-ui-folders

# Conflicts:
#	site/src/pages/AgentsPage/components/AgentCreateForm.tsx
#	site/src/pages/AgentsPage/components/ChatsSidebar/chats/ChatsPanel.tsx
@f0ssel
fix(coderd/x/chatd): reject consolidation merges into memories the mo…
b19f1b4
…del was not shown
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-memory-consolidation…
846302f
…' into f0ssel/chat-projects-ui-folders
@f0ssel
fix(site): deny a locked organization the user cannot use and add ret…
e1b84e9
…ries to project permission and move-menu failures
@f0ssel
fix(coderd): serialize memory renames with consolidation, retry faile…
a0f8003
…d runs at the cap, and record empty applies as skipped
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-memory-consolidation…
ef0433b
…' into f0ssel/chat-projects-ui-folders
@f0ssel
fix(site): reset the project dialog through its open lifecycle instea…
edcc130
…d of remounting it
@f0ssel
fix(coderd/x/chatd): give consolidation enough output budget for comp…
c15aecd
…lete memory bodies
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-memory-consolidation…
09f6ed5
…' into f0ssel/chat-projects-ui-folders
@f0ssel
fix(site): derive the open project folder from the active chat during…
e1fee63
… render
@f0ssel
fix(coderd/x/chatd): consume turns completed outside a project and sc…
98bdf43
…ope the memory audit docs
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-project-memories' in…
dd92240
…to f0ssel/chat-memory-consolidation
@f0ssel
remove todo
28596e5
@f0ssel
fix(coderd/x/chatd): journal consolidation with its apply transaction…
945764c
… and overlap name-sorted windows
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-memory-consolidation…
18b498f
…' into f0ssel/chat-projects-ui-folders
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-projects' into f0sse…
744bf73
…l/chat-project-memories

# Conflicts:
#	coderd/x/chatd/ARCHITECTURE.md
@f0ssel
Merge remote-tracking branch 'origin/f0ssel/chat-project-memories' in…
c59a8fd
…to f0ssel/chat-memory-consolidation
jaaydenh added a commit that referenced this pull request Oct 7, 2026
@jaaydenh @f0ssel @claude
feat(site): list project chats on the project page (#30294)
a531ba3
<img width="1506" height="734" alt="Project page"
src="https://github.com/user-attachments/assets/bfcfba12-f229-4dfe-87a2-304bc0551ae1"
/>

Lists the project's unarchived chats below the composer, loaded from
`GET /api/v2/chats?project_id=` with infinite scroll. Each row shows the
status, title, PR state, owner, and AI Gateway cost (when enabled), with
the chat actions menu when the agents layout provides it. Row links keep
the sidebar's filter query string.

Adds the `projectChats` query factory, whose caches the previous PR
keeps in sync.

---

Stack (merge top to bottom). #30377 through #29583 are f0ssel's split of
the original #29583, and this stack sits on #29583:
- #30377 data layer and project dialog (f0ssel)
- #30378 new-chat form locked to a project (f0ssel)
- #30379 project page route (f0ssel)
- #29583 sidebar folders (f0ssel), the base of this stack
- #30291 composer frame
- #30292 project chat list caches
- #30293 project page header
- #30294 project chats list 👈
- #30367 instructions storage and prompt injection
- #30368 instructions API
- #30369 instructions editor dialog
- #30370 instructions Details panel

---------

Co-authored-by: Garrett Delfosse <[email protected]>
Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
jaaydenh added 5 commits October 7, 2026 07:51
@jaaydenh
Merge commit 'b4ea537a87' into chat-project-page/instructions-storage
1159d13
@jaaydenh
Merge commit 'a531ba39e5^' into chat-project-page/instructions-storage
8144356
@jaaydenh
Merge commit 'a531ba39e5' into chat-project-page/instructions-storage
08b1010
@jaaydenh
Merge remote-tracking branch 'origin/main' into chat-project-page/ins…
7ecde4d
…tructions-storage
@jaaydenh
Merge branch 'main' into chat-project-page/instructions-storage
70e457f
@jaaydenh
jaaydenh added this pull request to stack #30456 October 7, 2026 08:13
@jaaydenh
jaaydenh marked this pull request as ready for review October 7, 2026 14:40
@jaaydenh
jaaydenh requested a review from nickvigilante as a code owner October 7, 2026 14:40
@jaaydenh
jaaydenh requested a review from f0ssel October 7, 2026 14:40
f0ssel
f0ssel reviewed Oct 7, 2026
View reviewed changes
Comment thread codersdk/chats.go
Instructions string `json:"instructions"`
// UpdatedBy is the user who last changed the instructions. It is nil
// when the instructions are unset or the user was deleted.
UpdatedBy *MinimalUser `json:"updated_by"`

@f0ssel f0ssel Oct 7, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need this in the API? Maybe audit log suffices for now?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@jaaydenh jaaydenh Oct 13, 2026

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was planning on having a separate minimal logging of project context changes. I think there will be cases where it will be useful for users to see directly on the project when something changed and by who. Especially, for users who don't have access to audit logs

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread coderd/chat_project_instructions.go Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread coderd/chat_project_instructions.go Resolved

Uh oh!

There was an error while loading. Please reload this page.

@linear-code

linear-code Bot commented Oct 8, 2026

Copy link
Copy Markdown

CODAGT-1347

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

jaaydenh added 4 commits October 13, 2026 08:08
@jaaydenh
chore: update todo in architecture.md
816e6bc
@jaaydenh
Merge remote-tracking branch 'origin/main' into fix-instructions-stor…
ef8a2a9
…age-migration
@jaaydenh
fix(coderd/database/migrations): renumber chat project instructions m…
7ed37fe
…igration to 000619
@jaaydenh
feat: audit chat project instructions changes
f0036e4
Record PUT and DELETE on chat project instructions in the audit log as a
new chat_project_instructions resource. Entries name the project, diff the
instruction text, and skip no-op saves and deletes.
@jaaydenh

jaaydenh commented Oct 13, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

chatgpt-codex-connector[bot]
chatgpt-codex-connector Bot reviewed Oct 13, 2026
View reviewed changes

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f0036e4bcc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread coderd/database/migrations/000620_audit_chat_project_instructions_resource_type.up.sql Resolved

Uh oh!

There was an error while loading. Please reload this page.

Base automatically changed from chat-project-page/instructions-storage to main October 13, 2026 09:45
@jaaydenh
jaaydenh requested a review from a team as a code owner October 13, 2026 09:45
jaaydenh added a commit that referenced this pull request Oct 13, 2026
@jaaydenh @f0ssel @claude
feat(coderd): add chat project instructions storage and prompt inject…
ad85646
…ion (#30367)

Adds storage for project-level instructions in Coder Agents chat
projects and injects them into every chat in the project. This is the
first of four stacked PRs that replace #30349.

A new `chat_project_instructions` table (migration 000613) holds at most
one row per project, scoped to the project's organization. It records
`updated_by` and cascades on project delete. The dbauthz wrappers
authorize against the parent project: read access to get the
instructions, update access to upsert or delete them. No new RBAC
resource is added; project RBAC comes in a later PR.

chatd loads the instructions on every turn, so edits reach existing
chats on their next turn. They are added to the system prompt as a
`<project-instructions>` block after the memory guidance and before
personal instructions, so a user's personal instructions still win a
conflict. Subagent chats carry no `project_id`, so they use their root
chat's project. A load error other than no rows is logged, and the turn
continues without instructions.

**What to scrutinize:** the prompt ordering in `buildSystemPrompt`, and
the choice to inject per turn rather than snapshot at chat creation.
Per-turn injection costs one prompt-cache miss after each edit; the org
instructions in #30272 use a creation-time snapshot instead.

**Generated** (`make gen` from the migration and
`queries/chatprojectinstructions.sql`): `dump.sql`, `models.go`,
`querier.go`, `queries.sql.go`, `dbmetrics/querymetrics.go`,
`dbmock/dbmock.go`, and the `*_constraint.go` files.

`coderd/x/chatd/ARCHITECTURE.md` gets two TODOs for the PR author to
replace with the real description, per AGENTS.md.

**Validation:** `make gen` leaves no diff. `go test
./coderd/database/dbauthz -run TestMethodTestSuite/TestChats`, `go test
./coderd/x/chatd -run 'SystemPrompt|ProjectInstructions|Memory'`, and
`go test ./coderd/database/migrations/...` pass.

---

Stack (merge top to bottom). #30377 through #29583 are f0ssel's split of
the original #29583, and this stack sits on #29583:
- #30377 data layer and project dialog (f0ssel)
- #30378 new-chat form locked to a project (f0ssel)
- #30379 project page route (f0ssel)
- #29583 sidebar folders (f0ssel), the base of this stack
- #30291 composer frame
- #30292 project chat list caches
- #30293 project page header
- #30294 project chats list
- #30367 instructions storage and prompt injection 👈
- #30368 instructions API
- #30369 instructions editor dialog
- #30370 instructions Details panel

---------

Co-authored-by: Garrett Delfosse <[email protected]>
Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
jaaydenh added 3 commits October 13, 2026 09:47
@jaaydenh
Merge commit '7ed37feefe' into chat-project-page/instructions-api
4ec322d
# Conflicts:
#	enterprise/audit/table.go
@jaaydenh
Merge remote-tracking branch 'origin/main' into chat-project-page/ins…
83b8a35
…tructions-api
@jaaydenh
fix(coderd/database/migrations): renumber chat project instructions a…
49887d6
…udit migration
@github-actions

github-actions Bot commented Oct 13, 2026 •
edited by jaaydenh
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

Docs preview

Check off each page once it's been reviewed. If a page changes in a later push, its checkbox clears automatically so it gets a fresh look. Pages not yet wired into the docs navigation aren't listed here.

  • docs/admin/security/audit-logs.md
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jaaydenh
jaaydenh requested a review from f0ssel October 13, 2026 10:32
f0ssel
f0ssel approved these changes Oct 13, 2026
View reviewed changes
@jaaydenh
jaaydenh merged commit 97c5260 into main Oct 13, 2026
32 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@jaaydenh
jaaydenh deleted the chat-project-page/instructions-api branch October 13, 2026 12:15
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 13, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Reviewers

@chatgpt-codex-connector chatgpt-codex-connector[bot] chatgpt-codex-connector[bot] left review comments
@f0ssel f0ssel f0ssel approved these changes
@nickvigilante nickvigilante Awaiting requested review from nickvigilante

Uh oh!

There was an error while loading. Please reload this page.

Assignees

@jaaydenh jaaydenh

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

2 participants

@jaaydenh @f0ssel
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.