brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
automation-pilot-command-reviewReview production commands, inputs, and catalogs for Automation Pilot. Validates file structure, naming conventions, security requirements, mandatory patterns, and best practices. Use when reviewing .command.json, .input.json, or .catalog.json files.
Independent GitHub snapshot · Automated classification · Original documentation governs
Validate production commands meet structural, security, and quality standards.
⚠️ CRITICAL - When reviewing as an AI assistant:
⚠️ JSON FILES DO NOT SUPPORT COMMENTS:
// or /* */ comments - JSON syntax doesn't allow comments-1 = Network/connection failure (standard in this codebase)408 = Request Timeout429 = Too Many Requests500, 502, 503, 504 = Server errors❌ WRONG - Never suggest this:
// Consider defining these in a comment
"expression": "$([408, 429, -1] | filter(...))"
✅ CORRECT - This pattern is standard and needs no comment:
"expression": "$([408, 429, 500, 502, 503, 504, -1] | filter(. == $.<httpExecutorAlias>.output.status) | length)"
Standard patterns that should NOT be flagged:
semantic: "AND" / semantic: "OR" conditions - these are clear, not "confusing"$({...} | toObject) for building JSON objects - this IS the cleanest approachFile name MUST match JSON "name" field EXACTLY:
✅ CORRECT
File: CreateDirectory.command.json
JSON: "name": "CreateDirectory"
❌ WRONG (Build will fail!)
File: CreateDirectory.command.json
JSON: "name": "CreateDir"
File Extensions:
.command.json.input.json.catalog.json| Element | Convention | Example | Max Length |
|---|---|---|---|
| Command names | PascalCase | CreateDirectory, HttpRequest | 32 chars |
| Input/Output keys | camelCase | resourceName, subAccount | 32 chars |
| Aliases | camelCase | getResource, createInstance | 32 chars |
| Catalog IDs | lowercase | http-sapcp, cf-sapcp | 32 chars |
❌ Common Violations:
testDelayedVoidWithDynamicMessage = 35 chars)create_directory instead of CreateDirectory)Validate input/output key definitions:
allowedValues, suggestedValues, allowedValuesFromInputKeys, suggestedValuesFromInputKeys exist but should only be present when neededallowedValuesFromInputKeys: CF regions → ["metadata-sapcp:CfRegionData:1"], Neo regions → ["metadata-sapcp:NeoRegionData:1"]Example:
{
"timeout": {
"type": "number",
"sensitive": false,
"required": false,
"minSize": null,
"maxSize": null,
"minValue": null,
"maxValue": null,
"defaultValue": "5",
"defaultValueFromInput": null,
"description": "Request timeout in seconds"
}
}
These fields MUST have "sensitive": true:
"password": {
"type": "string",
"sensitive": true,
"required": true,
"description": "The password for the specified technical user or the client secret for the specified OAuth 2.0 client ID to be used for authentication. Related input keys: 'user' or 'tokenUrl'"
}
Fields requiring sensitive flag:
passwordclientSecretrefreshTokenserviceKeySensitive data should be stored in Input definitions and referenced:
Pattern 1: Load Entire Input (when you need multiple fields)
"values": [{
"alias": "TechnicalUser",
"valueFrom": {
"inputReference": "OQ-<<<TENANT_ID>>>:TechnicalUser:1",
"inputKey": null // null = load all fields
}
}]
// Access: $(.TechnicalUser.user), $(.TechnicalUser.password)
Pattern 2: Load Specific Field
"values": [{
"alias": "Password",
"valueFrom": {
"inputReference": "OQ-<<<TENANT_ID>>>:ServiceAccount:1",
"inputKey": "password" // Load only this field
}
}]
// Access: $(.Password)
Pattern 3: Direct Input (production commands)
"inputKeys": {
"password": {
"type": "string",
"sensitive": true,
"required": true
}
}
// Access in executors: $(.execution.input.password)
Pattern 4: Dynamic Metadata Lookup
"values": [{
"alias": "regionData",
"valueFrom": {
"inputReference": "metadata-sapcp:CfRegionData:1",
"inputKey": "$(.execution.input.region)" // Dynamic key
}
}]
// Access: $(.regionData.cfApiUrl), $(.regionData.uaaTokenUrl)
⚠️ All descriptions of the following parameters must be one of these exact sentences or start with them. No variations, alternatives, or creative rewording allowed for these Input and Output keys!
See the complete authoritative list in ../automation-pilot-command-generation/references/description-patterns.md.
Validation Rules:
| Element | Required Sanitization | Validation Check |
|---|---|---|
| URL parameters | toUrlEncoded | Flag any URL with $(. that lacks | toUrlEncoded |
| JSON string values | toEscapedJson | Flag JSON body strings with $(. that lack | toEscapedJson |
| HTTP headers | getCaseInsensitive | Flag direct header access (e.g., .headers.Content-Type) |
| Response transformers | toObject, toNumber, toString | Verify transformer present for JSON parsing |
Non-Existent Functions (DO NOT USE):
| ❌ Wrong | ✅ Correct |
|---|---|
| type (doesn't exist) | Use NOT_EQUALS "" to check existence |
| isBool / | isString (don't exist) | Check value directly with EQUALS |
| isNil (doesn't exist) | Use | length with EQUALS "0" |
| Invented expression functions | Verify with grep -r "| functionName" content/**/*.command.json |
| Element | Rule | Check |
|---|---|---|
| Timeout | ≤ 10 seconds | Flag timeout > 10 (unless justified) |
| Retry (GET/DELETE) | Status codes: 408, 429, 500, 502, 503, 504, -1 | Verify autoRetry present for idempotent ops |
| Retry (POST/PATCH) | Status codes: 429, 502, 503, 504 only | Flag 500 in POST retry (non-idempotent) |
| Error Messages | Dynamic values in single quotes | Flag static messages like "Resource not found" |
| Error Structure | when.semantic.OR.conditions.cases | Verify proper error condition structure |
For HTTP implementation details: See executor-httprequest SKILL
Focus: Sensitive flags, mixed sensitive/non-sensitive keys
{
"id": "OQ-<<<TENANT_ID>>>:TechnicalUser:1",
"name": "TechnicalUser",
"description": "Technical user credentials for testing",
"catalog": "OQ-<<<TENANT_ID>>>",
"version": 1,
"keys": {
"password": {
"type": "string",
"sensitive": true,
"description": null
},
"user": {
"type": "string",
"sensitive": false,
"description": null
},
"mail": {
"type": "string",
"sensitive": false,
"description": null
}
},
"values": {
"password": "",
"user": "technical-user",
"mail": "technical.user@example.com"
}
}
Key Points:
password marked as sensitive: truesensitive: falseFocus: Multiple error conditions, authentication failures
{
"executors": [{
"execute": "http-sapcp:HttpRequest:1",
"input": {
"url": "https://api.example.com/resource",
"method": "POST"
},
"alias": "createResource",
"description": null,
"progressMessage": null,
"initialDelay": null,
"pause": null,
"when": null,
"validate": null,
"autoRetry": null,
"repeat": null,
"errorMessages": [
{
"message": "Resource '$(.execution.input.name)' already exists",
"when": {
"semantic": "OR",
"conditions": [{
"semantic": "OR",
"cases": [{
"expression": "$(.createResource.output.status)",
"operator": "EQUALS",
"semantic": "OR",
"values": ["409"]
}]
}]
}
},
{
"message": "Authentication failed. Check user '$(.execution.input.user)' and password",
"when": {
"semantic": "OR",
"conditions": [{
"semantic": "OR",
"cases": [{
"expression": "$(.createResource.output.status)",
"operator": "EQUALS",
"semantic": "OR",
"values": ["401", "403"]
}]
}]
}
},
{
"message": "Invalid input: $(.createResource.output.body | toObject.error)",
"when": {
"semantic": "OR",
"conditions": [{
"semantic": "OR",
"cases": [{
"expression": "$(.createResource.output.status)",
"operator": "EQUALS",
"semantic": "OR",
"values": ["400"]
}]
}]
}
}
],
"dryRun": null
}]
}
Key Points:
Validate in this order:
"name" field exactly (PascalCase for commands/inputs).command.json, .input.json, or .catalog.jsonpassword → "sensitive": trueclientSecret → "sensitive": truerefreshToken → "sensitive": trueserviceKey → "sensitive": true"sensitive": truepassword → Exact pattern: "The password for the specified technical user..."user → Exact pattern: "The name of a technical user or OAuth 2.0 client ID..."region → Exact pattern: "The technical name of the [CF/Neo] region. Example: ..."toUrlEncoded, toEscapedJson, getCaseInsensitive, avoid non-existent functionsdefault values"tags": {"autopi:deprecated": ""}❌ CRITICAL: File name ≠ JSON "name" → Build fails
❌ CRITICAL: Name > 32 chars → Build fails
❌ CRITICAL: Missing sensitive flag → Security breach
❌ HIGH: Generic descriptions → Fails review
❌ HIGH: No URL encoding (toUrlEncoded) → Breaks with special chars
❌ HIGH: No JSON escaping (toEscapedJson) → Breaks with quotes
❌ MEDIUM: Timeout > 10s unjustified → Performance issue
❌ MEDIUM: Generic error messages → Poor UX
automation-pilot-command-generation for creating commands before reviewautomation-pilot-content-management-via-api for deploying reviewed commands