Skip to content

Development standards ​

Development standards (NDD) are your project's code rules: one family per language, each rule with its level and its "why". You come to this path so the agent knows which rules apply to a task, to fetch the standards of a shared repository, or to evolve a rule.

What you ask the agent ​

💬 You ask your agent

« Which standards apply to the task you are about to do in codebase/api/? »

→ The agent callseffortless_ndd_resolve
  • path = codebase/api/
💬 You ask your agent

« List all the Rust rules, with their text. »

→ The agent callseffortless_ndd_resolve
  • include_body = true
💬 You ask your agent

« Import the Rust standard of the api module from my standards repository. »

→ The agent callseffortless_ndd_import
  • stack_id = api
  • techno = rust
💬 You ask your agent

« Use this standards repository for all my projects: git@example.org:me/standards.git. »

→ The agent callseffortless_ndd_source
  • source = git@example.org:me/standards.git
💬 You ask your agent

« Update this project's standards from the shared repository. »

→ The agent callseffortless_ndd_sync
💬 You ask your agent

« Propose making rule RUST-12 of the rust standard mandatory, because swallowed errors cost us a lot: "Propagate errors — every error is propagated or logged." »

→ The agent callseffortless_ndd_amendment_propose
  • family = rust
  • target_id = RUST-12
  • proposed_id = RUST-12
  • level = OBLIGATOIRE
  • title = Propagate errors
  • why = Swallowed errors cost us a lot
  • body = Every error is propagated or logged.
💬 You ask your agent

« I accept the amendment AMD-03 you just proposed. »

→ The agent callseffortless_ndd_amendment_accept
  • proposal_id = AMD-03
💬 You ask your agent

« Reject amendment AMD-03: we do not want this rule for now. »

→ The agent callseffortless_ndd_amendment_reject
  • proposal_id = AMD-03
  • reason = We do not want this rule for now

What the agent does ​

Find out which standards apply ​

  1. effortless_ndd_resolve: read-only. The agent passes stack (the families to resolve, named like the folders of .ai/ndd/) or path (a project path from which it derives the families). With neither, it gets the whole known corpus.
  2. Each rule comes back qualified: identifier, level (OBLIGATOIRE, RECOMMANDÉ or INTERDIT), title, why, family, origin, file and line. The full text is served only if the agent passes include_body: true.

Import a standard from a shared repository ​

  1. The address of the standard is declared in the stack, under languages[].ndd.source. If it is missing or must change, the agent fixes it with effortless_stack_declare_languages (see Code and stacks).
  2. effortless_ndd_import with stack_id and techno (the language, which also gives the family name). The verb reads the file from the repository with git show, without cloning or fetching the repository, and writes the inherited standard to .ai/ndd/<family>/<family>-ndd.v1.heritee.md, with a provenance file (repository, reference, date).
  3. If the git reference cannot be found, the import breaks nothing: the response carries available: false with the reason, and no file is written.

Follow a shared standards repository ​

  1. effortless_ndd_source declares the global source: a local folder or a git URL, with reference for a branch or tag. Without source, it reads the current source; with an empty string, it removes it. A project can override it with settings.ndd_source in its effortless.json.
  2. effortless_ndd_sync updates the project's inherited standards for each language present (declared stacks, families already there, and the agnostic family). It returns the families updated, unchanged, and those the repository does not carry. It never touches the local standard.

Propose, accept or reject an amendment ​

  1. effortless_ndd_amendment_propose with family, proposed_id, level, title, why, body, and target_id if the amendment changes an existing rule (absent: new rule). The text is analyzed the way effortless_ndd_resolve does. Only the .effortless/ndd_amendments.json registry is written (status Proposed); no standard file is touched.
  2. effortless_ndd_amendment_accept with proposal_id. The content is always written on the local side (.ai/ndd/<family>/<family>-ndd.v1.md), never in an inherited file: amending an inherited rule means overriding it locally. Same identifier as the target: the section is edited in place. Different identifier: a new section is added, the old one is not touched.
  3. effortless_ndd_amendment_reject with proposal_id and reason. The reason is recorded word for word with the date; no standard file is opened for writing.

The agent never accepts or rejects an amendment on its own: the decision is yours, and it carries it out after your agreement.

What you get ​

  • A clear list of rules before the work, instead of a guessed standard.
  • In the project: files under .ai/ndd/ (local and inherited standards, plus the provenance of the inherited ones) and the .effortless/ndd_amendments.json registry.
  • In the app: the address of the shared repository is set in Preferences › Standards (see Profile and preferences), and the Modules screen shows the Standards present for each module.

When the agent is refused ​

SituationWhat the refusal saysWhat to do
No standard in the projectndd:aucuneNormeImport or sync a standard (effortless_ndd_import, effortless_ndd_sync).
Requested family unknownndd:familleInconnue (the response lists the available families)Pick stack or family among the listed families.
Rule level out of the standardndd:niveauInconnu (file and line named)Fix the line: the level must be OBLIGATOIRE, RECOMMANDÉ or INTERDIT.
Rule without a "Why"ndd:pourquoiAbsentAdd the "Pourquoi :" line to the named rule, or pass why to a proposal.
Two rules with the same identifierndd:identifiantEnDouble (both locations named)Rename one of the two identifiers.
Unknown stack on importndd:stackInconnueList the stacks with effortless_stack_list.
Language missing from the stackndd:languageInconnuDeclare the languages with effortless_stack_declare_languages.
Standard source is not gitndd:sourceNonGitDeclare the source as git for this language; the import accepts only that.
Standards source not found or unreachablendd:sourceIntrouvable, ndd:sourceInjoignableFix the address with effortless_ndd_source (existing folder or git URL) and check your git access.
Corporate certificate not recognized by gitndd:certificatNonReconnuInstall the company root certificate, or declare it to git, then run effortless_ndd_sync again.
Amendment: targeted identifier not foundndd:identifiantViseInconnuLook the identifier up with effortless_ndd_resolve.
Amendment: unknown proposalndd:propositionInconnueUse the identifier returned by effortless_ndd_amendment_propose.
Amendment: already accepted or rejectedndd:amendementDejaArbitreNo action reopens it; a new proposal opens a new amendment.
Rejection without a reasonndd:amendementRejectReasonRequiredGive reason.

Effortless — ArboRithm