operation-website-documentation
Skill1.1k starsChanged 26 days agoApache-2.0View on GitHub
Write or update a Kotlin DataFrame operation page (or pages) for the documentation website — topic in docs/StardustDocs/topics plus runnable Korro samples in the :samples module. Use when asked to document an operation, add/refresh a website page for an API, or migrate old :core samples of a page to :samples.
- Deletes or force-pushes
Trending
Less talk lately.about the whole repository
Who's talking about Kotlin/dataframe
- Kotlin/kandy“Support compose multiplatform”GitHub · Dec 14, 2023 · 45 reactions
- Kotlin/kotlin-agent-skills“Add a Skill for working with Kotlin DataFrame”GitHub · May 19, 2026 · 6 reactions
- deephaven/deephaven-csv“Read files with different encodings”GitHub · Nov 11, 2025 · 2 reactions
- Velkonost/sssss“deps(gradle): bump org.jetbrains.kotlinx:dataframe from 0.13.1 to 0.15.0”GitHub · Oct 15, 2025 · 2 reactions
- jeremymailen/kotlinter-gradle“Wired issues when Upgrading to Kotlin 1.8.20 ”GitHub · Apr 12, 2023 · 2 reactions
The biggest 5 of 51 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 51
Talked about on GitHub and Bluesky (51 times).
On GitHub · 50
- Dec 14, 2023Support compose multiplatform — Kotlin/kandy45 reactions · 7 comments
- May 19, 2026Add a Skill for working with Kotlin DataFrame — Kotlin/kotlin-agent-skills6 reactions
- Nov 11, 2025Read files with different encodings — deephaven/deephaven-csv2 reactions · 2 comments
- Oct 15, 2025deps(gradle): bump org.jetbrains.kotlinx:dataframe from 0.13.1 to 0.15.0 — Velkonost/sssss2 reactions · 1 comment
- Apr 12, 2023Wired issues when Upgrading to Kotlin 1.8.20 — jeremymailen/kotlinter-gradle2 reactions · 9 comments
45 more on GitHub
- Sep 25, 2026fix(deps): update all dependencies — salesforce-misc/ReVoman1 reaction · 1 comment
- Dec 9, 2024chore(deps): update dependency org.jetbrains.kotlinx:dataframe to v0.15.0 — Kotlin/kotlin-jupyter-libraries1 reaction
- May 27, 2024Remove `concatFixed()` — Kotlin/kandy1 reaction
- Nov 1, 2026build(deps): bump kotlinx-dataframe from 1.0.0-rc02 to 1.0.0-rc02n — sureshg/native-image-playground0 reactions · 2 comments
- Oct 30, 2026[KDF] Support columnOf(vararg DataFrame) FrameColumn creation — JetBrains/kotlin0 reactions · 18 comments
- Oct 29, 2026Move `@sample` after the removal of escape characters — Jolanrensen/KoDEx0 reactions · 2 comments
- Oct 26, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc02 to 1.0.0-rc02n — sureshg/build-commons0 reactions
- Oct 19, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc02n — sureshg/kotlin-mpp-playground0 reactions · 2 comments
- Oct 19, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc02 to 1.0.0-rc02n — sureshg/build-commons0 reactions
- Oct 16, 2026Fix generated jars and support publishing KoDEx-processed artifacts — Jolanrensen/KoDEx0 reactions
- Oct 15, 2026chore(deps): update dependency org.jetbrains.kotlinx:dataframe-geo to v1.0.0-rc02n - autoclosed — Kotlin/kotlin-jupyter-libraries0 reactions
- Oct 12, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Oct 7, 2026[KDF] (Attempt 2) Fixed return type mismatch report, like when using `add {}` — JetBrains/kotlin0 reactions · 12 comments
- Oct 5, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Oct 2, 2026[KDF] Fixed return type mismatch report, like when using `add {}` — JetBrains/kotlin0 reactions · 8 comments
- Oct 1, 2026build(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/native-image-playground0 reactions · 2 comments
- Sep 28, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Sep 21, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Sep 14, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Sep 11, 2026Bump org.jetbrains.kotlinx:dataframe from 1.0.0-rc01 to 1.0.0-rc01n — linde9821/epa-visualizer0 reactions
- Sep 7, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Aug 31, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Aug 24, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Aug 21, 2026[Feature] Create a preprocessor that adds/creates reference aliases with codespans — Jolanrensen/KoDEx0 reactions
- Aug 10, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Aug 3, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Aug 1, 2026build(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/native-image-playground0 reactions · 2 comments
- Jul 27, 2026Bumped built-in dataframe version to 1.0.0-rc01 — JetBrains/kotlin-toolchain0 reactions · 3 comments
- Jul 27, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Jul 20, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-rc01n — sureshg/kotlin-mpp-playground0 reactions · 2 comments
- Jul 20, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/build-commons0 reactions
- Jul 13, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/build-commons0 reactions
- Jul 6, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/build-commons0 reactions
- Jul 1, 2026build(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/native-image-playground0 reactions · 2 comments
- Jun 25, 2026Kotlin SWE benchmark contribution — multi-swe-bench/multi-swe-benchsays it tested it0 reactions
- Jun 22, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/build-commons0 reactions
- Jun 15, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/kotlin-mpp-playground0 reactions · 2 comments
- Jun 15, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/build-commons0 reactions
- Jun 8, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10584 — sureshg/kotlin-mpp-playground0 reactions · 2 comments
- Jun 8, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10535 — sureshg/build-commons0 reactions
- Jun 2, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10508 — sureshg/build-commons0 reactions
- Jun 1, 2026build(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10508 — sureshg/native-image-playground0 reactions · 2 comments
- May 25, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10485 — sureshg/build-commons0 reactions
- May 18, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10438 — sureshg/build-commons0 reactions
- Oct 29, 2025[K2] TranslatorError: from STATUS to IMPLICIT_TYPES_BODY_RESOLVE — Kotlin/dokka0 reactions · 3 comments
On Bluesky · 1
- May 19, 2025Kotlin DataFrame aims to reconcile Kotlin's static typing with the dynamic nature of data by utilizing both the full power of the Kotlin… — @ytroncal.bsky.social1 likes and repost
In this repository24 other files it gives its agents.
- AGENTS.mdAGENTS.md
- core/AGENTS.mdAGENTS.md
- dataframe-arrow/AGENTS.mdAGENTS.md
- dataframe-compiler-plugin-core/AGENTS.mdAGENTS.md
- dataframe-csv/AGENTS.mdAGENTS.md
- dataframe-excel/AGENTS.mdAGENTS.md
- dataframe-geo/AGENTS.mdAGENTS.md
- dataframe-jdbc/AGENTS.mdAGENTS.md
- dataframe-json/AGENTS.mdAGENTS.md
- examples/AGENTS.mdAGENTS.md
- plugins/AGENTS.mdAGENTS.md
- samples/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- core/CLAUDE.mdCLAUDE.md
- dataframe-arrow/CLAUDE.mdCLAUDE.md
- dataframe-compiler-plugin-core/CLAUDE.mdCLAUDE.md
- dataframe-csv/CLAUDE.mdCLAUDE.md
- dataframe-excel/CLAUDE.mdCLAUDE.md
- dataframe-geo/CLAUDE.mdCLAUDE.md
- dataframe-jdbc/CLAUDE.mdCLAUDE.md
- dataframe-json/CLAUDE.mdCLAUDE.md
- examples/CLAUDE.mdCLAUDE.md
- plugins/CLAUDE.mdCLAUDE.md
- samples/CLAUDE.mdCLAUDE.md
The file
Show its rules and text
We split this skill into the rules it gives an agent
27 rules. About 0 are common, 9 are distinctive, and 18 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈9
Distinctive · estimate
This author's own choices. Worth a look.
18
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 8
Write or update the documentation-website page(s) for a Kotlin DataFrame operation, with runnable code samples and generated outputs.
- Very specific: line 33
Never use the legacy "dataframe explainer" / @TransformDataFrameExpressions mechanism, and never add samples to :core.
- Distinctive: line 35
No deprecated API: If an existing sample or page section uses deprecated API, rewrite it with the current replacement — or delete it if the …
- Distinctive: line 38
Leave all changes in the working tree and let the user review them.
- Distinctive: line 47
If the user provided a reference page — use it.
- Distinctive: line 57
Read both the template topic and its template test before writing anything, and mirror their structure, tone and formatting.
- Very specific: line 64
Read the operation's implementation and KDoc in core/src/main/kotlin/.../api/<operation>.kt.
- Very specific: line 73
Check whether the page already exists, and whether it still pulls samples from :core …
- Very specific: line 79
Create/update docs/StardustDocs/topics/<operation>.md and register it in docs/StardustDocs/d.tree if new (place it next to related …
- Very specific: line 82
Follow the structure from the guidelines: title → Writerside summaries → what it does, then what it returns → signature(s) / operation …
- Very specific: line 87
If the page has no Writerside summaries yet, add all three right after the title (and the Korro IMPORT), using the standard operation …
- Very specific: line 110
If a receiver or an argument needs a more specific type than its name tells, declare it on a separate line of the signature block after the …
- Very specific: line 117
Check the actual overloads: some operations are DSL-only.
- Very specific: line 121
If the operation is defined for several receivers (DataFrame, DataRow, DataColumn, GroupBy, Iterable, …): describe the DataFrame operation …
- Very specific: line 125
If the page describes several operations: each gets its own ## section.
- Very specific: line 175
If the operation cannot take plain column names (Strings), write the _strings version with String column accessors instead of dropping it: …
- Very specific: line 185
Put .format / .formatHeader / .defaultHeaderFormatting { } highlighting after // SampleEnd too.
- Very specific: line 187
Use illustrative data — e.g.
- Distinctive: line 234
When the test file is written, run ktlint over it and fix what it reports:
- Distinctive: line 243
If the line is too long, make sure the operation still "connects": start a new line only when a new operation starts, and break inside the …
- Distinctive: line 291
no stale HTML of renamed or deleted samples is left in the page's output folder.
- Very specific: line 294
Do not build, run, or deploy the website.
- Very specific: line 328
If the page still uses samples generated from :core tests:
- Very specific: line 330
Remove the old Korro marks/IMPORT from the topic and any old-style output embeds, including hand-written <inline-frame>s after <!---END--> …
- Very specific: line 334
Delete the now-unused sample functions from the :core test file if nothing else references them.
- Distinctive: line 336
Keep the page's coverage at least as complete as before the migration.
- Distinctive: line 344
Leave the changes uncommitted — the user commits and deploys.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Operation website documentation
Write or update the documentation-website page(s) for a Kotlin DataFrame operation, with runnable code samples and generated outputs.
DOCUMENTATION_GUIDELINES.md is the specification for this task. Read it in full first and follow it completely — this skill only adds the operating procedure around it. If the two ever disagree, the guidelines win.
Hard rules
- Edit by hand only:
- topics —
docs/StardustDocs/topics/**/*.md - sample tests —
samples/src/test/kotlin/org/jetbrains/kotlinx/dataframe/samples/** - plus the two registration files:
docs/StardustDocs/d.tree(site map) andsamples/build.gradle.kts(Korro config); - KDoc → website links —
core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/documentation/DocumentationUrls.kt: only the URL entries of the pages and sections you added, renamed, moved, or split (step 6); - old
:coresamples —core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/samples/api/*.kt: only deleting the sample functions of the page you migrated, once nothing else references them (step 7). Never add or change samples there.
- topics —
- Everything else is generated — inserted code blocks between
<!---FUN x-->/<!---END-->,docs/StardustDocs/resources/**/*.html,docs/StardustDocs/images/*.svg,docs/StardustDocs/topics/_shadow_resources.md,generated-sources/**. Never hand-write or hand-patch them; run the Gradle tasks below instead. The only manual step allowed is deleting the page's own output folder before regenerating it (step 5). - Never write a sample snippet inline in the
.md. Snippets only come from tests via Korro. - Never use the legacy "dataframe explainer" /
@TransformDataFrameExpressionsmechanism, and never add samples to:core. - No deprecated API. If an existing sample or page section uses deprecated API, rewrite it with the current replacement — or delete it if the replacement makes it redundant.
- Do not run or build the website yourself, do not deploy, and do not commit or push anything. Leave all changes in the working tree and let the user review them. Only run the Gradle tasks listed in step 5 and the ktlint/validation commands.
Procedure
1. Get a template
Operation pages are never written from scratch. Use a reference page as a template:
- If the user provided a reference page — use it.
Otherwise use one of the two reference pages, which fully follow the guidelines:
docs/StardustDocs/topics/filter.md+samples/…/samples/api/FilterSamples.kt— a single operation with aDataColumnoverload;docs/StardustDocs/topics/concat.md+samples/…/samples/api/ConcatSamples.kt— an operation with several receivers: theDataFrameone first, without a header, thenDataRow,DataColumn,GroupBy,Iterable, each in its own##section.
Tell the user which template you picked.
Read both the template topic and its template test before writing anything, and mirror their
structure, tone and formatting. Any other existing page may be outdated: you can look at it for
the mechanics (IMPORT/FUN/END, the :samples test class, Sample Helper calls), but always take
the structure (summaries, headers, signatures, parameters) from the guidelines and the two reference pages.
2. Gather the source of truth
- Read the operation's implementation and KDoc in
core/src/main/kotlin/.../api/<operation>.kt. For the fully expanded KDoc, open the single corresponding file undercore/generated-sources/(open deliberately — don't grep/crawl generated trees). Reuse that KDoc text for the page where it is good; the page must contain at least as much information as the KDoc, never less. - Note which overloads/parameters are
@Deprecated— those must not be documented or used; if an existing page or sample relies on them, plan the rewrite to the replacement API (or removal). - Enumerate every non-deprecated overload, every parameter (including enum parameter values), and the notable
edge cases (empty frame,
nulls,NaN/NA, nested/column groups) — the guidelines require all of them to be documented. - Check whether the page already exists, and whether it still pulls samples from
:core(core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/samples/api/*.kt, which is whatcore/build.gradle.ktskorro config covers). If so, migration is part of the job — see step 7.
3. Write the topic
Create/update docs/StardustDocs/topics/<operation>.md and register it in
docs/StardustDocs/d.tree if new (place it next to related operations).
Follow the structure from the guidelines: title → Writerside summaries → what it does, then what it
returns → signature(s) / operation grammar → important notes → See also links → ### Parameters →
### Examples → ### `funName` on `DataColumn` (if such an overload exists). Multi-step
operations get one subsection per step, each with the same structure.
If the page has no Writerside summaries yet, add all three right after the title (and the Korro
IMPORT), using the standard operation template with the same text in each — see
Writerside summaries in the guidelines. Keep existing meaningful custom summaries as they are.
Header and signature rules (see Structure in the guidelines for the details):
- Parameters and examples are headers (
### Parameters,### Examples), never bold paragraphs. - A separate
DataColumnoverload goes at the end of the operation section under### `funName` on `DataColumn`, with its own description, signature, parameters, and examples. - Signatures are pseudocode with types, in a
textcode block, e.g.df.sortWith(comparator: Comparator<DataRow>)/df.sortWith { row1: DataRow, row2: DataRow -> Int }. - Always write the receiver, named after its type:
DataFrame→df,DataColumn→col,DataRow→row,ColumnGroup→colGroup,FrameColumn→frameCol,GroupBy→groupBy,Pivot→pivot. The same prefixes are used for lambda parameters ({ row: DataRow -> Boolean }) and receivers of other kinds (dfs: Iterable<DataFrame>). - Parameters always keep their names from the library — check the function declaration. Users pass
arguments by name, and the page must match the KDoc and IDE hints:
df.concat(vararg frames: DataFrame), notdf.concat(vararg dfs: DataFrame);col.concat(vararg other: DataColumn), notvararg cols. - Omit type parameters (
<T>,<C>, …) in signatures and descriptions unless they carry meaning: they take part in the function logic (e.g. areifiedtype parameter like incolsOf<T>()), or they connect the input and result types (e.g.collectionColumn.concat(): List<T>for aDataColumn<Collection<T>>). Otherwise writeIterable<DataRow>, notIterable<DataRow<T>>. - If a receiver or an argument needs a more specific type than its name tells, declare it on a separate
line of the signature block after the calls (
collectionColumn: DataColumn<Collection<T>>), not in a comment. Such a receiver may get a descriptive name (collectionColumn) instead of the plain prefix. - Types go in the parameter descriptions too, not only in the signature — as pseudocode (same style as the signature) or in words; for lambdas say what they receive and what they must return.
- For columns arguments, state in the description how columns can be selected: by string names
and/or with the Columns Selection DSL (link it).
Check the actual overloads: some operations are DSL-only; in some the string and DSL overloads
work differently (e.g.
rename) and must be described separately; some use a specialized DSL (SortDsl,PivotDsl, …) — name it, link its section, and say what it adds on top of the Columns Selection DSL. - If the operation is defined for several receivers (
DataFrame,DataRow,DataColumn,GroupBy,Iterable, …): describe theDataFrameoperation first, without a header, right after the summaries; every other receiver gets its own## `funName` on `Receiver`section, theDataColumnone included (seeconcat.md). - If the page describes several operations: each gets its own
##section; don't add a list of the page's operations anywhere; and write See also only once — in the first operation section, in its usual place (after the description/notes, before### Parameters) — linking only to operations not described on this page. - The input dataframe goes inside
### Examples, immediately before the first example of the page ("The following dataframe will be used in the examples below:"), not earlier on the page.
Link on first mention ([DataFrame](DataFrame.md), [column selectors](ColumnSelectors.md), …),
follow docs/StardustDocs/topics/concepts/spellingConventions.md, and keep the language plain.
Links that are easy to forget — check them explicitly:
The operation takes a row expression or row condition (
RowExpression,RowValueExpression,RowFilter,RowValueFilter— a lambda withDataRowas the receiver)? Link it:[row expression](DataRow.md#row-expressions)/[row condition](DataRow.md#row-conditions). Also add a note on what the lambda receives and how the row values are accessed, like infilter.md:The row condition receives each row both as `this` and as `it`, so the values of the row can be accessed directly using [Extension Properties](extensionPropertiesApi.md) or [`String` column accessors](StringApi.md#string-column-accessors), including the values of nested columns of a [`ColumnGroup`](DataColumn.md#columngroup).Adapt it to the lambda type:
RowValueExpression/RowValueFilterget the row asthisand the current value asit;RowColumnExpressiongetsrowandcolas parameters.- Mentioning
ColumnSetor other column resolvers? Link[ColumnSet](ColumnSelectors.md#column-resolvers).
Describe only the overloads the method actually has.
4. Write the samples
One test file per documentation page, at
samples/src/test/kotlin/org/jetbrains/kotlinx/dataframe/samples/api/<Operation>Samples.kt,
extending DataFrameSampleHelper("<pageName>", "api"), keeping the order of tests aligned with the
order of sections in the topic.
- Mark snippets with
// SampleStart/// SampleEnd. - Show the input dataframe first, in its own sample.
- If the operation selects columns or uses row values, the basic usage example always has two
versions — the
Extension Properties API and the
String API (read both topics if you are
unsure what each looks like) — written as paired tests
x_properties/x_strings. Korro wraps such a pair into<tabs>/<tab>itself (groupSamplesinsamples/build.gradle.ktsmaps the_properties/_strings/_kotlin/_javasuffixes onto tab titles), so never write the tab markup by hand in the topic — just put a single<!---FUN x-->/<!---END-->pair with the base name, without the suffix. If the operation cannot take plain column names (Strings), write the_stringsversion withStringcolumn accessors instead of dropping it:col<Int>("age")/colGroup("name")/frameCol(...)in the Columns Selection DSL,getValue<Int>("age")/getColumnGroup("name")in row expressions. Do not use the "Invoked String API" ("age"<Int>(),"info"["age"]) —StringApi.mdmarks it as outdated and not recommended. Use the Extension Properties API in the remaining examples. - Save outputs with Sample Helper after
// SampleEnd:.saveDfHtmlSample()forDataFrame/DataColumn/GroupBy(use.toDataFrame()/.values()/.frames()if needed),.savePlotSVGSample()for Kandy plots,.saveSample()/.saveTextSample()forString/CodeString. Korro inserts all of them into the topic itself (see below). - Put
.format/.formatHeader/.defaultHeaderFormatting { }highlighting after// SampleEndtoo. Highlight rows for row-oriented operations, headers for column-oriented ones. - Use illustrative data — e.g. a frame that actually contains
nulls fornull-related operations. The shared dataset fromTestBase(peopleDfetc.) is the default, but if it does not demonstrate the operation well, declare your own@DataSchema+dataFrameOf(...)in the test class instead (seeConcatSamples.kt). Keep it small and meaningful. - Never use deprecated API in samples or in the page text — no deprecated operations,
overloads, or parameters, and nothing scheduled for removal. Document the current replacement
instead. Check for
@Deprecatedon everything you call. - Tests must pass and must not be
@Ignored (except complex integration tests, for example with reading from DBs), and must compile without deprecation warnings.
Wire it up in the topic: <!---IMPORT org.jetbrains.kotlinx.dataframe.samples.api.<Operation>Samples-->
at the top, then for each sample
<!---FUN testName-->
<!---END-->Korro fills the block with the sample code and its outputs: everything the test saved with
Sample Helper — the <inline-frame> for .saveDfHtmlSample(), the <img> for
.savePlotSVGSample(), the text of .saveSample() / .saveTextSample() — in the order it was
saved. Never write an <inline-frame> / <img> for a sample by hand — it would duplicate the
generated one. The only hand-written <inline-frame> is for an output shown without its code (e.g. a
highlighted copy of the input): a test that only saves an output, with no // SampleStart and no
FUN mark in the topic.
The generated src is the flat file name, ./resources/<testName>.html — even though
DataFrameSampleHelper("<pageName>", "api") writes the file to
docs/StardustDocs/resources/api/<pageName>/<testName>.html. _shadow_resources.md registers
resources by file name only, so a nested src builds fine but renders an empty frame. Never
"fix" a src to the on-disk path.
For a tabbed pair, the FUN directive takes the base name without the suffix. Sample Helper
cuts the _properties / _strings suffix off the output file names too, so the output of
valueCountsSelector_properties is ./resources/valueCountsSelector.html. Save the output in one
variant only (usually _properties) — both variants write the same file:
<!---FUN valueCountsSelector-->
<!---END-->Then add both the topic path and the test path to the Korro config in samples/build.gradle.kts
(korro { docs { from(...) }; samples { from(...) } }) — a glob that already covers the path is
enough.
When the test file is written, run ktlint over it and fix what it reports:
./gradlew :samples:ktlintFormat
./gradlew :samples:ktlintCheckNote the deliberate chain-method-continuation = disabled style from AGENTS.md: group chained
operations on one line so the chain reads like a sentence.
If the line is too long, make sure the operation still "connects": start a new line only when a new
operation starts, and break inside the lambdas of the operation instead:
df
.update {
colsAtAnyDepth().colsOf<Int>()
}.with {
sqrt(it * 1000) * it.pow(2.0)
}
.rename { a and b }.to("columnA", "columnB")
.print()5. Generate and verify
First delete the page's HTML output folder, so that outputs of renamed or deleted samples don't survive (the tests recreate it):
rm -rf docs/StardustDocs/resources/api/<pageName>Then run, in this order (korro must run after test):
./gradlew :samples:clean :samples:build :samples:test
./gradlew :samples:korro
./gradlew :samples:updateShadowResourcesNever skip clean, and always run it before build/test/korro. Without it, outdated korro
output lines (text samples in samples/build/, including those of samples you renamed or deleted)
survive and get injected into the documentation, so the page silently shows wrong content.
clean does not touch the HTML outputs — they live in the tracked docs/StardustDocs/resources/,
which is why the page folder is deleted by hand above; updateShadowResources would otherwise
re-register every stale file still on disk.
Then verify, and report honestly if anything failed:
- the test run passed;
- code snippets were inserted between every
FUN/ENDpair in the topic (no empty pairs), and every sample that saves an output got its<inline-frame>/<img>inside its block; - no
<inline-frame>duplicates a generated one right after<!---END-->(remove such leftovers when updating an old page); - an HTML file exists in
docs/StardustDocs/resources/or one of its subfolders (normallyresources/api/<pageName>/) for every<inline-frame src>on the page — thesrcitself stays flat, and output names have no_properties/_stringssuffix; - no stale HTML of renamed or deleted samples is left in the page's output folder;
_shadow_resources.mdwas updated.
Do not build, run, or deploy the website. Just point the user to
docs/README.md#running-the-documentation-website-locally so they can review the rendered page.
6. Validate links and anchors
Once the topic text is final, check every link you wrote or touched:
- Markdown links to other topics (
[…](someTopic.md)) — the target file must exist somewhere underdocs/StardustDocs/topics/(in any subfolder). Writerside resolves topics by file name, so links are written as the bare file name (DataRow.md, notconcepts/DataRow.md) — never "fix" a bare link into a relative path; rewrite a path-style link (concepts/x.md) into the bare form instead. - Anchors (
someTopic.md#section-anchor,#local-anchor) — the heading must exist in the target file; Writerside anchors are the lowercased heading with spaces replaced by-and punctuation dropped. Also accept explicit{id="..."}anchors. <inline-frame src="./resources/x.html">— the filex.htmlmust exist indocs/StardustDocs/resources/or one of its subfolders; thesrcitself must stay flat.<img src="...">— the file must exist indocs/StardustDocs/images/.- KDoc → website links in
core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/documentation/DocumentationUrls.kt({@include [Url]}/<page>.html#<anchor>, included into KDocs asFor more information: {@include [DocumentationUrls.X]}). Nothing validates them, so for every topic or section you added, renamed, moved, or split, check the entries pointing at it and fix the page name (topic file name lowercased +.html) and the anchor; add an entry for a new topic if its KDoc refers to the website. Editing only the KDoc URL needs noapiDump, andgenerated-sourcesis regenerated by CI — don't hand-edit it. topic="x.md"entries you added tod.treemust point at existing files, and the new topic must be reachable from the tree.- Links in the surrounding prose that you rewrote while editing (e.g. renamed sections) still resolve.
Fix every broken one, and report any you could not resolve.
7. Migrating old :core samples of the page
If the page still uses samples generated from :core tests:
- Remove the old Korro marks/
IMPORTfrom the topic and any old-style output embeds, including hand-written<inline-frame>s after<!---END-->— the new ones are generated inside the blocks. - Rewrite those samples as new tests in
:samples(step 4) with Sample Helper outputs — do not carry over@TransformDataFrameExpressionsor the explainer HTML. - Delete the now-unused sample functions from the
:coretest file if nothing else references them; leave:corekorro config alone. - Keep the page's coverage at least as complete as before the migration.
Reporting
Summarize: which topic file(s) and test file(s) you changed, the template you followed, which Gradle tasks you ran and their result, the link/anchor validation result, and anything you deliberately left out (e.g. an overload you could not sensibly exemplify) so the user can decide.
Leave the changes uncommitted — the user commits and deploys.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

