Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add personamanagmentlayer/pcl --skill scala-expertgit clone --depth 1 https://github.com/personamanagmentlayer/pclWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/personamanagmentlayer/pcl/scala-expert)<a href="https://agentmods.dev/skills/personamanagmentlayer/pcl/scala-expert"><img src="https://agentmods.dev/badge/skills/personamanagmentlayer/pcl/scala-expert/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/personamanagmentlayer/pcl/scala-expert"><img src="https://agentmods.dev/badge/skills/personamanagmentlayer/pcl/scala-expert.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00050 | $0.02433 |
| Opus 5 | $0.00025 | $0.01216 |
| Sonnet 5 | $0.00010 | $0.00487 |
| Haiku 4.5 | $0.00005 | $0.00243 |
Grade A, and why
scala-expert scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 425 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Scala Expert
Expert guidance for Scala development, functional programming, Akka actors, and reactive systems.
Core Concepts
Scala Fundamentals
- Immutability
- Pattern matching
- Case classes
- Traits and mixins
- Implicit conversions
- For comprehensions
Functional Programming
- Higher-order functions
- Monads (Option, Either, Try)
- Functors and Applicatives
- Type classes
- Pure functions
- Referential transparency
Reactive Systems
- Akka actors
- Akka Streams
- Akka HTTP
- Play Framework
- Cats Effect
- ZIO
Scala Basics
// Case classes
case class User(id: String, name: String, email: String, age: Int)
// Pattern matching
def processUser(user: User): String = user match {
case User(_, name, _, age) if age < 18 => s"$name is a minor"
case User(_, name, _, age) if age >= 65 => s"$name is a senior"
case User(_, name, _, _) => s"$name is an adult"
}
// Options instead of null
def findUser(id: String): Option[User] = {
database.get(id)
}
val userName = findUser("123") match {
case Some(user) => user.name
case None => "Unknown"
}
// Or using map
val name = findUser("123").map(_.name).getOrElse("Unknown")
// For comprehensions
def getUserWithPosts(userId: String): Option[(User, List[Post])] = {
for {
user <- findUser(userId)
posts <- findPosts(userId)
} yield (user, posts)
}
// Traits and mixins
trait Serializable {
def toJson: String
}
trait Loggable {
def log(message: String): Unit = println(s"[LOG] $message")
}
case class Person(name: String, age: Int) extends Serializable with Loggable {
def toJson: String = s"""{"name":"$name","age":$age}"""
}
// Implicit classes (extension methods)
implicit class StringOps(s: String) {
def isValidEmail: Boolean = s.contains("@") && s.contains(".")
}
"[email protected]".isValidEmail // true
Functional Programming
import cats._
import cats.implicits._
// Functor
val numbers = List(1, 2, 3, 4, 5)
val doubled = numbers.map(_ * 2)
// Applicative
val result = (Option(1), Option(2), Option(3)).mapN { (a, b, c) =>
a + b + c
}
// Monad (flatMap)
def fetchUser(id: String): Future[Option[User]] = ???
def fetchPosts(userId: String): Future[List[Post]] = ???
val userWithPosts: Future[Option[(User, List[Post])]] = {
fetchUser("123").flatMap {
case Some(user) =>
fetchPosts(user.id).map(posts => Some((user, posts)))
case None =>
Future.successful(None)
}
}
// Or with for-comprehension
val result: Future[Option[(User, List[Post])]] = for {
userOpt <- fetchUser("123")
posts <- fetchPosts(userOpt.map(_.id).getOrElse(""))
} yield userOpt.map(user => (user, posts))
// Either for error handling
sealed trait Error
case class NotFound(id: String) extends Error
case class ValidationError(message: String) extends Error
def validateUser(user: User): Either[Error, User] = {
if (user.email.isValidEmail) Right(user)
else Left(ValidationError("Invalid email"))
}
def saveUser(user: User): Either[Error, User] = {
for {
validated <- validateUser(user)
saved <- database.save(validated)
} yield saved
}
// Type classes
trait Show[A] {
def show(a: A): String
}
object Show {
def apply[A](implicit sh: Show[A]): Show[A] = sh
implicit val stringShow: Show[String] = new Show[String] {
def show(s: String): String = s
}
implicit val intShow: Show[Int] = new Show[Int] {
def show(i: Int): String = i.toString
}
implicit def listShow[A: Show]: Show[List[A]] = new Show[List[A]] {
def show(list: List[A]): String = {
list.map(Show[A].show).mkString("[", ", ", "]")
}
}
}
def print[A: Show](a: A): Unit = {
println(Show[A].show(a))
}
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago Changed · +9 lines · +33 tokens per session 32d30d3fbc95
- 6d ago First seen · 416 lines · 17 tokens per session scan A 454cc8bf2cda
scala-expert is a skill published in the GitHub repository personamanagmentlayer/pcl (40 stars, last pushed 3d ago), licensed Apache-2.0. It adds 50 tokens to every session and 2,433 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-03.
Other skills, from other repositories
plugin-system
Generic plugin system for Python applications. Auto-discovery, validation, fault tolerance. Zero dependencies (Python stdlib only).
jupyter-notebook
Iterative Python via live Jupyter kernel (hamelnb).
pydantic-ai
Build production-ready AI agents with PydanticAI — type-safe tool use, structured outputs, dependency injection, and multi-model support.
clawrouter
Hosted-gateway LLM router — save 84% on inference costs. A local proxy that forwards each request to the blockrun.ai gateway, which routes to the cheapest capable model across 76 models from OpenAI, Anthropic, Google, DeepSeek, xAI, Z.AI, and more. 7 free open-weight models included. Also exposes realtime market data…
polymarket-trading
Use when the user wants to actually PLACE, manage, or redeem bets on Polymarket (not just read odds — that's the blockrunpredexon data tools). Covers setup (deposit wallet, funding, approvals), buy/sell with confirm gating, positions, redeeming winnings, geoblock handling, and the end-to-end flow.
release
Use this skill for EVERY ClawRouter release. Enforces the full checklist — version sync, CHANGELOG, build, tests, npm publish, git tag, GitHub release. No step can be skipped.