Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
109 changes: 109 additions & 0 deletions openspec/specs/audience-context-filtering/spec.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
## ADDED Requirements

### Requirement: Context layer audience filtering

The context layer system SHALL accept a `TrustAudience` parameter on
`IContextLayerProvider.GetContextLayer()`. Each context layer implementation
SHALL use the audience to determine what content to return. The
`ContextAssemblyInput` record SHALL include a `TrustAudience Audience` field.
When a feature is disabled deployment-wide, the corresponding context layer
SHALL also return empty even for non-Public audiences.

#### Scenario: Public audience receives no skill index

- **WHEN** a Public-audience session assembles context
- **THEN** `SkillIndexContextLayer.GetContextLayer(Public)` returns empty string
- **AND** no skill index appears in the session's system messages

#### Scenario: Public audience receives no memory index

- **WHEN** a Public-audience session assembles context
- **THEN** `MemoryIndexContextLayer.GetContextLayer(Public)` returns empty string
- **AND** no memory tool hints appear in the session's system messages

#### Scenario: Public audience receives no subagent discovery

- **WHEN** a Public-audience session assembles context
- **THEN** `SubAgentDiscoveryContextLayer.GetContextLayer(Public)` returns empty string
- **AND** no subagent index appears in the session's system messages

#### Scenario: Disabled skills feature suppresses skill index for Team

- **GIVEN** `SkillSync.Enabled` is `false` in config
- **WHEN** a Team-audience session assembles context
- **THEN** `SkillIndexContextLayer.GetContextLayer(Team)` returns empty string
- **AND** no skill index appears in the session's system messages

#### Scenario: Team audience receives all allowed context layers

- **WHEN** a Team-audience session assembles context
- **THEN** all enabled context layers return their full content

#### Scenario: Personal audience receives all allowed context layers

- **WHEN** a Personal-audience session assembles context
- **THEN** all enabled context layers return their full content

### Requirement: Session block path redaction

The session block injected into system messages SHALL omit filesystem paths
for Public-audience sessions. The session ID SHALL remain visible for all
audiences.

#### Scenario: Public session block contains ID only

- **WHEN** a Public-audience session assembles the static context block
- **THEN** the session block contains `[session]\nid: {sessionId}`
- **AND** no `session_dir` or `media_dir` lines are present

#### Scenario: Team session block contains full paths

- **WHEN** a Team-audience session assembles the static context block
- **THEN** the session block contains `id`, `session_dir`, and `media_dir`

### Requirement: Working context suppression for Public

The working context block (project directory, recent files) SHALL NOT be
injected into Public-audience sessions.

#### Scenario: Public session has no working context

- **WHEN** a Public-audience session has a non-empty working context
- **THEN** `WorkingContext.ToContextBlock()` is NOT injected into the volatile context block

#### Scenario: Team session receives working context

- **WHEN** a Team-audience session has a non-empty working context
- **THEN** `WorkingContext.ToContextBlock()` IS injected into the volatile context block

### Requirement: File access error message sanitization

File access denial messages for Public-audience sessions SHALL NOT include
the list of allowed root paths or mention the session directory as an allowed
root. Team and Personal audiences SHALL continue to receive verbose error
messages including allowed roots.

#### Scenario: Public file access denial omits roots

- **WHEN** a Public-audience session attempts to read a file outside allowed roots
- **THEN** the error message does not reveal any allowed root
- **AND** no root paths are listed in the error
- **AND** the session directory is not named or implied in the error

#### Scenario: Team file access denial includes roots

- **WHEN** a Team-audience session attempts to read a file outside allowed roots
- **THEN** the error message includes the list of allowed root paths

### Requirement: Public audience has no implicit internal file roots

Public file access SHALL NOT implicitly include identity, skills, or workspaces
roots through global/default file-root configuration.

#### Scenario: Public file access is session-scoped only

- **GIVEN** a Public-audience session with default file access configuration
- **WHEN** it resolves implicit readable roots
- **THEN** the resolved roots include only session-scoped locations
- **AND** identity, skills, and workspaces roots are absent unless explicitly
configured for a non-Public audience
10 changes: 1 addition & 9 deletions openspec/specs/background-job-execution/spec.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,4 @@
# background-job-execution Specification

## Purpose

Define the background job execution infrastructure: manager lifecycle,
process execution, pipeline routing, session state tracking, job monitoring
tool, delivery scoping, and deduplication.

## Requirements
## ADDED Requirements

### Requirement: Background job manager lifecycle

Expand Down
Loading