Thanks for helping improve the Java Streams Skill.
This project helps AI coding agents write, review, and clean up Java Stream and Collector code without common stream antipatterns. You don't need maintainer access or a Tessl workspace to make most useful contributions.
Keep changes focused on observed failure modes: materializing just to inspect, counting for
existence, sorting just to get one extreme, careless findFirst() / findAny() changes, boxed
numeric reductions, nested collection stream chains, unsafe toMap, null-sensitive sorting, Java
baseline drift, and casual parallelStream() usage.
Please follow the Code of Conduct in issues, pull requests, discussions, and reviews.
AI-assisted contributions are welcome. If AI materially helped with a change, follow the AI Contribution Policy and disclose that in the pull request body.
For suspected vulnerabilities, don't open a public issue. Follow the private reporting path in the Security Policy.
.
├── .tessl-plugin/plugin.json
├── .github/ISSUE_TEMPLATE/
├── .github/pull_request_template.md
├── .github/workflows/
├── evals/
├── evals-reference/
├── evals-regression/
├── scripts/
├── skills/java-streams/
│ ├── SKILL.md
│ ├── agents/openai.yaml
│ └── references/
│ ├── hard-stops.md
│ ├── java-stream-api.md
│ └── stream-examples.md
├── docs/agents/
├── AI_CONTRIBUTION_POLICY.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
└── README.md
skills/java-streams/SKILL.mdis the runtime instruction file loaded by agents.skills/java-streams/agents/openai.yamlprovides display metadata.skills/java-streams/references/hard-stops.mdlists replacement antipatterns and the final scan.skills/java-streams/references/stream-examples.mdcontains runtime-safe examples.skills/java-streams/references/java-stream-api.mdrecords Java-version compatibility guidance.docs/agents/contains current maintainer policy and workflow guidance.evals/contains the hosted Tessl main eval set used for lift reporting.evals-reference/keeps candidate, diagnostic, and broad coverage scenarios that should not drive main eval lift claims.evals-regression/keeps scenarios that hosted history shows are consistently solved by both with-context and without-context, plus skill-context-dependent checks that are only fair as with-context regression coverage.scripts/contains portable validation checks used by CI.
Run these before committing skill, eval, README, package, script, or CI changes:
python3 scripts/validate_skill.py skills/java-streams
python3 scripts/validate_eval_criteria.py evals evals-reference evals-regression
python3 -m py_compile scripts/*.py
bash -n scripts/*.sh
tessl plugin lint .If you change the skill text or reference files, also run:
tessl review run --threshold 100 skills/java-streams/SKILL.mdIf you have Tessl access, run the publish dry-run:
bash scripts/check_publish_dry_run.sh .
tessl plugin publish --dry-run --bump patch .Hosted evals require Tessl authentication and a linked Tessl project. Prefer
scripts/run_eval_suite.sh; it runs from a temporary plugin copy so with-context variants can see
the skill bundle. By default, it uses Tessl's default solver so contributors without model-selection
entitlement can still run evals. If your Tessl plan allows explicit model selection, Sonnet 4.6 or a
better frontier model is recommended for a more representative real-world check. Start with targeted
runs when possible to conserve Tessl daily rate-limit budget:
scripts/run_eval_suite.sh mainRun hosted eval variants by suite purpose:
evals/: run both baseline control andwith-context; these runs support public lift reporting. Usescripts/run_eval_suite.sh main.evals-reference/: run both baseline control andwith-context; these runs decide whether a scenario has meaningful lift or should move suites. Usescripts/run_eval_suite.sh reference.evals-regression/: runwith-contextonly by default; these runs are safety checks, not lift discovery. Run regression baseline control only when deliberately checking whether a scenario should move back toevals-reference/. Usescripts/run_eval_suite.sh regression.
Pull request titles and commits must use Conventional Commits. CI checks both the pull request title and every commit in the pull request.
Use this format:
type(optional-scope): short description
Common types in this repository:
feat: user-facing skill behavior, new guidance, or new benchmark coverage.fix: correct wrong guidance, broken metadata, validation, CI, or release behavior.docs: README, contributing guide, source notes, examples, or contributor docs.test: eval scenarios, eval criteria, or validation coverage.ci: GitHub Actions, Renovate, Release Please, or publishing automation.chore: repository maintenance that doesn't change user-facing behavior.refactor: restructure docs, scripts, or skill text without changing behavior.
Release Please owns release files, tags, GitHub releases, and Tessl publishing handoff. Do not edit
CHANGELOG.md, .release-please-manifest.json, .tessl-plugin/plugin.json, tags, or releases by
hand for a normal release.
If a Release Please PR is already open, validate that it only changes the generated release files,
wait for Validate skill and plugin and Commitlint, then merge that PR with the repository's
linear-history merge method. The Release Please workflow creates the GitHub release and dispatches
publish-tessl.yml; wait for the publish workflow to pass.
If no Release Please PR is open and a maintainer asks for a release, check unreleased commits since
the latest tag. If they include a releasable Conventional Commit (fix: or feat:), rerun or wait
for Release Please on main. If they only include non-releasable commits and the maintainer still
wants a new published version, add an empty releasable commit that states the publication reason,
push main, and let Release Please open the release PR:
git commit --allow-empty -m "fix(evals): publish updated main eval suite"
git push origin mainAfter merging the release PR, confirm the GitHub release exists, the Tessl plugin shows the new latest version, publish passed, and no stale Release Please PR or branch remains.
Manual Tessl publishing is for maintainer-approved recovery only. Dispatch publish-tessl.yml with
an explicit ref; normal releases should use the fully qualified tag that matches
.tessl-plugin/plugin.json as refs/tags/v<version>. Publishing a branch or other non-tag ref
requires the workflow's explicit allow_non_tag_ref override.
In this repository, the main eval set lives in evals/ and is used for public lift reporting.
evals-reference/ contains candidate and diagnostic coverage that helps tune the skill or decide
what to promote later. evals-regression/ contains solved scenarios and skill-context-dependent
checks; these are useful with-context safety checks, but they do not directly drive the main lift
claim.
The main eval set should stay focused on realistic tasks where context should improve stream
quality. It must include natural activation prompts and explicit invocation prompts. Natural
scenarios must not mention $java-streams or ask to use the skill. Explicit scenarios may name the
skill and must be labeled as explicit in criteria.json.
Every scenario directory must contain task.md, criteria.json, and capability.txt. Main eval
implementation criteria must include compile/artifact checks and behavior correctness checks as
safety checks, but the main score should mainly measure stream-specific quality. Each main eval
criterion must set category to safety, stream_quality, or maintainability.
Use metadata.evidence_type when scenario placement needs to be explicit:
ordinary_lift: both variants are fair to compare, so the scenario can live in main or reference. This value is invalid inevals-regression/.solved_regression: hosted history shows both variants solve the scenario at 100%. This value is invalid outsideevals-regression/.skill_context_dependent: the scenario requires exact skill-provided text, commands, procedures, checklists, headers, or bundled reference text. It must live inevals-regression/.
With-context must be 100% for every retained scenario in every suite. If with-context is below 100%, fix the skill or eval and rerun that scenario targeted before choosing or changing a suite.
Do not hide baseline-solved scenarios just to improve lift. Move baseline-solved scenarios to
evals-regression/ when hosted evidence shows both variants are 100%. Keep clean low-delta but
still diagnostic scenarios in evals-reference/.
When adding a new scenario, classify it from an isolated hosted run:
-
Put ordinary candidate scenarios in
evals-reference/. Put skill-context-dependent scenarios that require exact skill-provided text, commands, procedures, checklists, headers, or bundled reference text inevals-regression/and setmetadata.evidence_typetoskill_context_dependent. -
Run
scripts/run_eval_suite.sh reference <scenario-name>for ordinary scenarios, orscripts/run_eval_suite.sh regression <scenario-name>for skill-context-dependent scenarios. -
Save
tessl eval view <run-id> --jsonoutput and run:scripts/classify_eval_result.py <run-json> --scenario-dir <scenario-dir>
-
Use the recommended suite unless the pull request documents a maintainer-approved reason to override it. In short: with-context below 100 means fix required before classification; skill-context-dependent checks go to regression once with-context is 100, regardless of the without-context score; both variants 100 goes to regression; clean with-context plus without-context below 100 goes to reference or main depending on delta, coverage, and weighting.
The main promotion floor is 30 percentage points. Treat that as maintainer policy for future
promotion or demotion decisions, not as a current hosted benchmark result. Old hosted deltas are
historical evidence only; do not use them for release-readiness claims, public score/lift claims, or
current benchmark claims until they are rerun against the current active suite membership,
denominator, commit/ref, natural/explicit split, and pinned CLI behavior. Main eval weights should
stay evidence-weighted: put more points on scenario families with larger observed missed-point
reduction, keep ordinary 100-point main scenarios around 15 safety / 80 stream-quality / 5
maintainability points, and document any main_eval_weight_multiplier in criteria.json metadata.
When with-context is below 100%, keep the scenario wherever it already lives. Fix the skill or eval
there, then rerun only that targeted scenario until it is clean before running broader suites. After
targeted failures are clean, run evals/ for the main score, relevant evals-reference/ scenarios
with both variants for nearby behavior, and evals-regression/ with context only for final release
safety or broad changes. If a broad run finds only isolated failures, fix and rerun those scenarios
targeted before spending rate-limit budget on another broad suite run.
Every substantive eval scenario edit requires a targeted hosted rerun of that scenario before the PR
is ready. This includes changes to task wording, scoring criteria, or capability text, even if the
edit looks like wording cleanup. A pure move between evals/, evals-reference/, and
evals-regression/ does not need a hosted rerun when the task, scoring criteria, and capability text
are unchanged except for suite-placement metadata or numbering notes; run local validators and update
suite totals instead. The changed scenario's with-context result must be 100% before benchmark
claims, suite classification, or release-readiness claims are trusted. If Tessl hosted evals are
unavailable, document the blocker and exact remaining targeted runs in the PR; benchmark and
release-readiness claims remain blocked until those runs pass.
For runtime skill text or runtime reference changes, widen hosted checks progressively after targeted affected scenarios are clean: run the full main suite, then relevant reference scenarios, and before final release/open-source-ready claims run all reference scenarios with both variants and all regression scenarios with context only.
Runtime skill references must not contain eval inventories, expected answers, score rubrics, hosted
run IDs, or benchmark claims. Put maintainer-only eval history in docs/agents/.
Skill-context-dependent evals ask for exact skill-provided text, commands, procedures, checklists, headers, or bundled reference text. Run and report them as with-context regression checks, not as natural activation, reference lift, or independent Java stream reasoning.