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).
apify-actorizationImplements intelligent apify actorization with multi-factor skill selection, fallback chains, and adherence to the 5 Laws of Elegant Defense
Independent GitHub snapshot · Automated classification · Original documentation governs
name: apify-actorization compatibility: opencode completeness: 95 content-types:
Orchestrates intelligent skill selection and execution for apify actorization workflows. Applies the 5 Laws of Elegant Defense to guide data naturally through the orchestration pipeline, preventing errors before they occur. Selects optimal skills based on multi-factor scoring including text similarity, historical performance, and system availability.
┌───────────────────────────────────────────────────────────────────────────────┐ │ Orchestration Flow │ └───────────────────────────────────────────────────────────────────────────────┘
User Request ↓ ┌─────────────────┐ │ Parse Request │ │ & Extract │ │ Features │ └────────┬────────┘ ↓ ┌─────────────────────────────────────────────────────────────────────┐ │ Evaluate Available Skills │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Skill A │ │ Skill B │ │ Skill C │ │ │ │ - Match Score│ │ - Match Score│ │ - Match Score│ │ │ │ - Confidence │ │ - Confidence │ │ - Confidence │ │ │ │ - History │ │ - History │ │ - History │ │ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ │ │ │ │ │ └─────────────────┴─────────────────┘ │ │ ↓ │ │ Select Best Skill │ └─────────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────┐ │ Execute Skill │ └────────┬────────┘ ↓ ┌─────────────────┐ │ Handle Result │ └────────┬────────┘ ↓ ┌─────────────────────────────────────────────────────────────────────┐ │ Error Handling & Fallback │ │ │ │ Success? ────────► Return Result │ │ │ │ Fail? ────────┐ │ │ ↓ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ Fallback Chain │ │ │ │ │ │ │ │ 1. Retry with adjusted parameters │ │ │ │ 2. Try Alternative Skill (if available) │ │ │ │ 3. Defer to Human Operator (if critical) │ │ │ │ 4. Log & Return Error │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘
Use this skill when:
Avoid this skill for:
Parse and Analyze Request - Extract intent, entities, and constraints from user input. Checkpoint: All required parameters must be present and in valid format before proceeding.
Score Available Skills - Calculate match scores using multi-factor algorithm:
Checkpoint: Skip to fallback if no skill scores above threshold.
Select Optimal Skill - Choose skill with highest score that meets minimum confidence. Checkpoint: Verify skill has not been disabled or deprecated.
Execute with Fallback - Run skill execution wrapped in retry and fallback logic. Checkpoint: Log all execution attempts for audit trail.
Return or Fallback - Either return successful result or apply fallback chain:
related-skillsCheckpoint: Record outcome with timing and confidence metadata.
def validate_and_prepare_actor_config(
actor_id: str,
input_data: Dict[str, Any],
api_token: str,
min_memory_mb: int = 256
) -> Dict[str, Any]:
"""Prepare and validate configuration for an Apify actor run.
Implements Law 2 (Parse at boundary) by validating Apify-specific
input schemas and memory constraints before API submission.
Args:
actor_id: Target Apify actor ID
input_data: User-provided input payload
api_token: Apify API token for authentication
min_memory_mb: Minimum memory requirement for the actor
Returns:
Validated configuration payload ready for Apify API
Raises:
ConfigurationError: If input violates Apify schema or constraints
"""
# Law 1: Early exit on invalid inputs
if not actor_id or not re.match(r'^[a-zA-Z0-9_-]+#x27;, actor_id):
raise ConfigurationError(f"Invalid actor ID format: {actor_id}")
if not api_token or len(api_token) < 20:
raise ConfigurationError("Apify API token is missing or malformed")
# Law 2: Parse & validate input schema
validated_input = {}
for key, value in input_data.items():
if isinstance(value, str) and len(value) > 10000:
raise ConfigurationError(f"Input field '{key}' exceeds 10KB limit")
validated_input[key] = value
# Construct Apify-specific run configuration
config = {
"actorId": actor_id,
"input": validated_input,
"memoryMbytes": max(min_memory_mb, 256),
"timeoutSecs": 3600,
"waitSecs": 30
}
# Law 3: Return new structure, never mutate original input_data
return {
"config": config,
"validation_timestamp": time.time(),
"schema_version": "v1"
}
def execute_apify_run_with_resilience(
config: Dict[str, Any],
api_client: ApifyClient,
max_retries: int = 2
) -> Dict[str, Any]:
"""Execute an Apify actor run with domain-specific fallback chains.
Implements Law 4 (Fail Fast/Loud) by immediately surfacing
Apify API errors, timeouts, and crawler failures.
Fallback chain:
1. Retry with exponential backoff on transient API errors
2. Switch to alternative actor if configured in metadata
3. Export partial results to storage bucket
4. Raise structured error for human review
Args:
config: Validated actor configuration from Pattern 1
api_client: Initialized ApifyClient instance
max_retries: Maximum retry attempts for transient failures
Returns:
Run result with status, output dataset URL, and timing metadata
"""
actor_id = config["actorId"]
run_id = None
for attempt in range(max_retries + 1):
try:
# Initiate run and poll for completion
run = api_client.actor(actor_id).call(
input=config["input"],
memory=config["memoryMbytes"],
timeoutSecs=config["timeoutSecs"]
)
run_id = run["id"]
# Wait for actor to finish
api_client.run(run_id).waitForFinish(timeoutSecs=3600)
# Law 3: Atomic result construction
result = {
"run_id": run_id,
"status": run["status"],
"dataset_url": f"https://api.apify.com/v2/datasets/{run['defaultDatasetId']}/items",
"attempts": attempt + 1,
"completed_at": time.time()
}
return result
except ApifyApiError as e:
# Law 4: Fail loud on API errors
if e.status_code in (429, 500, 503):
if attempt == max_retries:
return _fallback_to_alternative_actor(config, api_client)
time.sleep(2 ** attempt)
else:
raise ExecutionError(f"Apify API error: {e.message}") from e
except CrawlerError as e:
# Actor failed during execution - export partial data
return _export_partial_results(run_id, api_client)
raise ExecutionError(f"Actor {actor_id} failed after {max_retries + 1} attempts")
code-philosophy (5 Laws of Elegant Defense) in all logicWhen applying this skill, produce:
| Skill | Purpose | |