project-profile
Skill3 starsChanged 31 days agoMITView on GitHub
Infers a repository's own analytics-engineering conventions from the models it already contains and records them for later workflows. Use when onboarding to an unfamiliar dbt project, establishing team conventions, or refreshing a stale project profile.
6 other projects use a version of this.
Adopted by
Most recently taken up by
- brilliantrough/agent-skillstheir own version, first seen Nov 8, 2026
- Zejnilovic/agdtheir own version, first seen Nov 1, 2026
- juanitourquiza/shipframetheir own version, first seen Oct 23, 2026
- awahids/noskilltheir own version, first seen Oct 15, 2026
- lucastosetto/dev-skillstheir own version, first seen Oct 15, 2026
- jlrrequina/pi-project-profiletheir own version, first seen Sep 29, 2026
Used with
Projects with it also use tdd.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
GoogleSkilltdd
Test-driven development. Use when the user wants to build features or fix bugs test-first, mentions "red-green-refactor", or wants integration tests.
Also in 3 projects that use this
Other versions6 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 6
- brilliantrough/agent-skills★ 11same name
- Zejnilovic/agd★ 5same name
- juanitourquiza/shipframe★ 4same name
- awahids/noskill★ 1same name
- jlrrequina/pi-project-profile★ 0same name
- lucastosetto/dev-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository24 other files it gives its agents.
- analytics-requirementsSkill
- api-pipelineSkill
- bi-modelSkill
- build-modelSkill
- data-model-reviewSkill
- data-profileSkill
- data-quality-investigationSkill
- dbt-healthSkill
- explain-data-codeSkill
- freshness-investigationSkill
- incremental-modelSkill
- metric-definitionSkill
- migration-planSkill
- model-documentationSkill
- model-testsSkill
- pr-reviewSkill
- refactor-modelSkill
- rename-modelSkill
- semantic-layerSkill
- source-setupSkill
- sql-reviewSkill
- trace-lineageSkill
- validate-dbtSkill
- yaml-maintenanceSkill
The file
We split this skill into the rules it gives an agent
8 rules. 0 are common, 6 are distinctive, and 2 are very specific to this project.
0
Common
Most of the 5 edited versions we read keep these.
6
Distinctive
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 18
Do not use this skill to impose external best practice.
- Distinctive: line 27
Default silently to Work mode and produce a profile ready to use.
- Very specific: line 33
Read .ae/project.yml if it exists and compare its stored profile fingerprint against fresh inference.
- Distinctive: line 63
Every convention cites its supporting count, contradicting count, and at least one example file.
- Distinctive: line 76
Never manufacture a question to fill a section.
- Very specific: line 104
Keep inference ephemeral unless the user explicitly asks to persist or share the profile.
- Distinctive: line 105
Never copy credentials, connection strings, or profile targets into the output.
- Distinctive: line 110
Do not assume the largest directory is canonical, that a stored profile is current, that vendored packages reflect team style, that a …
“Common” is measured: kept by at least 6 in 10 of the 5 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
<!-- Generated by scripts/build_targets.py from src/skills. Edit the source and rebuild; changes made here are overwritten. -->Self-contained install.
<skill-dir>is the directory holding this file: substitute its absolute path in the commands below and run them from the repository root. Read<skill-dir>/references/operating-rules.mdbefore acting; it holds the toolkit's always-on rules, which this install cannot load on its own. This install has no safety hooks, so the approvals those rules describe rest on you and the agent rather than on an enforced gate.
Project Profile
Derive the team's conventions from the repository. Never ask a person to describe a pattern their own models already demonstrate.
When to use
- Open an unfamiliar dbt project and need its naming, testing, documentation, and SQL conventions.
- Establish or refresh
.ae/project.ymlbefore building, refactoring, or documenting models. - Reconcile a stored profile with a repository that has drifted since it was written.
- Do not use this skill to impose external best practice. It reports what this team does, not what a different team should do.
Required context
Obtain:
- Project root and whether
.ae/project.ymlalready exists. - Scope of the profile when a monorepo holds more than one dbt project.
Default silently to Work mode and produce a profile ready to use. In Learn mode, explain why each convention matters downstream. In Assessment mode, evaluate a submitted profile without correcting it.
Inspection procedure
- Confirm the project root contains
dbt_project.yml. Without it there is nothing to infer, and saying so is the correct answer. Whenpython3 "<skill-dir>/scripts/project_context.py" <repository-root>reports more than one project, profile one of them by name; a monorepo's finance and marketing projects have separate conventions, and averaging them describes neither. - Run
python3 "<skill-dir>/scripts/infer_conventions.py" <project-root> --json. Treat its tallies as the evidence base; do not restate conventions from memory of another repository. Readproject.adapter_confidencebefore writing any warehouse-specific SQL:nonemeans the repository has not said which warehouse it runs on, andpartition_byorcluster_byin the models is not an answer, because several warehouses use both. - Read
.ae/project.ymlif it exists and compare its stored profile fingerprint against fresh inference. Report a changed fingerprint as staleness, then compare values; a human edit outranks an inference and must not be silently overwritten. - Inspect the highest-signal disagreements directly. When a convention is
split, open the contradicting files named inexamplesand determine whether the split is a real disagreement or an artifact of layering, vendored packages, or a legacy directory mid-migration. - Separate house conventions from observed resource patterns/contracts. SQL/YAML style, test keys, naming, and surrogate-key implementations can be team-wide conventions. A source's
loaded_at_fieldand freshness thresholds are resource contracts that can correctly differ by ingestion system, domain, or SLA; report them by source/table and never turn their majority into a default for an unrelated source. Materializations, schedules, and orchestration are declared configuration, not inferred patterns, and are reported as facts. - Identify what the repository cannot answer at all, and carry those forward as open questions rather than defaults.
Decision framework
Report each convention at the strength the evidence supports:
strong: dominant and repeated. Safe to apply silently in later workflows.weak: a real majority on thin or contested evidence. Usable, but every later application states the assumption.split: no dominant pattern. Escalate to a question with the candidate counts attached.absent: no evidence. Neither a convention nor a question; later workflows pick a defensible default and say so.
A young repository legitimately produces mostly weak conventions. Reporting thin evidence as settled practice is a worse failure than reporting uncertainty.
Failure modes
- Asking the user which naming convention they use when the models answer it.
- Filling a required output section with an invented question because the repository left it empty.
- Presenting an inference as a team decision, or a personal preference as an inference.
- Treating the most common source load field or freshness SLA as a team-wide convention.
- Overwriting hand-edited profile values with a fresh inference.
- Reading a vendored
dbt_packagesdirectory as if it were the team's own code. - Averaging away a genuine split so the profile looks complete.
- Treating a convention that holds across three models as established practice.
- Raising inference corrections when the profile was accepted unchanged, which turns a useful offer into a recurring prompt.
Evidence required
Every convention cites its supporting count, contradicting count, and at least one example file. Percentages state their denominator. Drift between a stored profile and the repository names both values and the files that disagree.
Output contract
Return # Project Profile with: Detected stack; House conventions by strength; Observed resource patterns/contracts; Open questions; Drift from stored profile; Proposed .ae/project.yml; What to confirm. Add Inference corrections only under the condition described below.
Present conventions as "detected from N models," and put every split convention in Open questions with its candidates. Ask for confirmation of the whole profile once rather than field by field.
Two of these sections are frequently empty, and empty is the correct result rather than an incomplete one:
- Open questions holds only
splitconventions and genuinely semantic unknowns. A repository that is internally consistent produces none. Write "None; every convention below is settled by the repository" and move on. - What to confirm is a single accept-or-edit on the whole profile, not a list of decisions to relitigate. Nothing reported as
strongorweakmay reappear here as a question. If you have already counted a prefix, a directory, a test pair, a YAML layout, or a SQL style, it is settled, and asking the reader to choose it contradicts the section above that just proved it.
Never manufacture a question to fill a section. If both sections are empty, the profile is finished, and saying so is the strongest possible answer.
Inference corrections
When a person changes a value this workflow inferred, that edit is the most informative thing the run produces. It is a labelled example of static inference being wrong, or of a convention that files alone cannot express, and it costs nothing to surface because it already exists on disk.
Include this section only when a human value disagrees with a counted inference: an edit made to the proposed profile during this run, or a stored .ae/project.yml value that contradicts a fresh inference. Omit it entirely otherwise. Unlike the sections above it is an offer rather than a finding, and an offer repeated when there is nothing to offer is noise.
Report each disagreement as the field, the inferred value with its strength and counts, and the value the human chose. They do not carry equal information, so order them accordingly:
- Overriding a
stronginference is the strongest signal. Either the counting misread the repository, or the team is deliberately moving away from its own dominant pattern. Both matter and the files cannot distinguish them, so report it without deciding which it is. - Filling an
absentorsplitfield shows what static inference cannot see at all. - Correcting a
weakinference points at mis-tuned evidence thresholds rather than a misreading.
Nothing is transmitted. This plugin has no network path, and the section exists so that someone who wants to report an inference defect can copy an accurate description of one. State that sharing is optional, one-directional, and carried by the person rather than the tool.
Field names, strengths, and counts are generic and identify nobody. Values are not always: a source schema can name a vendor, a directory can name a client, and a prefix can encode a business domain. Flag any value carrying that risk and offer a redacted form beside it, so the decision to share is made against a payload the reader has actually seen.
Verification
- Re-run the inference after the user edits the profile and confirm the edits survive.
- Spot-check at least one example file per
strongconvention before publishing it. - Confirm counts sum correctly against the model inventory and that excluded paths are named.
- Recompute any percentage you derive yourself rather than restating a tool figure with new arithmetic on top.
Safety/privacy
- Inference is static. Never execute dbt, contact a warehouse, or call MCP to build a profile.
- Keep inference ephemeral unless the user explicitly asks to persist or share the profile. An explicit save request permits creating
.ae/project.yml; replacing a human-edited profile still requires showing drift and receiving approval. - Never copy credentials, connection strings, or profile targets into the output.
- Inference corrections are written into the local output and nowhere else. Never offer to send one, and never read a willingness to share as approval for anything further.
What not to assume
Do not assume the largest directory is canonical, that a stored profile is current, that vendored packages reflect team style, that a convention with few instances is settled, or that a split is an error rather than a migration in progress.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
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.

