Korea metropolitan bus alerts
Analysis
The skill mostly matches its bus-alert purpose, but it builds recurring agent prompts from unvalidated route/stop inputs, so generated cron jobs should be reviewed carefully before use.
Findings (5)
Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.
Checks for instructions or behavior that redirect the agent, misuse tools, execute unexpected code, cascade across systems, exploit user trust, or continue outside the intended task.
routes_csv = ",".join(routes)
...
f"1) Run: python3 korea-metropolitan-bus-alerts/scripts/tago_bus_alert.py arrivals --city {city} --node {node} --routes {routes_csv}\n"The recurring cron job's agentTurn message is assembled by inserting input values into an instruction the future agent will follow. Route, city, or node values are not shown here as strictly validated or encoded before becoming part of the scheduled prompt.
"sessionTarget": "isolated",
"payload": {
"kind": "agentTurn",
"message": build_prompt(args.city, args.node, routes),
"deliver": True,
"bestEffortDeliver": True
}The skill creates persistent scheduled agent turns that automatically deliver messages. This is disclosed and central to the bus-alert purpose, but users should understand that rules keep running until removed.
patch_override(unit, env_file) restart_gateway(unit) ... run(["systemctl", "--user", "restart", unit], check=True)
The setup flow modifies the user's systemd Gateway override and restarts the Gateway. This is disclosed in SKILL.md and purpose-aligned for cron access to the TAGO key, but it is still a local service-configuration change.
Checks whether tool use, credentials, dependencies, identity, account access, or inter-agent boundaries are broader than the stated purpose.
key = getpass.getpass("TAGO_SERVICE_KEY (input hidden): ").strip()
...
write_env_file(env_file, key)
...
os.chmod(path, 0o600)The skill collects and stores a TAGO API key locally with restrictive file permissions. This credential use is disclosed and expected for TAGO API access, and the artifacts do not show hardcoding or printing the key.
Checks for exposed credentials, poisoned memory or context, unclear communication boundaries, or sensitive data that could leave the user's control.
channel = input("Deliver channel (e.g. telegram): ").strip() or "telegram"
to = input("Deliver to (DM chat id / user id target): ").strip()
...
"channel": channel,
"to": toGateway delivery is routed using user-entered channel and recipient values. The skill says delivery should be DM-only, but this code relies on the provided target being a DM target.
