From prism-devtools
Use to assess non-functional requirements (security, performance, reliability, maintainability) through E2E integration testing patterns.
npx claudepluginhub resolve-io/.prismThis skill uses the workspace's default tool permissions.
<!-- Powered by PRISMâ„¢ System -->
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
Provides patterns for autonomous Claude Code loops: sequential pipelines, agentic REPLs, PR cycles, de-sloppify cleanups, and RFC-driven multi-agent DAGs. For continuous dev workflows without intervention.
Applies NestJS patterns for modules, controllers, providers, DTO validation, guards, interceptors, config, and production TypeScript backends with project structure and bootstrap examples.
E2E integration-focused NFR validation targeting the core four: security, performance, reliability, maintainability through real system testing.
nfr_validation sectionrequired:
- story_id: '{epic}.{story}' # e.g., "1.3"
- story_path: `../core-config.yaml` for the `devStoryLocation`
optional:
- architecture_refs: `../core-config.yaml` for the `architecture.architectureFile`
- technical_preferences: `../core-config.yaml` for the `technicalPreferences`
- acceptance_criteria: From story file
Assess non-functional requirements through E2E integration testing patterns and generate:
nfr_validation section with integration test evidenceqa.qaLocation/assessments/{epic}.{story}-nfr-{YYYYMMDD}.mdIf story_path or story file can't be found:
Interactive mode: Ask which NFRs to assess Non-interactive mode: Default to core four (security, performance, reliability, maintainability)
Which NFRs should I assess? (Enter numbers or press Enter for default)
[1] Security (default)
[2] Performance (default)
[3] Reliability (default)
[4] Maintainability (default)
[5] Usability
[6] Compatibility
[7] Portability
[8] Functional Suitability
> [Enter for 1-4]
Look for NFR requirements in:
docs/architecture/*.md filesdocs/technical-preferences.mdInteractive mode: Ask for missing thresholds Non-interactive mode: Mark as CONCERNS with "Target unknown"
No performance requirements found. What's your target response time?
> 200ms for API calls
No security requirements found. Required auth method?
> JWT with refresh tokens
Unknown targets policy: If a target is missing and not provided, mark status as CONCERNS with notes: "Target unknown"
For each selected NFR, prioritize integration test evidence:
Generate ONLY for NFRs actually assessed (no placeholders):
# Gate YAML (copy/paste):
nfr_validation:
_assessed: [security, performance, reliability, maintainability]
security:
status: CONCERNS
notes: 'Auth endpoints tested but no rate limiting integration tests'
performance:
status: PASS
notes: 'API response times < 200ms verified via integration tests with real DB'
reliability:
status: PASS
notes: 'Health check endpoints and DB failover tested via containers'
maintainability:
status: CONCERNS
notes: 'Integration test coverage at 65%, missing multi-tenant isolation tests'
quality_score = 100
- 20 for each FAIL attribute
- 10 for each CONCERNS attribute
Floor at 0, ceiling at 100
If technical-preferences.md defines custom weights, use those instead.
ALWAYS save to: qa.qaLocation/assessments/{epic}.{story}-nfr-{YYYYMMDD}.md
# NFR Assessment: {epic}.{story}
Date: {date}
Reviewer: Quinn
<!-- Note: Source story not found (if applicable) -->
## Summary
- Security: CONCERNS - Auth flows tested but missing rate limiting E2E tests
- Performance: PASS - <200ms verified via integration tests with real containers
- Reliability: PASS - Health checks and failover validated in test environment
- Maintainability: CONCERNS - Integration test coverage below target
## Critical Issues
1. **Missing rate limiting integration tests** (Security)
- Risk: Auth endpoints vulnerable to brute force without E2E validation
- Fix: Add integration tests that verify rate limiting behavior
2. **Insufficient multi-tenant isolation testing** (Maintainability)
- Risk: Cross-tenant data leakage not validated
- Fix: Add E2E tests that verify tenant isolation at API level
## Quick Wins
- Add rate limiting integration tests: ~3 hours
- Add multi-tenant isolation E2E tests: ~4 hours
- Add performance monitoring to existing integration tests: ~1 hour
End with this line for the review task to quote:
NFR assessment: qa.qaLocation/assessments/{epic}.{story}-nfr-{YYYYMMDD}.md
Always print at the end:
Gate NFR block ready → paste into qa.qaLocation/gates/{epic}.{story}-{slug}.yml under nfr_validation
PASS if:
CONCERNS if:
FAIL if:
PASS if:
CONCERNS if:
FAIL if:
PASS if:
CONCERNS if:
FAIL if:
PASS if:
CONCERNS if:
FAIL if:
security:
- Auth/authz E2E test coverage
- Multi-tenant isolation tests
- Token validation in real scenarios
- Security headers validation
- Rate limiting integration tests
performance:
- API response time integration tests
- Database performance with real queries
- Load testing of endpoints
- Container resource usage
- Multi-tenant performance isolation
reliability:
- Health check endpoint tests
- Error handling E2E scenarios
- Database failover tests
- Service recovery tests
- Container restart resilience
maintainability:
- Integration test coverage %
- Multi-tenant test scenarios
- API contract test coverage
- Test environment fidelity
- E2E test maintenance burden
// Authentication/Authorization E2E Tests
[Fact]
public async Task Endpoint_WithoutAuthentication_ShouldReturnUnauthorized()
{
var client = application.GetHttpClient();
client.DefaultRequestHeaders.Authorization = null;
var response = await client.GetAsync("/api/protected-endpoint");
response.StatusCode.ShouldBe(HttpStatusCode.Unauthorized);
}
// Multi-tenant Isolation Tests
[Fact]
public async Task Endpoint_ShouldNotLeakDataBetweenTenants()
{
var client = application.GetHttpClient();
var tenant1Data = await CreateTenantSpecificData(tenant1Id);
var tenant2Token = await GetTenantToken(tenant2Id);
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", tenant2Token);
var response = await client.GetAsync($"/api/tenant-data/{tenant1Data.Id}");
response.StatusCode.ShouldBe(HttpStatusCode.Forbidden);
}
// API Response Time Validation
[Fact]
public async Task Endpoint_ShouldMeetPerformanceTarget()
{
var client = application.GetHttpClient();
// Warm-up request to eliminate cold-start effects
await client.GetAsync("/api/endpoint");
var stopwatch = Stopwatch.StartNew();
var response = await client.GetAsync("/api/endpoint");
stopwatch.Stop();
response.StatusCode.ShouldBe(HttpStatusCode.OK);
stopwatch.ElapsedMilliseconds.ShouldBeLessThan(200);
}
// Database Performance with Real Queries
[Fact]
public async Task DatabaseQuery_ShouldPerformWithinLimits()
{
var dbContext = await application.GetRequiredService<TenantDbContext>();
var stopwatch = Stopwatch.StartNew();
var results = await dbContext.LargeTable
.Where(x => x.IndexedField == "value")
.ToListAsync();
stopwatch.Stop();
stopwatch.ElapsedMilliseconds.ShouldBeLessThan(100);
}
// Health Check Validation
[Fact]
public async Task HealthCheck_ShouldReportCorrectStatus()
{
var client = application.GetHttpClient();
var response = await client.GetAsync("/health/tenant-id");
response.StatusCode.ShouldBe(HttpStatusCode.OK);
var content = await response.Content.ReadAsStringAsync();
content.ShouldContain("Healthy");
}
// Database Connection Resilience
[Fact]
public async Task Service_ShouldHandleDatabaseFailure()
{
var resolver = await application.GetRequiredService<IDbContextResolver>();
var connected = await resolver.ConnectToTenant(tenantId);
connected.ShouldBeTrue();
// Simulate DB connection issues and verify graceful handling
}
// TestContainers for Real Database Integration
public class DatabaseFixture : IAsyncLifetime
{
private readonly MsSqlContainer container = new MsSqlBuilder().Build();
public string ConnectionString => container.GetConnectionString();
public Task InitializeAsync() => container.StartAsync();
public Task DisposeAsync() => container.DisposeAsync().AsTask();
}
// Application Factory with Real Dependencies
public class TestApplicationFactory : WebApplicationFactory<Program>
{
private readonly DatabaseFixture databaseFixture;
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureTestServices(services =>
{
// Use real database connection from TestContainer
services.AddDbContext<TenantDbContext>(options =>
options.UseSqlServer(databaseFixture.ConnectionString));
});
}
}
Use these when assessing beyond the core four.
performance_integration_testing:
api_response_times:
endpoint_auth: 45ms (target: <100ms)
endpoint_tenant_data: 180ms (target: <200ms)
endpoint_health_check: 25ms (target: <50ms)
database_performance:
tenant_connection_time: 15ms
query_large_table: 85ms (with proper indexes)
multi_tenant_isolation_overhead: 5ms
container_performance:
memory_usage: 245MB (target: <500MB)
cpu_usage: 15% (target: <50%)
startup_time: 3.2s (target: <5s)
load_testing_results:
concurrent_users: 50 (passed)
max_throughput: 150 rps
error_rate_under_load: 0.1%