Install
$ agentstack add skill-dungnotnull-accessible-shopping-visually-impaired-agent-skill-accessible-shopping-visually-impaired-agent-skill ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
SKILL.md — Skill Registry Documentation
Overview
The accessible-shopping-visually-impaired skill uses a modular, registry-based architecture for managing sub-skills, tools, and lifecycle hooks. This document describes how skills are registered, resolved, executed, and validated.
Architecture Diagram
┌─────────────────────────────────────────────────────────────────────┐
│ Skill Registry System │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ Main Skill │──────│ Skill Manager │──────│ Sub-Skills │ │
│ │ (main.md) │ │ (Registry) │ │ (sub-*.md) │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Tool Registry │ │ Hooks System │ │
│ │ (JSON Schemas) │ │ (Lifecycle) │ │
│ └─────────────────┘ └─────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Config Manager │ │ Monitoring │ │
│ │ (env/flags) │ │ (logging/metrics)│ │
│ └─────────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
Skill Registration
Format Specification
Each skill file must include YAML frontmatter:
---
name: skill-name
description: one-line summary of when to trigger
---
Registration Process
- Scan Discovery: The system scans the
skills/directory for.mdfiles - Metadata Extraction: Parses YAML frontmatter from each file
- Validation: Validates required fields (name, description)
- Registry Storage: Stores in SkillRegistry with metadata
Example
---
name: sub-gather-requirements
description: Clarify the object of analysis, constraints, timeframe, available inputs, target audience, and language before any data fetching.
---
## Role & Persona
...
Skill Resolution
Resolution Logic
When a skill invocation is requested:
- Parse Request: Extract skill name and context
- Registry Lookup: Find skill by name in registry
- Version Resolution: Select appropriate version if multiple exist
- Dependency Check: Verify required tools and dependencies are available
- Load Skill: Load full skill content into context
Resolution Cache
Skills are cached after first load to improve performance:
# Cache entry structure
{
"skill_name": {
"version": "1.0.0",
"loaded_at": "2026-07-15T10:30:00Z",
"content": "...",
"metadata": {...}
}
}
Skill Execution
Execution Flow
User Request
│
▼
┌─────────────────┐
│ Pre-Flight Check│
│ - Language det. │
│ - Config load │
│ - Trace ID gen │
└────────┬────────┘
│
▼
┌─────────────────┐ ┌──────────────────┐
│ Hook: pre_skill │────►│ Skill Execution │
│ _invoke │ │ - Read content │
└─────────────────┘ │ - Parse workflow │
▲ │ - Execute steps │
│ └─────────┬────────┘
┌─────────────────┐ │
│ Hook: post_skill│◄─────────────┘
│ _invoke │
└─────────────────┘
│
▼
Quality Gate Check
│
┌────┴────┐
▼ ▼
Pass Fail (retry)
│ │
▼ ▼
Output Auto-fix
Execution Context
Each skill execution includes:
interface ExecutionContext {
trace_id: string;
user_id?: string;
language: "en" | "vi" | "auto";
input_params: Record;
config: SystemConfig;
metadata: {
start_time: DateTime;
retry_count: number;
degradation_level: 0-4;
};
state: Map;
}
Skill Validation
Validation Levels
- Structural Validation
- Required frontmatter fields present
- Valid YAML format
- Required sections present
- Content Validation
- Workflow steps are numbered
- Quality gates defined
- Tools listed are available
- Runtime Validation
- Parameters match schema
- Required inputs present
- Output format valid
Validation Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Skill Validation Schema",
"type": "object",
"required": ["name", "description"],
"properties": {
"name": {
"type": "string",
"pattern": "^[a-z0-9-]+$",
"minLength": 3,
"maxLength": 50
},
"description": {
"type": "string",
"minLength": 20,
"maxLength": 200
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+$"
}
}
}
Input/Output JSON Schemas
Skill Input Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Skill Input Schema",
"type": "object",
"properties": {
"skill_name": {
"type": "string",
"description": "Name of skill to invoke"
},
"parameters": {
"type": "object",
"description": "Skill-specific parameters"
},
"context": {
"type": "object",
"properties": {
"trace_id": {"type": "string"},
"language": {"type": "string", "enum": ["en", "vi"]},
"user_id": {"type": "string"}
}
},
"options": {
"type": "object",
"properties": {
"dry_run": {"type": "boolean"},
"verbose": {"type": "boolean"},
"timeout_seconds": {"type": "integer"}
}
}
},
"required": ["skill_name"]
}
Skill Output Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Skill Output Schema",
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": ["success", "partial", "failed"]
},
"result": {
"type": "object",
"description": "Skill execution result following output template"
},
"metadata": {
"type": "object",
"properties": {
"trace_id": {"type": "string"},
"execution_time_ms": {"type": "number"},
"token_usage": {
"type": "object",
"properties": {
"prompt_tokens": {"type": "integer"},
"completion_tokens": {"type": "integer"}
}
},
"gates_passed": {"type": "array", "items": {"type": "string"}},
"gates_failed": {"type": "array", "items": {"type": "string"}},
"degradation_level": {"type": "integer", "minimum": 0, "maximum": 4}
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"code": {"type": "string"},
"message": {"type": "string"},
"details": {"type": "object"}
}
}
},
"warnings": {
"type": "array",
"items": {"type": "string"}
}
},
"required": ["status", "result", "metadata"]
}
Tool Integration
Tool Registration
Tools are registered in tools/schemas/ with JSON schemas:
class WebSearchTool(BaseTool):
def _build_schema(self) -> ToolSchema:
return ToolSchema(
name="WebSearch",
description="Search web for domain information",
parameters={
"query": PropertySchema(
type=DataType.STRING,
description="Search query",
required=True
)
},
required_parameters=["query"]
)
Tool Execution
result = execute_tool(
tool_name="WebSearch",
query="accessible retail UX",
num_results=10
)
Hooks Integration
Available Hooks
| Hook Name | Trigger | Parameters | |-----------|---------|------------| | preskillinvoke | Before main skill execution | HookContext | | postskillinvoke | After main skill completes | HookContext | | presubskillcall | Before sub-skill invocation | HookContext | | postsubskillcall | After sub-skill completes | HookContext | | onqualitygate | When quality gate is evaluated | QualityGateContext | | onerror | When error occurs | ErrorContext | | ondegradation | When system degrades | DegradationContext |
Hook Registration
from hooks import register_hook, HookContext
def my_handler(context: HookContext) -> HookContext:
# Handle hook event
context.metadata["custom_data"] = "value"
return context
register_hook('pre_skill_invoke', my_handler)
Configuration
Configuration File
Located at config/config.yml:
environment: development
log_level: INFO
llm:
default_model: "claude-opus-4-7"
max_tokens: 200000
temperature: 0.7
knowledge:
max_results_per_source: 10
cache_ttl_hours: 24
quality_gates:
max_retry_attempts: 2
strict_mode: true
Environment Variables
Override configuration with environment variables:
SKILL_ENVIRONMENT: deployment environmentLLM_DEFAULT_MODEL: default LLM modelLOG_LEVEL: logging levelMONITORING_ENABLED: enable/disable metrics
Monitoring
Metrics Available
- Token Usage: Track token consumption per skill
- Performance: Operation latency and throughput
- Quality Gates: Pass/fail rates per gate
- Degradation: System degradation events
Metrics Access
from monitoring import get_all_metrics
metrics = get_all_metrics()
print(metrics["tokens"]["total"])
print(metrics["performance"]["overall"])
Quality Gates
Universal Gates (U1-U6)
| Gate | Check | Auto-Fix | |------|-------|----------| | U1 | ≥3 sources cited, ≥1 academic | Fetch from knowledge base | | U2 | Disclosure before recommendation | Prepend disclosure | | U3 | Evidence hierarchy stated | Tag source tiers | | U4 | Language matches preference | Translate output | | U5 | Output uses template | Reformat | | U6 | Claims traceable to sources | Mark unsupported |
Domain Gates (G1-G4)
| Gate | Check | Auto-Fix | |------|-------|----------| | G1 | Wayfinding accessible | Add wayfinding | | G2 | Product ID available | Add product ID | | G3 | App navigation accessible | Add indoor nav | | G4 | Checkout & staff training | Add training |
Error Handling
Error Categories
- Validation Errors: Invalid parameters or input
- Execution Errors: Tool or sub-skill failures
- Timeout Errors: Operation exceeded timeout
- Degradation Errors: Service degradation
Error Response Format
{
"status": "failed",
"error": {
"code": "VALIDATION_ERROR",
"message": "Missing required parameter: object",
"details": {
"parameter": "object",
"constraints": ["required"]
}
},
"metadata": {
"trace_id": "...",
"retry_count": 0,
"degradation_level": 0
}
}
Best Practices
For Skill Authors
- Clear Descriptions: Make skill descriptions descriptive and trigger-appropriate
- Explicit Inputs: Clearly document required vs optional parameters
- Structured Output: Use consistent output templates
- Error Handling: Handle edge cases gracefully
- Documentation: Include examples in skill files
For Skill Users
- Provide Context: Give complete requirements upfront
- Validate Inputs: Double-check parameters before invocation
- Monitor Execution: Use trace IDs for debugging
- Handle Errors: Implement proper error handling
- Check Logs: Review structured logs for issues
Version Compatibility
| Version | Changes | |---------|---------| | 1.0.0 | Initial production release | | 1.1.0 | Added hooks system | | 1.2.0 | Added tool registry | | 2.0.0 | Breaking changes to execution flow |
Troubleshooting
Common Issues
Issue: Skill not found
- Solution: Verify skill name matches registry exactly
Issue: Parameter validation failed
- Solution: Check parameter types and required fields
Issue: Quality gate failed repeatedly
- Solution: Review gate requirements and enable auto-fix
Issue: Hook not executing
- Solution: Verify hook is enabled in configuration
References
- Main Skills:
skills/main.md,skills/sub-*.md - Tool Schemas:
tools/schemas/__init__.py - Hooks:
hooks/__init__.py - Config:
config/config.yml - Monitoring:
hooks/monitoring.py
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: dungnotnull
- Source: dungnotnull/accessible-shopping-visually-impaired-agent-skill
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.