Docs & rules

slopus/happy-agentGitHub

This is a public, read-only report. Striff reads this repository's docs, turns each sentence that makes a claim about the code into a rule, and checks the rule against the code on the default branch. How this works

maina394137Last read 3h ago

Is this yours? Install to manage it

Once installed, Striff checks every pull request.

Documents
Rules
73
4
4
69
7
7
10
10
37
32
1
1
2
2
6
2
4
1
1
1
1
2
2
17
17
2
2
5
15
2
13
59 docs
slopus/happy-agentOpen repository

slopus/happy-agent — documented rules

73 of 73 rules, printed October 12, 2026.

The sentence in your docs
Read Oct 11
the session interface must not take a skills option.
2 rules from this sentence
Session may not have skills
Holds
SessionOptions may not have skills
Holds
Read Oct 11
AnthropicProvider, CodexProvider, GrokProvider, and ResponsesProvider.
4 rules from this sentence
AnthropicProvider is exported
Holds
CodexProvider is exported
Holds
GrokProvider is exported
Holds
ResponsesProvider is exported
Holds
Read Oct 11
updateMetadata is available from AgentBase, Agent, AgentRef, AgentSystem, and AgentSystemRef;
5 rules from this sentence
AgentBase has updateMetadata
checks “updateMetadata is available from AgentBase”
Holds
Agent has updateMetadata
checks “updateMetadata is available from AgentBase, Agent, AgentRef, AgentSystem”
Holds
AgentRef has updateMetadata
checks “updateMetadata is available from”
Holds
AgentSystem has updateMetadata
checks “updateMetadata is available from”
Holds
AgentSystemRef has updateMetadata
checks “updateMetadata is available from”
Holds
Read Oct 11
parentOf and childOf query the resulting direct relationship, and AgentRef.parent exposes it.
AgentRef has parent
Holds
Read Oct 11
AgentKV.getOrCreate(ctx, key, factory) standardizes durable allocate-once values.
AgentKV has a getOrCreate method
Holds
Read Oct 11
gym.defaultSessionId is the default agent the gym opens in its root workspace.
AgentGym has defaultSessionId
Holds
Read Oct 11
Every message names the provider, model, effort and tier from gym.selection unless the scenario overrides them.
AgentGym has selection
Holds
Read Oct 11
gym.http.ok(method, path, body?) returns the body of a request that had to succeed.
AgentGym has http
Holds
Read Oct 11
gym.waitForRun(runId) is the same wait for one specific run, and gym.send uses it.
AgentGym has a waitForRun method
Holds
Read Oct 11
gym.sessionEvents() filters that same public journal to one agent;
AgentGym has a sessionEvents method
Holds
Read Oct 11
gym.workspacePath is the agent's working directory and the folder the emulated machine is mounted over.
AgentGym has workspacePath
Holds
Read Oct 11
gym.restart() closes the daemon and starts another one on the same folder.
AgentGym has a restart method
Holds
Read Oct 11
gym.waitUntil(check, description, timeoutMs) polls until check returns something other than undefined, and reports what it saw when it gives up.
AgentGym has a waitUntil method
Holds
Read Oct 11
That nothing broke quietly — gym.errors is empty and gym.inference.unscripted is empty.
2 rules from this sentence
AgentGym has errors
checks “gym.errors”
Holds
AgentGym has inference
checks “gym.inference.unscripted”
Holds
Read Oct 11
Isolation. A module imports Happy Agent from nowhere and reaches for no global. Where two capabilities must meet, one module takes the other: ModelSwitchModule takes HistoryModule, WorkspacesModule takes ProjectsModule, TerminalsModule takes both, WorkflowsModule takes CollaborationModule.
5 rules from this sentence
ModelSwitchModule depends on HistoryModule
checks “ModelSwitchModule takes HistoryModule”
Holds
WorkspacesModule depends on ProjectsModule
checks “WorkspacesModule takes ProjectsModule”
Holds
TerminalsModule depends on ProjectsModule
checks “ModelSwitchModule takes HistoryModule, WorkspacesModule takes ProjectsModule, TerminalsModule takes both, WorkflowsModule takes CollaborationModule.”
Holds
TerminalsModule depends on WorkspacesModule
checks “ModelSwitchModule takes HistoryModule, WorkspacesModule takes ProjectsModule, TerminalsModule takes both, WorkflowsModule takes CollaborationModule.”
Holds
WorkflowsModule depends on CollaborationModule
checks “WorkflowsModule takes CollaborationModule”
Holds
Read Oct 11
Listing an agent's collaborators is AgentSystem.childOf plus config(id).metadata.title, which callers do directly.
AgentSystem has childOf
Holds
Read Oct 11
ComputeModule takes ConfigModule and SecretsModule.
ComputeModule depends on ConfigModule, and ComputeModule depends on SecretsModule
Holds
Read Oct 11
A host injects the same ComputeModule into SystemPromptModule for AGENTS.md discovery.
SystemPromptModule depends on ComputeModule
Holds
Read Oct 11
The module takes the artifacts and tasks modules for this;
HappyModule depends on TasksModule
Holds
Read Oct 11
A provider's kind in machine and session metadata is its provider type from ConfigModule.providerType, the same value /v0/config reports.
ConfigModule has providerType
Holds
Read Oct 11
HappyModule owns one HappyConnection per authenticated team user, or the existing single connection in standalone mode.
HappyModule depends on HappyConnection
Holds
Read Oct 11
Each module-owned HappyConnection does that work, and hands its own pieces only the narrow contract each of them needs — HappySessionOperations for the session client, HappySpawnOperations for a phone starting something new — so the wire handling can be exercised without a daemon behind it.
2 rules from this sentence
HappyConnection depends on HappySessionOperations
Holds
HappyConnection depends on HappySpawnOperations
Holds
Read Oct 11
HTTP and Happy share GitModule.resource: facts, merge base with origin/main, counts, file paths (including rename sources), truncation and scan time, without private bytes.
GitModule has resource
Holds
Read Oct 11
ModelSwitchModule calls history.readExcerpt itself, and always knows HistoryModule's one tool is read_agent_history because that name is fixed.
ModelSwitchModule depends on HistoryModule
Holds
Read Oct 11
Instead it installs two AgentModule hooks that act on every tool call any other module offers, and one hook that supplies the model's instructions: … permissionModeChanged / permissionModeChangedTransact announce a mode change to every subscriber, end the commands still running under the wider mode by asking ComputeModule for them, report a failed cleanup when one occurs, and afterAgentSettled clears the per-agent refusal circuit once a run ends.
PermissionsModule depends on ComputeModule
Holds
Read Oct 11
The GitHub token is configuration's. ConfigModule.githubToken is where a personal access token already lives, beside every other credential a person configures, and it is read at the moment a clone needs one.
ConfigModule has githubToken
Holds
Read Oct 11
The local Git identity is Git's. GitModule.localIdentity() asks Git what this machine commits as, because running Git is what that module is for.
GitModule has a localIdentity method
Holds
Read Oct 11
SecretsModule is a class;
SecretsModule is a concrete implementation
Holds
Read Oct 11
SecretsModule is a class; a host or another module calls its methods directly with a Context and an opaque catalog owner ID.
8 rules from this sentence
SecretsModule has a list method
Holds
SecretsModule has a reference method
Holds
SecretsModule has a resolveForHost method
Holds
SecretsModule has a resolveForCommand method
Holds
SecretsModule has a formatForModel method
Holds
SecretsModule has a formatPageForModel method
Holds
SecretsModule has a formatAttachmentForModel method
Holds
SecretsModule has a formatDetachForModel method
Holds
Read Oct 11
Every mutating method (register, update, remove, attach/attachWithReference, detach) runs inside the Agent Base transaction, emitting one SecretEvent (secret_registered, secret_updated, secret_removed, secret_attached, or secret_detached) only when the mutation actually changed something.
6 rules from this sentence
SecretsModule has a register method
Holds
SecretsModule has an update method
Holds
SecretsModule has a remove method
Holds
SecretsModule has an attach method
Holds
SecretsModule has a detach method
Holds
SecretsModule has an attachWithReference method
checks “attachWithReference”
Holds
Read Oct 11
onEventTransactional(listener) runs the listener inside the committing transaction — throwing there rolls the mutation back — and onEvent(listener) runs it after the outer transaction commits.
2 rules from this sentence
SecretsModule has an onEventTransactional method
checks “onEventTransactional(listener)”
Holds
SecretsModule has an onEvent method
Holds
Read Oct 11
the agent-tree read is the only thing that uses it.
UsageModule has read
Holds
Read Oct 11
beforeStart(ctx, agents) is where the module takes hold of the agent collection;
UsageModule has a beforeStart method
Holds
Read Oct 11
Each vendor credential class has a tryLoad() that accepts explicit values or reads the native client's on-disk credentials.
8 rules from this sentence
ClaudeCodeCredential has a tryLoad method
Holds
ClaudeOAuthCredential has a tryLoad method
Holds
ClaudeAuthTokenCredential has a tryLoad method
Holds
ClaudeApiKeyCredential has a tryLoad method
Holds
BedrockBearerTokenCredential has a tryLoad method
Holds
BedrockAwsCredential has a tryLoad method
Holds
CodexSessionCredential has a tryLoad method
Holds
GrokSessionCredential has a tryLoad method
Holds
Read Oct 11
CodexSessionCredential.refreshForMaintenance({ signal? }) and GrokSessionCredential.refreshForMaintenance({ signal? }) also renew stored logins without inference.
2 rules from this sentence
CodexSessionCredential has a refreshForMaintenance method
checks “CodexSessionCredential.refreshForMaintenance({ signal? })”
Holds
GrokSessionCredential has a refreshForMaintenance method
checks “GrokSessionCredential.refreshForMaintenance({ signal? })”
Holds
Read Oct 11
provider.session(id, options) takes the immutable, model-visible configuration — the things the model will actually see:
BaseProvider has a session method
Holds
Read Oct 11
Each run() takes a stdlib context first, then the complete transcript plus anything you want to vary per turn: model, reasoning effort, service-tier intent, and structured output schema.
BaseSession has a run method
Holds
Read Oct 11
When a transcript gets long, compact() asks the provider to produce a shorter replacement context using its native compaction protocol.
BaseSession has a compact method
Holds
73 rules from 15 docs

See these where the change is. The browser extension puts a pull request's doc findings, and a diagram of what it changed, on the GitHub page itself, so the code and what your docs say about it are side by side.