alphameta-watchlist — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited alphameta-watchlist (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Persistent named groups of securities, stored locally via AlphaMeta's quote group system. Think of it as bookmarks for symbols — stocks, options, futures, indices. Data lives in local diskcache, not on any broker server. No network required for CRUD; only live quote lookups need a running AlphaMeta service.
live fieldalphameta-quote or alphameta-portfolioSee the alphameta skill for server setup and command execution syntax.
qlist to get all groups.qlist returns {"groups": {"<name>": {"symbols": [...], "live": [...]}}}.symbols: all symbols saved in the grouplive: subset of symbols currently streaming live quotesalphameta-quote: Extract symbols → curl POST /api/v1/execute {"cmd": "quote <symbols>"}All mutations are local (diskcache). No remote side effects.
qdelete (irreversible), briefly confirm with the user before executing.| Action | Command | Notes |
|---|---|---|
| Create group + add symbols | qsave <group> <symbol...> | If no symbols given, saves currently streaming quotes into the group |
| Add symbols to existing group | qadd <group> <symbol...> | Creates group if it doesn't exist |
| Remove specific symbols | qremove <group> <symbol...> | Supports glob patterns (qremove mygroup AAPL*) |
| Remove all symbols from group | qremove <group> | Clears the group but keeps it |
| Delete entire group | qdelete <group...> | Can delete multiple at once. Briefly confirm before executing. |
| User asks | Flow |
|---|---|
| "My watchlist stocks' gainers today" | qlist → extract symbols → alphameta-quote (batch quote) |
| "Are any of my watchlist options ITM?" | qlist → extract symbols → alphameta-technical (greeks/IV) |
| "Check if these positions are in my portfolio" | qlist → extract symbols → alphameta-portfolio (positions filter) |
| "Save my current quotes as a watchlist group" | qsave <name> (no symbols → saves live quotes) |
| Rationalization | Reality |
|---|---|
| "I'll just use the raw JSON output" | The qlist response is already structured. Present it as a readable table — group name as header, symbols as a comma-separated list. |
| "I'll rephrase qlist as watchlist since it's what the user understands" | Correct. The backend calls them "quote groups"; the skill layer should call them "watchlist groups". Translate terminology for the user. |
| "I need to run two-step confirmation for all mutations" | Wrong. These are local writes — no broker state change. Only qdelete warrants a quick check. |
"I'll hardcode qadd → qsave mapping" | qadd appends to an existing group (or creates if missing). qsave overwrites. Use qadd for "add to", qsave for "create new group". |
qsave when user says "add" — qsave creates/replaces, qadd appends. GET IT RIGHT.qdelete without a brief confirmation — the group is gone permanently.alphameta-quote.qadd target doesn't exist, it creates it. If user said "add to group X" and X doesn't exist, warn them it'll be created.client-{id} groups as user watchlists — these are auto-generated system snapshots. qadd/qremove edits will be overwritten. qdelete breaks startup auto-restore. Do not manage them manually.global is the primary restore source — client-{id} snapshot takes priority on startup. global is only a fallback.Present watchlist data as markdown tables.
qlist → {"groups": {"tech": {"symbols": ["NVDA","AAPL","MSFT"], "live": ["NVDA","AAPL"]}, ...}}| Group | Symbols | Live |
|---|---|---|
| tech | NVDA, AAPL, MSFT | NVDA ✓, AAPL ✓ |
| hk-stocks | 0700.HK, 9988.HK | — |
When live is non-empty, mark symbols that are actively streaming with a checkmark.
| Group: tech | Symbols |
|---|---|
| NVDA | ✓ (live) |
| AAPL | ✓ (live) |
| MSFT | — |
qadd tech GOOGL → {"added": ["GOOGL"], "failed": []}Added GOOGL to tech. ✓ Success. (optional chained query) → "Would you like to see the current price of GOOGL?"
qremove tech AAPL → null (success)Removed AAPL from tech.
No prior service login needed for CRUD. Watchlist data is stored locally in diskcache and is available even when IBKR is disconnected. Only the live quote routing step (alphameta-quote) requires a connected service.
| Action | Command | Example | Returns |
|---|---|---|---|
| List all groups | qlist | {"cmd": "qlist"} | {"groups": {"name": {"symbols": [...], "live": [...]}}} |
| Filter groups | qlist <name...> | {"cmd": "qlist tech hk-stocks"} | Same shape, filtered |
| Create / replace group | qsave <name> <symbol...> | {"cmd": "qsave tech NVDA AAPL"} | {"added": [...], "failed": [...]} |
| Add to group | qadd <name> <symbol...> | {"cmd": "qadd tech GOOGL"} | {"added": [...], "failed": [...]} |
| Remove from group | qremove <name> <symbol...> | {"cmd": "qremove tech AAPL"} | null (success) |
| Delete group(s) | qdelete <name...> | {"cmd": "qdelete old-group"} | null (success) |
The gateway wraps responses as:
{"success": true, "result": <above>, "request_id": "...", "execution_time_ms": N}Watchlist groups are stored in AlphaMeta's diskcache under keys ("quotes", "<group_name>") → set(<symbols>). This means:
| Concept | Detail |
|---|---|
| Group names | Free-form strings (avoid special characters) |
| Symbols | Any valid IBKR symbol: NVDA, AAPL260515P00200000, /ESM6, I:VIX |
| Empty groups | Show as (empty) in listings |
| Symbol casing | Case-sensitive. AAPL and aapl are different. |
live field | Subset of symbols that are currently streaming real-time quotes |
Two group types are managed by the system, not created by the user:
`client-{id}` (e.g. `client-0`, `client-2`) — Auto-generated live quote snapshot
qsnapshot whenever quotes are added/removed (add, remove, oadd, align).{"contracts": [...]}.global group or built-in defaults (SPY, QQQ, AAPL + futures + indices).qadd/qremove edits are overwritten on the next quote change. Do not qdelete unless you intend to reset saved state.("quotes", f"client-{clientId}").`global` — Shared default fallback group
set("AAPL", "MSFT")) created via qsave/qadd.client-{id} snapshot exists on startup.client-{id} takes priority.| Feature | client-{id} | User groups |
|---|---|---|
| Created by | qsnapshot (auto) | qadd / qsave (manual) |
| Data format | {"contracts": [Contract, ...]} | Plain symbol strings |
| Updated | Every add/remove (auto overwrite) | Only on manual edit |
| Restore priority | 1st (on startup) | N/A (or global as 2nd fallback) |
The q* commands (qlist, qadd, qsave, qremove, qdelete) are the same system used by AlphaMeta's quote stream management. When you qsave or qadd, you're writing into the same quote-group namespace used by the live quote view. This means a watchlist group is also a "quote group" — it can be loaded into the live stream via qrestore.
| Situation | Reply |
|---|---|
| Service not running | alphameta start to start the service |
qlist returns empty groups | "No watchlist groups yet. Create one with qadd <name> <symbols>." |
qadd returns failed: [...] | "Could not qualify: AAPL. Check symbol spelling." |
qdelete on non-existent group | "Group not found. Run qlist to see available groups." |
qremove no matching symbols | "No matching symbols found in that group. Use qlist <group> to check contents." |
| Permission error (403) | "This command requires a PRO-tier API key. Set ALPHAMETA_API_KEY." |
| Other API error | Surface the error message verbatim. |
alphameta-quotealphameta-technicalalphameta-portfolioalphameta-predicate~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.