Write and debug Flink SQL that runs on Confluent Cloud, enforcing the CC-vs-Apache-Flink (OSS) dialect boundary. Use when the working directory is a Confluent Cloud Flink workspace, when a Flink SQL statement needs checking before it runs on a CC compute pool, or when the user mentions CC Flink, Confluent Cloud Flink SQL, the `confluent flink` CLI, a CFU compute pool, `CREATE CONNECTION`, or asks to check or debug Flink SQL whose runtime is Confluent Cloud. Also trigger when a Flink SQL question is posed and nothing establishes an Apache Flink OSS runtime. Do NOT trigger for: building or deploying Flink UDFs in Java (UDF/UDTF/PTF — use flink-udf); a full CDC pipeline from a database through Flink into Tableflow/Iceberg/Delta Lake (use confluent-cloud-cdc-tableflow); Kafka Streams topology work (use kafka-streams-programming); or Flink SQL confirmed to run on Apache Flink OSS, not Confluent Cloud.
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Enforce the CC-Flink-vs-OSS-Flink dialect boundary and the CLI-driven verification loop for any Confluent Cloud Flink SQL work. Apache Flink OSS training data is a trap — CC rejects or silently mishandles a long list of otherwise-valid Flink SQL constructs.
Scope note: this skill's reference material is built around the OSS-vs-CC dialect boundary — traps in constructs that exist in both dialects but behave differently. It does not yet catalog CC-only DDL that has no OSS counterpart (e.g. CREATE MATERIALIZED TABLE, CREATE MODEL/AI_COMPLETE, CREATE AGENT, USE CATALOG). For those, verify directly against the CC Flink SQL reference rather than expecting a trap entry here.
confluent flink shell against the user's compute poolconfluent CLI runs. Unit tests may mock; anything calling itself "end-to-end verification" may not.docs/flink-dialect-traps.md in their project) before writing any new file — don't assume a docs/ layout.CREATE CONNECTION parameters are Terraform-injected, never hardcoded. Gitignore .tfvars, .tfstate*, *.secret* from day one.EXPLAIN a query before statement create — catches parse/type errors without consuming CFUs.<placeholder> for any topic, table, statement, or resource name you haven't verified.When a user asks to build, modify, or troubleshoot a Flink SQL streaming solution, first understand the streaming problem and identify the required data and processing semantics before generating SQL.
Use this workflow:
Do not ask clarifying questions if a request is complete (i.e., all required information, context, and parameters are provided or retrievable via available MCP tools). Skip directly to implementation and validation.
Only ask questions when critical information is missing and cannot be resolved through existing context or tools.
Before generating Flink SQL, determine what the user is trying to accomplish.
Establish, when relevant:
Ask only questions that materially affect the pipeline design.
Do not ask for information that is already available in the conversation.
When MCP tools are available, prefer inspecting existing Confluent resources over asking the user for information that can be discovered.
For referenced input resources:
Do not invent topic names, table names, column names, schemas, or timestamp fields.
If multiple resources could match the request, present the candidates and ask the user to select one.
Before generating SQL, determine the semantics that materially affect the result. Skip this step if all relevant semantics are already established from the user's prompt or the discovery step.
Examples include:
For non-trivial requests, summarize the proposed design before generating executable SQL. For simple, fully specified requests, this can be reduced to a brief summary or skipped entirely.
Use:
Input
Processing
Output
Assumptions
Ask the user to confirm or correct the design before creating or modifying resources.
Before creating, modifying, or deleting a Confluent resource, present the execution plan.
The plan should identify:
Wait for explicit user confirmation before performing resource-modifying operations.
Read-only discovery and inspection may be performed before confirmation.
After the design is confirmed, generate and validate the SQL:
EXPLAIN where appropriate to catch parse/type errors without consuming CFUs.Use the existing dialect, SQL pattern, CLI, and troubleshooting references for implementation details.
Create or modify the Flink statement only after receiving explicit user confirmation:
After the statement is running:
Requirements gathering must be adaptive rather than a fixed questionnaire.
Load these on demand when the topic matches — do not read them all upfront:
| File | When to load |
|---|---|
| references/dialect-traps.md | Before writing ANY Flink SQL — 22 CC-vs-OSS traps, single source of truth |
| references/cli-reference.md | Before running confluent CLI — flag schemas, carry-over recipe, timing, token expiry |
| references/sql-patterns-cc.md | When writing SQL — CC-validated patterns: windows, joins, dedup, MATCH_RECOGNIZE, JSON, External Tables |
| references/formats-and-serialization.md | When configuring table formats — 7 supported formats, id-encoding, consume flags |
| references/troubleshooting-cc.md | When debugging errors — CC-specific error to cause to fix |
| references/reserved-words.md | When hitting parse errors — must-backquote identifiers |
Stop and consult references/dialect-traps.md if you catch yourself writing any of these:
CREATE CATALOG ... — catalog = CC environment, not creatableSET 'execution.checkpointing.*' — CC-managed, not settableCREATE TABLE ... WITH ('connector' = 'kafka', ...) — tables auto-map from topics'value.format' = 'json' — must be 'json-registry' (or another SR-backed format)WITH cte AS (...) INSERT INTO ... — CC requires the CTE AFTER INSERT INTOGROUP BY TUMBLE(ts, INTERVAL ...) — must use the TVF form: TUMBLE(TABLE t, DESCRIPTOR(ts), ...)LATERAL TABLE(UNNEST(...)) — parse error; use CROSS JOIN UNNEST(...)PROCTIME() — not supported; use External Tables/KEY_SEARCH_AGG or an event-time temporal join (avoid a regular join against an upsert-kafka topic — it retains the whole table in state)CREATE FUNCTION f AS '...' without USING JAR — CC UDFs require an uploaded artifactSTOP WITH SAVEPOINT — not exposed on CC--sql-file flag — doesn't exist; use --sql "$(cat file.sql)"DROP TABLE — deletes the physical Kafka topic and its data on CC, not just metadata; confirm before runningCanonical validation loop for any CC Flink SQL claim:
flink shell — catches syntax and type errors for free.confluent flink statement create <name> --sql "$(cat repro.sql)" --compute-pool <id> --database <cluster> --environment <env> --waitconfluent kafka topic consume <topic> --cluster <id> --from-beginning --value-format <matching-format> 2>/dev/null | grep -v '^%' — match <matching-format> to the sink's value.format (see references/formats-and-serialization.md; jsonschema for json-registry, avro for avro-registry, protobuf for proto-registry, string for raw)Escalation-required states (no silent workarounds):
PENDING > 60s → confluent flink statement exception list <name> --cloud <provider> --region <region>confluent flink artifact list --cloud <provider> --region <region>DESCRIBE <table>, diff against the producer schemaCREATE CONNECTION + USING CONNECTIONS clauseSee references/cli-reference.md for full flag schemas and timing expectations.
apache-flink cited as CC authorityconfluent CLI in anything claiming end-to-end verificationterraform apply -auto-approve on the first run of a root module.tfvars, .tfstate*, .terraform/, *.secret*statement exception listCREATE CONNECTION or UDF sourcedeveloper.confluent.io/tutorials/#flink mixes OSS and CC tutorials.
Filter rule: Only use tutorials that list "Confluent Cloud" in prerequisites or use confluent flink shell. Apply the dialect trap table to any SQL copied from a tutorial — many target OSS Flink or Kafka Streams and are not CC-compatible as-is.
references/dialect-traps.md (this skill) — canonical, consolidatedCLAUDE.md — references this skill, adds project-specific contextWhen a new trap is discovered during a session, tell the user so they can decide whether to record it in their project's own notes. Do not edit this skill's own installed files (references/dialect-traps.md or elsewhere) — propose the change and let the user (or a separate PR to this skill's repo) apply it.
confluentinc/agent-skills
204b36f
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.