diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 73b3fd3..aac78f4 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -9,19 +9,32 @@ python -m venv ~/.venvs/zensical
source ~/.venvs/zensical/bin/activate
pip install zensical
```
-### Preview site locally
-Once installed, activate the venv and run Zensical from the repository root:
+### Running Zensical
+
+Once installed, either activate the venv or run the binary directly:
```bash
+# Option 1: Activate the venv
source ~/.venvs/zensical/bin/activate
-
-# Live preview with hot-reload
zensical serve
-# Production build
-zensical build --clean
+# Option 2: Run directly without activating
+~/.venvs/zensical/bin/zensical serve
```
+Common commands:
+
+- `zensical serve` — live preview with hot-reload
+- `zensical build --clean` — production build
+- Review build output for broken link warnings
+
+### Adding New Pages
+
+1. Create the markdown file in `docs/`
+2. Add the page to the nav section in `zensical.toml`
+3. Create corresponding code examples in all three languages under `examples/`
+4. Test locally with `zensical serve`
+
## Vendored dependencies
The Zensical theme lazy-loads a few third-party assets (Mermaid for diagrams,
diff --git a/README.md b/README.md
index 551c432..42e749a 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,7 @@
-# AWS Lambda durable functions developer documentation source
+# AWS Lambda durable execution developer documentation source
This repository contains the source for the AWS Lambda Durable Execution SDK
-documentation website at https://docs.aws.amazon.com/durable-execution,
-providing comprehensive guides and references for building resilient,
+documentation website at https://docs.aws.amazon.com/durable-execution, providing comprehensive guides and references for building resilient,
long-running applications with AWS Lambda durable functions across
multiple programming languages.
@@ -40,10 +39,9 @@ pip install zensical
zensical serve
```
-For the full authoring workflow — adding code samples, formatting conventions,
-commit messages, and pull request process — see
-[CONTRIBUTING.md](CONTRIBUTING.md). For Markdown formatting syntax, please see
-the [Authoring Guide](authoring-guide.md).
+For the full authoring workflow, please see [CONTRIBUTING.md](CONTRIBUTING.md).
+
+For writing style and Markdown formatting syntax, please see the [Authoring Guide](authoring-guide.md).
## Kiro Power
@@ -64,6 +62,7 @@ for details.
- [AWS Lambda durable functions Documentation](https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html)
- [JavaScript SDK Repository](https://github.com/aws/aws-durable-execution-sdk-js)
- [Python SDK Repository](https://github.com/aws/aws-durable-execution-sdk-python)
+- [Java SDK Repository](https://github.com/aws/aws-durable-execution-sdk-java)
## Feedback & Support
diff --git a/authoring-guide.md b/authoring-guide.md
index 200221c..c28758c 100644
--- a/authoring-guide.md
+++ b/authoring-guide.md
@@ -1,257 +1,426 @@
+# Authoring Guide
-# Getting started
+This guide covers how to author documentation for AWS Lambda Durable Functions.
+For setup and contribution workflow, see [CONTRIBUTING.md](CONTRIBUTING.md).
-For full documentation visit [zensical.org](https://zensical.org/docs/).
+Each SDK reference page must be equally useful to TypeScript, Python, and Java
+developers. No language is the implicit default. Language-specific quirks
+belong inside the relevant tab, not in shared prose.
-## Commands
-* [`zensical serve`][serve] - Start local web server
-* [`zensical build`][build] - Build your site
+## Verify Against SDK Source
- [serve]: https://zensical.org/docs/usage/preview/
- [build]: https://zensical.org/docs/usage/build/
+Before writing or updating any copy or examples, read the actual SDK source
+for every language. Do not trust existing docs. Do not guess. Verify every
+argument name, type, and return type against the source.
-## Example formatting
+Verify means: check each argument, each type of each argument and return,
+find the definition for each of those types, and if those types reference
+sub-types, find those too. Recurse until you have the full picture.
-### Admonitions
+For each code example:
-> Go to [documentation](https://zensical.org/docs/authoring/admonitions/)
+1. Find the method definition in the SDK source, not tests or docs
+2. For each parameter, find its type definition. Recurse through nested types.
+3. For Java, check both the sync and async variants (e.g. `step()` and `stepAsync()`)
+4. Check the testing libraries of each repo for examples to verify your example code actually works
-!!! note
+### SDK repositories
- This is a **note** admonition. Use it to provide helpful information.
+You will need the SDK source for all three languages. Clone them alongside
+the docs repo:
-!!! warning
+| Repository | Source path to read |
+|---|---|
+| [aws-durable-execution-sdk-js](https://github.com/aws/aws-durable-execution-sdk-js) | `packages/aws-durable-execution-sdk-js/src` |
+| [aws-durable-execution-sdk-python](https://github.com/aws/aws-durable-execution-sdk-python) | `src/aws_durable_execution_sdk_python` |
+| [aws-durable-execution-sdk-java](https://github.com/aws/aws-durable-execution-sdk-java) | `sdk/src/main/java/software/amazon/lambda/durable` |
- This is a **warning** admonition. Be careful!
+Testing SDKs are useful for confirming example code compiles and runs. The
+JavaScript and Java testing SDKs live in the same repos as the main SDKs
+(under `-testing` package paths). The Python testing SDK lives in a separate
+repo:
-### Details
+| Repository | Source path to read |
+|---|---|
+| [aws-durable-execution-sdk-python-testing](https://github.com/aws/aws-durable-execution-sdk-python-testing) | `src/aws_durable_execution_sdk_python_testing` |
-> Go to [documentation](https://zensical.org/docs/authoring/admonitions/#collapsible-blocks)
-??? info "Click to expand for more info"
-
- This content is hidden until you click to expand it.
- Great for FAQs or long explanations.
+### Key source files
-## Code Blocks
+- **TypeScript**: `types/durable-context.ts` for `DurableContext`. Check
+ `types/step.ts`, `types/core.ts`, etc. for referenced types.
+- **Python**: `context.py` for `DurableContext`. Check `config.py` for
+ `StepConfig` and `StepSemantics`. Check `types.py` for `StepContext`.
+- **Java**: `DurableContext.java` for the interface. Check
+ `config/StepConfig.java`, `StepContext.java`, `StepSemantics.java`.
-> Go to [documentation](https://zensical.org/docs/authoring/code-blocks/)
+## Writing Style
-``` python hl_lines="2" title="Code blocks"
-def greet(name):
- print(f"Hello, {name}!") # (1)!
+### Voice and Tone
+
+Write for developers who want to learn how to use the SDK. Be direct and
+technical. Avoid marketing language ("powerful", "flexible", "seamless").
+
+Don't use unnecessary words. Keep sentences concise.
+
+Use active voice. Write "the SDK checkpoints the result" not "the result is
+checkpointed".
+
+Every sentence must earn its place. If a sentence restates what the code
+already shows, delete it.
+
+Per Strunk and White, use definite, specific, concrete language. Prefer
+the specific to the general, the definite to the vague, the concrete to
+the abstract. In practice, avoid 'to be' and 'to have' where you can use
+stronger verbs.
+
+### Sentence Structure
+
+Do not use emdash (—) or hyphen as a dash. If you feel tempted to use one,
+break it into two sentences or use a comma.
+
+Keep sentences short. One idea per sentence.
-greet("Python")
+### What to Avoid
+
+**Listicles.** Do not create Terminology, Key Features, Best Practices, or
+FAQ sections. These are convenient for LLMs but not for humans learning to
+code. If you feel tempted to write one, fold the content into prose:
+
+- New terms: introduce the term naturally in the prose where it first appears
+- "Key features": drop them (usually marketing), or fold the underlying
+ capability into the relevant section
+- Best practices: fold the guidance into the section where it applies. A
+ naming best practice belongs in the "Naming steps" section, not a generic
+ "Best Practices" list.
+- FAQ Q&As: each question is either (a) a concept that belongs in prose,
+ (b) a code example that belongs in a code section, or (c) something
+ already covered elsewhere that doesn't need repeating
+
+**Navigation artifacts.** Do not add Table of Contents, "Back to top" links,
+or "Back to X" links. Zensical generates navigation automatically.
+
+**Language-specific notes outside tabs.** Any note that applies to only one
+language belongs inside that language's tab, not in shared prose.
+
+### List Items
+
+Do not use emdash or hyphen to separate a list item heading from its
+description. Use bold or links instead:
+
+```markdown
+- **StepConfig** configures retry behavior and timeouts
+- [wait()](operations/wait.md) pauses execution for a duration
```
-1. > Go to [documentation](https://zensical.org/docs/authoring/code-blocks/#code-annotations)
+## Revise, Don't Append
- Code annotations allow to attach notes to lines of code.
+When you update a page, revise the whole section. A fresh reader should not
+have to reconcile an opening sentence with a later correction tacked on at
+the end.
-Code can also be highlighted inline: `#!python print("Hello, Python!")`.
+If your new content qualifies, corrects, or extends something earlier on the
+page, rewrite the earlier prose too. Don't leave stale sentences in place
+because they were there first.
-## Content tabs
+Signs you are appending instead of revising:
-> Go to [documentation](https://zensical.org/docs/authoring/content-tabs/)
+- A new sentence at the end of a paragraph that qualifies an earlier one
+- A "Note" or "Update" near the end of a section that contradicts the opening
+- Two adjacent paragraphs making overlapping points
+- A new code example below an older, now-redundant one
-=== "Python"
+When you spot one in your own edit, rewrite the section so the reader gets
+a single, coherent story.
+
+## Look Before You Write
+
+Before writing a new page or section, search the docs for the topic. If
+another page already covers it, add to that page instead of creating a
+parallel explanation. Readers should get one canonical answer, not two
+competing ones.
+
+If you find conflicting information on another page, fix both at once. Don't
+leave a contradiction for the next reader to sort out.
+
+This applies equally to new pages and to edits on existing pages. A new
+section on an existing page can duplicate content elsewhere just as easily
+as a whole new page can.
- ``` python
- print("Hello from Python!")
+## Language Neutrality
+
+Tab order is always: **TypeScript → Python → Java**.
+
+If a language has a quirk, note it inside that language's tab:
+
+```markdown
+=== "TypeScript"
+
+ Pass `undefined` as the name to omit it.
+
+ ```typescript
+ --8<-- "examples/typescript/operations/steps/basic-step.ts"
```
-=== "Rust"
+=== "Python"
+
+ The `@durable_step` decorator uses the function name automatically.
- ``` rs
- println!("Hello from Rust!");
+ ```python
+ --8<-- "examples/python/operations/steps/basic-step.py"
```
-## Diagrams
+=== "Java"
-> Go to [documentation](https://zensical.org/docs/authoring/diagrams/)
+ The name is always required. Pass `null` to omit it.
-``` mermaid
-graph LR
- A[Start] --> B{Error?};
- B -->|Yes| C[Hmm...];
- C --> D[Debug];
- D --> B;
- B ---->|No| E[Yay!];
+ ```java
+ --8<-- "examples/java/operations/steps/basic-step.java"
+ ```
```
-## Footnotes
+## Page Structure
-> Go to [documentation](https://zensical.org/docs/authoring/footnotes/)
+SDK reference pages follow this pattern:
-Here's a sentence with a footnote.[^1]
+1. One or two short paragraphs explaining what the operation does and when
+ to use it
+2. A minimal walkthrough example (tabs, all three languages)
+3. Method signature section with per-language tabs
+4. Parameters listed after the tabs (shared where identical, inside tabs
+ where language-specific)
+5. Returns and Throws/Raises after parameters
+6. Sub-sections for config types (StepConfig, StepContext, SemanticsEnum)
+ each with per-language tabs
+7. Conceptual sub-sections as needed (naming, configuration, data passing,
+ nesting, concurrency)
+8. "See also" at the end
-Hover it, to see a tooltip.
+### Exemplar pages
-[^1]: This is the footnote.
+Model tone and structure on these pages:
+- [`wait.md`](docs/sdk-reference/operations/wait.md): simple method
+- [`step.md`](docs/sdk-reference/operations/step.md): complex method with multiple types
+- [`wait-for-condition.md`](docs/sdk-reference/operations/wait-for-condition.md): complex method with multiple types
-## Formatting
+### Template
-> Go to [documentation](https://zensical.org/docs/authoring/formatting/)
+```markdown
+# {Operation Name}
-- ==This was marked (highlight)==
-- ^^This was inserted (underline)^^
-- ~~This was deleted (strikethrough)~~
-- H~2~O
-- A^T^A
-- ++ctrl+alt+del++
+## {Concept heading — what it does}
-## Icons, Emojis
+{One or two paragraphs. Language-neutral. No listicles.}
-> Go to [documentation](https://zensical.org/docs/authoring/icons-emojis/)
+{Simple walkthrough example with tabs}
-* :sparkles: `:sparkles:`
-* :rocket: `:rocket:`
-* :tada: `:tada:`
-* :memo: `:memo:`
-* :eyes: `:eyes:`
+## Method signature
-## Maths
+### {method name}
-> Go to [documentation](https://zensical.org/docs/authoring/math/)
+=== "TypeScript"
+ {signature}
+ **Parameters:**
+ - ...
+ **Returns:** ...
+ **Throws:** ...
-$$
-\cos x=\sum_{k=0}^{\infty}\frac{(-1)^k}{(2k)!}x^{2k}
-$$
+=== "Python"
+ {signature}
+ **Parameters:**
+ - ...
+ **Returns:** ...
+ **Raises:** ...
-!!! warning "Needs configuration"
- Note that MathJax is included via a `script` tag on this page and is not
- configured in the generated default configuration to avoid including it
- in a pages that do not need it. See the documentation for details on how
- to configure it on all your pages if they are more Maths-heavy than these
- simple starter pages.
+=== "Java"
+ {sync and async signatures}
+ **Parameters:**
+ - ...
+ **Returns:** ...
+ **Throws:** ...
-
-
+### {ConfigType}
-## Task Lists
+{same pattern — interface/dataclass/builder per tab}
-> Go to [documentation](https://zensical.org/docs/authoring/lists/#using-task-lists)
+### {ContextType}
-* [x] Install Zensical
-* [x] Configure `zensical.toml`
-* [x] Write amazing documentation
-* [ ] Deploy anywhere
+### {SemanticsEnum}
-## Tooltips
+## The {operation}'s function
-> Go to [documentation](https://zensical.org/docs/authoring/tooltips/)
+### Anonymous {operation} functions
-[Hover me][example]
+### Pass arguments to the {operation} function
- [example]: https://example.com "I'm a tooltip!"
+## Naming {operations}
+## Configuration
-# basic markdown guide
-# Markdown in 5min
+## See also
-## Headers
-```
-# H1 Header
-## H2 Header
-### H3 Header
-#### H4 Header
-##### H5 Header
-###### H6 Header
+- [Related page](link)
```
-## Text formatting
-```
-**bold text**
-*italic text*
-***bold and italic***
-~~strikethrough~~
-`inline code`
-```
+## Code Examples
+
+### Requirements
+
+All code examples must:
+
+- Include all three languages (TypeScript, Python, Java)
+- Be functionally equivalent across languages
+- Include necessary imports
+- Be minimal. Show the concept, not a full application.
+- Avoid comments that restate what the code does
+- Be verified against the actual SDK source before committing
+
+### File Organization
-## Links and images
```
-[Link text](https://example.com)
-[Link with title](https://example.com "Hover title")
-
-
+examples/
+ typescript/{section}/{subsection}/{example-name}.ts
+ python/{section}/{subsection}/{example-name}.py
+ java/{section}/{subsection}/{example-name}.java
```
-## Lists
+Use hyphens in filenames. All three languages must have the same set of files.
+
+### Embedding in Docs
+
+Use the `--8<--` snippet syntax with content tabs:
+
+```markdown
+=== "TypeScript"
+
+ ```typescript
+ --8<-- "examples/typescript/operations/steps/basic-step.ts"
+ ```
+
+=== "Python"
+
+ ```python
+ --8<-- "examples/python/operations/steps/basic-step.py"
+ ```
+
+=== "Java"
+
+ ```java
+ --8<-- "examples/java/operations/steps/basic-step.java"
+ ```
```
-Unordered:
-- Item 1
-- Item 2
- - Nested item
-
-Ordered:
-1. First item
-2. Second item
-3. Third item
+
+### Method Signatures
+
+Show the actual callable signature, not pseudocode. Use real types from the
+SDK.
+
+For Java, show both sync and async variants:
+
+```markdown
+=== "Java"
+
+ ```java
+ // sync
+ T step(String name, Class resultType, Function func)
+ T step(String name, Class resultType, Function func, StepConfig config)
+
+ // async
+ DurableFuture stepAsync(String name, Class resultType, Function func)
+ DurableFuture stepAsync(String name, Class resultType, Function func, StepConfig config)
+ ```
```
-## Blockquotes
+For TypeScript, show both overloads if they exist (e.g. named and unnamed).
+
+## Formatting Reference
+
+This project uses [Zensical](https://zensical.org) to build the documentation
+site.
+
+### Admonitions
+
+```markdown
+!!! note
+
+ This is a note admonition.
+
+!!! warning
+
+ This is a warning admonition.
```
-> This is a blockquote
-> Multiple lines
->> Nested quote
+
+### Collapsible Blocks
+
+```markdown
+??? info "Click to expand"
+
+ Hidden content here.
```
-## Code blocks
-````
-```javascript
-function hello() {
- console.log("Hello, world!");
-}
+### Code Blocks
+
+````markdown
+```python hl_lines="2" title="Example"
+def greet(name):
+ print(f"Hello, {name}!")
```
````
-## Tables
-```
-| Header 1 | Header 2 | Header 3 |
-|----------|----------|----------|
-| Row 1 | Data | Data |
-| Row 2 | Data | Data |
-```
+Inline code with syntax highlighting: `` `#!python print("Hello")` ``
-## Horizontal rule
-```
----
-or
-***
-or
-___
-```
+### Content Tabs
-## Task lists
-```
-- [x] Completed task
-- [ ] Incomplete task
-- [ ] Another task
-```
+```markdown
+=== "TypeScript"
-## Escaping characters
-```
-Use backslash to escape: \* \_ \# \`
+ ```typescript
+ console.log("Hello");
+ ```
+
+=== "Python"
+
+ ```python
+ print("Hello")
+ ```
```
-## Line breaks
+### Diagrams
+
+````markdown
+```mermaid
+graph LR
+ A[Start] --> B{Error?};
+ B -->|Yes| C[Retry];
+ B -->|No| D[Done];
```
-End a line with two spaces
-to create a line break.
+````
-Or use a blank line for a new paragraph.
+### Tables
+
+```markdown
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| name | string | Step identifier |
+| config | StepConfig | Optional configuration |
```
+
+## Checklist Before Committing
+
+- [ ] All prose is language-neutral (no Python-only concepts described as universal)
+- [ ] No Table of Contents, no "Back to top" links, no "Back to X" links
+- [ ] No Terminology, Key Features, Best Practices, or FAQ sections
+- [ ] Tab order is TypeScript → Python → Java everywhere
+- [ ] Language-specific notes are inside tabs, not outside
+- [ ] All three languages have example files for every `--8<--` reference
+- [ ] Every example verified against the actual SDK source
+- [ ] Java method signatures show both sync and async variants
+- [ ] TypeScript signatures show both overloads where they exist
+- [ ] No emdash, no hyphen-as-dash
+- [ ] No passive voice
+- [ ] Updates are revisions, not tacked-on additions
+- [ ] Topic is not already covered (or duplicated) on another page
+- [ ] No contradictions with other pages
+- [ ] Ran `~/.venvs/zensical/bin/mdformat docs/path/to/file.md` on the updated file
+- [ ] Previewed with `~/.venvs/zensical/bin/zensical serve`