Compare commits

...

4 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
6a9bd7adcb feat: add GitHub project management infrastructure (RACI, issue templates, workflows)
Co-authored-by: amarantha-k <13425257+amarantha-k@users.noreply.github.com>
2026-03-02 21:44:33 +00:00
copilot-swe-agent[bot]
2680344850 Initial plan 2026-03-02 21:38:00 +00:00
oeggert
16364ea2d5 Merge pull request #3527 from XRPLF/update-lending-spec
Add DestinationTag and update links to lending spec
2026-02-27 15:55:25 -08:00
Oliver Eggert
27c25dbb12 add DestinationTag and update links to lending spec 2026-02-27 15:43:40 -08:00
17 changed files with 990 additions and 8 deletions

38
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1,38 @@
# CODEOWNERS
# Defines code ownership for automatic review assignment.
# The last matching pattern takes precedence.
# See: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
# Global default — core maintainers review everything
* @XRPLF/docs-maintainers
# Concepts and narrative docs
/docs/concepts/ @XRPLF/docs-maintainers
# Tutorials
/docs/tutorials/ @XRPLF/docs-maintainers
# API reference
/docs/references/ @XRPLF/docs-maintainers
# Infrastructure / node docs
/docs/infrastructure/ @XRPLF/docs-maintainers
# Code samples — require technical review
/_code-samples/ @XRPLF/docs-maintainers
# API examples
/_api-examples/ @XRPLF/docs-maintainers
# Site theme and web tooling
/@theme/ @XRPLF/docs-maintainers
/styles/ @XRPLF/docs-maintainers
# Localization files
/@l10n/ @XRPLF/docs-maintainers
# CI/CD and project configuration — maintainer-only
/.github/ @XRPLF/docs-maintainers
/redocly.yaml @XRPLF/docs-maintainers
/package.json @XRPLF/docs-maintainers
/package-lock.json @XRPLF/docs-maintainers

67
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,67 @@
name: "Bug Report"
description: Report a typo, broken link, incorrect information, or other documentation error
title: "[Bug]: "
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for helping improve the XRP Ledger documentation! Please fill out this form as completely as possible.
- type: input
id: page-url
attributes:
label: Affected Page URL
description: The URL of the page with the issue (e.g. https://xrpl.org/docs/...)
placeholder: "https://xrpl.org/docs/..."
validations:
required: true
- type: dropdown
id: bug-type
attributes:
label: Type of Issue
description: What kind of problem did you find?
options:
- Typo or grammar error
- Broken or incorrect link
- Incorrect technical information
- Outdated content
- Missing content
- Formatting or display issue
- Other
validations:
required: true
- type: textarea
id: description
attributes:
label: Description
description: Describe the problem clearly. Include what is wrong and what it should say instead.
placeholder: "The page states X, but it should say Y because..."
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected Content
description: What should the correct content say?
validations:
required: false
- type: input
id: source-reference
attributes:
label: Source Reference (optional)
description: Link to source code, specification, or other reference that confirms the correct information
placeholder: "https://github.com/XRPLF/rippled/..."
- type: checkboxes
id: checklist
attributes:
label: Checklist
options:
- label: I have searched existing issues to confirm this has not already been reported
required: true
- label: I have verified this issue exists on the live site (not just locally)

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: XRP Ledger Developer Discord
url: https://discord.gg/xrpl
about: Ask questions and discuss XRP Ledger development with the community
- name: XRPL.org Feedback
url: https://xrpl.org/about/contact
about: General feedback about the XRP Ledger portal

View File

@@ -0,0 +1,86 @@
name: "Content Update"
description: Request an update, addition, or improvement to existing documentation
title: "[Content]: "
labels: ["content updates"]
body:
- type: markdown
attributes:
value: |
Use this template to request changes to existing documentation content — for example, adding new details, updating outdated information, or improving clarity.
- type: input
id: page-url
attributes:
label: Affected Page URL
description: URL of the page that needs updating (if applicable)
placeholder: "https://xrpl.org/docs/..."
- type: dropdown
id: update-type
attributes:
label: Type of Update
options:
- Add missing information
- Update outdated content
- Improve clarity or readability
- Reorganize or restructure content
- Add examples or code samples
- Other
validations:
required: true
- type: dropdown
id: content-area
attributes:
label: Content Area
description: Which area of the documentation does this affect?
options:
- Concepts
- Tutorials
- References / API
- Infrastructure / Nodes
- Tokenization / NFTs
- DEX / AMM
- Payment Channels / Escrow
- Accounts / Wallets
- Localization / Translation
- Site tooling
- Other
validations:
required: true
- type: textarea
id: description
attributes:
label: Description
description: Describe what needs to be changed and why. Be as specific as possible.
placeholder: "The documentation for X needs to be updated because..."
validations:
required: true
- type: input
id: source-reference
attributes:
label: Source / Reference
description: Link to the rippled source, amendment details, XLS proposal, or other authoritative reference
placeholder: "https://github.com/XRPLF/rippled/..."
- type: dropdown
id: amendment-status
attributes:
label: Amendment Status (if applicable)
description: If this relates to a protocol amendment, what is its status?
options:
- "N/A"
- In development (not yet proposed)
- Proposed (in open voting)
- Enabled on Mainnet
- Enabled on Devnet/Testnet only
- type: checkboxes
id: checklist
attributes:
label: Checklist
options:
- label: I have searched existing issues to avoid duplicates
required: true

View File

@@ -0,0 +1,66 @@
name: "Feature Request"
description: Suggest a new page, section, tool, or site feature
title: "[Feature]: "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Use this template to suggest a new documentation page, site feature, or tooling improvement for the XRP Ledger Developer Portal.
- type: dropdown
id: feature-type
attributes:
label: Feature Type
options:
- New documentation page or section
- New interactive tool or code sample
- Site navigation or UX improvement
- Developer tooling or CI/CD improvement
- Localization support
- Other
validations:
required: true
- type: textarea
id: problem
attributes:
label: Problem to Solve
description: Describe the problem or gap this feature would address. Who would benefit?
placeholder: "As a developer building on the XRP Ledger, I need..."
validations:
required: true
- type: textarea
id: solution
attributes:
label: Proposed Solution
description: Describe what you'd like to see added or changed.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives Considered
description: Have you considered any alternative approaches?
- type: dropdown
id: priority
attributes:
label: Priority (your assessment)
options:
- Low nice to have
- Medium would significantly improve the docs
- High blocks common developer workflows
validations:
required: true
- type: checkboxes
id: checklist
attributes:
label: Checklist
options:
- label: I have searched existing issues to avoid duplicates
required: true
- label: I am willing to contribute a PR for this feature

52
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,52 @@
## Description
<!-- Provide a clear, concise description of what this PR does. -->
Fixes #<!-- issue number -->
## Type of Change
<!-- Check all that apply -->
- [ ] Bug fix (documentation typo, broken link, incorrect information)
- [ ] Content update (new information, updated existing docs)
- [ ] New page or section
- [ ] Site feature / tooling change
- [ ] Localization / translation
- [ ] Refactoring (no functional change)
## RACI Confirmation
This project follows a RACI model for contributions. Please confirm the following:
| Role | Description | Confirmed |
|------|-------------|-----------|
| **R Responsible** | I am the author of these changes and have completed the work described above | - [ ] |
| **A Accountable** | I understand that a maintainer must approve this PR before it can be merged | - [ ] |
| **C Consulted** | I have tagged relevant subject-matter experts as reviewers (if applicable) | - [ ] |
| **I Informed** | The linked issue keeps stakeholders informed of this change | - [ ] |
> See [RACI Model](.github/project-management/RACI.md) for full role definitions.
## Review Checklist
**Author (Responsible)**
- [ ] PR is linked to an open issue
- [ ] Changes are accurate and technically correct
- [ ] Content follows the [style guide](https://xrpl.org/resources/contribute-documentation/)
- [ ] All links work and point to correct targets
- [ ] Code samples (if any) have been tested
- [ ] Localization impact considered (does this need translation updates?)
**Reviewer (Accountable / Consulted)**
- [ ] Technical accuracy verified
- [ ] Writing is clear and follows style guidelines
- [ ] No broken links or missing references
- [ ] No security-sensitive information inadvertently exposed
## Screenshots (if applicable)
<!-- Add before/after screenshots for UI or formatting changes -->
## Additional Notes
<!-- Any context, decisions made, or follow-up items -->

80
.github/labeler.yml vendored Normal file
View File

@@ -0,0 +1,80 @@
# Auto-labeler configuration for pull_request_target events.
# Labels are applied based on which files are changed in the PR.
# See: https://github.com/actions/labeler
"content updates":
- changed-files:
- any-glob-to-any-file:
- "docs/**/*.md"
- "docs/**/*.mdx"
- "docs/**/*.page.tsx"
"web dev":
- changed-files:
- any-glob-to-any-file:
- "@theme/**"
- "styles/**"
- "*.tsx"
- "*.ts"
- "shared/**"
"docs-tooling":
- changed-files:
- any-glob-to-any-file:
- ".github/**"
- "redocly.yaml"
- "package.json"
- "package-lock.json"
- "tsconfig.json"
- "sidebars.yaml"
- "redirects.yaml"
"localization":
- changed-files:
- any-glob-to-any-file:
- "@l10n/**"
- "translations.yaml"
- "**/*.ja.md"
- "**/*.es-ES.md"
"javascript":
- changed-files:
- any-glob-to-any-file:
- "_code-samples/**/*.js"
- "_code-samples/**/*.mjs"
- "_code-samples/**/*.cjs"
- "docs/tutorials/**/*javascript*"
- "docs/tutorials/**/*js*"
"python":
- changed-files:
- any-glob-to-any-file:
- "_code-samples/**/*.py"
- "docs/tutorials/**/*python*"
"java":
- changed-files:
- any-glob-to-any-file:
- "_code-samples/**/*.java"
- "docs/tutorials/**/*java*"
"tokenization":
- changed-files:
- any-glob-to-any-file:
- "docs/**/*nft*"
- "docs/**/*token*"
- "docs/**/*fungible*"
- "docs/tutorials/nfts/**"
- "docs/concepts/tokens/**"
"infra":
- changed-files:
- any-glob-to-any-file:
- "docs/infrastructure/**"
"organization":
- changed-files:
- any-glob-to-any-file:
- "sidebars.yaml"
- "top-nav.yaml"
- "redirects.yaml"

179
.github/project-management/RACI.md vendored Normal file
View File

@@ -0,0 +1,179 @@
# RACI Model — XRP Ledger Developer Portal
This document defines the **RACI model** used to manage contributions to the XRP Ledger Developer Portal. RACI ensures every task has clear ownership, appropriate oversight, and proper communication for all stakeholders.
---
## What is RACI?
| Letter | Role | Description |
|--------|------|-------------|
| **R** | **Responsible** | The person who does the work. Every issue and PR must have exactly one responsible party. |
| **A** | **Accountable** | The person ultimately answerable for the outcome. Must approve work before it is merged. There is always exactly one accountable person per change. |
| **C** | **Consulted** | Subject-matter experts whose input is needed before or during the work. Two-way communication. |
| **I** | **Informed** | Stakeholders kept up to date on decisions and outcomes. One-way communication. |
---
## Role Mapping for This Project
### R Responsible (Contributors)
- **Community contributors** — anyone opening issues or submitting PRs
- **Assigned issue owners** — maintainers or contributors assigned to an issue
- Responsible parties create PRs, write content, and address review feedback
- A single contributor should be assigned `Responsible` per issue/PR
### A Accountable (Maintainers / CODEOWNERS)
- The **`@XRPLF/docs-maintainers`** team is accountable for all merged changes
- Enforced via [CODEOWNERS](../CODEOWNERS): every PR requires at least **one approval** from a code owner before it can be merged
- Maintainers may delegate review to subject-matter experts (Consulted) but remain accountable for the final merge decision
- Branch protection rules require:
- ✅ At least **1 approving review** from a CODEOWNER
- ✅ All **status checks pass** (CI workflows)
-**No unresolved conversations**
### C Consulted (Subject-Matter Experts)
Depending on the content area, the relevant experts should be tagged as reviewers:
| Content Area | Who to Consult |
|---|---|
| Protocol / core XRP Ledger mechanics | Protocol engineers (`@XRPLF/rippled` team members) |
| Smart contracts / Hooks | Hooks developers |
| NFT / tokenization | Tokenization working group |
| AMM / DeFi | DeFi working group |
| Client libraries (xrpl.js, xrpl-py, xrpl4j) | Respective library maintainers |
| Localization | Translation contributors for the target language |
| Site tooling / Redocly | Redocly configuration owners |
Tag SMEs using `@username` in PR descriptions or inline review comments.
### I Informed (Stakeholders)
The following parties are automatically informed via GitHub notifications:
- **Issue reporters** — notified of comments and resolution
- **PR watchers** — subscribed to PR updates
- **Repository watchers** — receive notifications for all activity
- **Linked issues** — cross-referenced via `Fixes #<number>` in PR descriptions
---
## RACI by Activity Type
| Activity | R (Does the Work) | A (Approves) | C (Consulted) | I (Informed) |
|---|---|---|---|---|
| Report a bug or issue | Community contributor | Maintainer (triage) | — | Repo watchers |
| Fix a documentation bug | Community contributor / Maintainer | CODEOWNER | SME if technical | Issue reporter |
| Write a new doc page | Assigned contributor | CODEOWNER | Protocol SME + Tech writer | Community |
| Update API reference | Assigned contributor | CODEOWNER | Protocol engineer | Developers |
| Add/update code sample | Contributor | CODEOWNER | Library maintainer | Developers |
| Merge a PR | — | CODEOWNER | — | PR author, watchers |
| Triage issues | Maintainer | Lead maintainer | — | Issue reporter |
| Release / deploy | CI/CD (automated) | Lead maintainer | — | Stakeholders |
| Update site tooling | Maintainer | CODEOWNER | Redocly config owner | All contributors |
---
## Workflow Summary
```
Community Contributor (R)
├─ Opens Issue ──────────────────────► Auto-triage labels applied
│ Maintainer triages & prioritizes
└─ Opens Pull Request ────────────────► PR Validation check runs
│ Auto-labels applied
│ Greeting for new contributors
├─ Tags SME reviewers (C) ───────► SMEs leave review comments
└─ Maintainer reviews (A) ───────► Approves or requests changes
└─ All checks pass ─────────► PR merged by Accountable maintainer
```
---
## Project Board
The XRP Ledger Developer Portal uses a **GitHub Project board** to track issue and PR status. The board has the following columns:
| Column | Description |
|---|---|
| **📋 Backlog** | Issues that are accepted but not yet scheduled |
| **🔍 Needs Triage** | New issues awaiting maintainer review |
| **📅 Planned** | Issues scheduled for an upcoming milestone |
| **🚧 In Progress** | Issues with a linked open PR or active assignee |
| **👀 In Review** | PRs awaiting review or with pending change requests |
| **✅ Done** | Merged PRs and closed issues |
> **Setup**: Maintainers can create and configure the board at:
> [organization-level project](https://github.com/orgs/XRPLF/projects)
> or
> [repository-level project](https://github.com/XRPLF/xrpl-dev-portal/projects)
### Automation Rules (configure in GitHub Projects)
- **Issue opened** → Move to _Needs Triage_
- **Label `stale` added** → Move to _Backlog_
- **PR opened / linked to issue** → Move issue to _In Progress_
- **PR review requested** → Move PR to _In Review_
- **PR merged** → Move to _Done_ and close linked issue
- **Issue closed** → Move to _Done_
---
## Branch Protection Requirements
To enforce the "at least one human review" requirement, configure branch protection on `master`:
1. Go to **Settings → Branches → Branch protection rules**
2. Add a rule for `master` (or your default branch)
3. Enable:
-**Require a pull request before merging**
-**Require approvals** — set to **1** (minimum)
-**Require review from Code Owners** (enforces CODEOWNERS file)
-**Require status checks to pass before merging**
- Add: `validate-pr` (from `pr-check.yml`)
-**Require conversation resolution before merging**
-**Do not allow bypassing the above settings** (for non-admins)
---
## Labels Reference
| Label | Description | Who Applies |
|---|---|---|
| `bug` | Typo, broken link, or incorrect info | Auto-triage / contributor |
| `content updates` | Updates to existing documentation | Auto-triage / maintainer |
| `enhancement` | New pages or features | Auto-triage / maintainer |
| `good first issue` | Suitable for new contributors | Maintainer |
| `help wanted` | Community contributions welcome | Maintainer |
| `needs triage` | Awaiting maintainer review | Auto-triage |
| `stale` | No activity for 90+ days | Stale bot |
| `wip` | Work in progress, not ready for review | Contributor |
| `tokenization` | NFT/token-related content | Auto-triage |
| `infra` | Validator/node/server content | Auto-triage |
| `web dev` | Site tooling, styles, templates | Auto-triage |
| `organization` | Navigation, structure, architecture | Auto-triage |
| `docs-tooling` | CI/CD, build tooling | Auto-triage |
| `localization` | Translation and i18n | Auto-triage |
| `javascript` | JavaScript code samples/tutorials | Auto-triage |
| `python` | Python code samples/tutorials | Auto-triage |
---
## Contributing Quick Reference
1. **Find an issue** — Browse the [project board](https://github.com/XRPLF/xrpl-dev-portal/issues) or open a new one using a template
2. **Assign yourself** — Comment "I'll work on this" or ask a maintainer to assign you
3. **Fork & branch** — Create a branch from `master`
4. **Make changes** — Follow the [style guide](https://xrpl.org/resources/contribute-documentation/)
5. **Open a PR** — Fill out the PR template completely, including RACI confirmation
6. **Tag reviewers** — Add SMEs as reviewers for technical accuracy
7. **Address feedback** — Respond to review comments and push updates
8. **Merge** — A maintainer (Accountable) will merge once all checks pass

19
.github/workflows/auto-label.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: Auto-Label Pull Requests
on:
pull_request_target:
types: [opened, synchronize, reopened]
permissions:
contents: read
pull-requests: write
jobs:
label:
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v5
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
configuration-path: .github/labeler.yml
sync-labels: true

92
.github/workflows/greet-contributor.yml vendored Normal file
View File

@@ -0,0 +1,92 @@
name: Greet New Contributors
on:
issues:
types: [opened]
pull_request_target:
types: [opened]
permissions:
issues: write
pull-requests: write
jobs:
greet:
runs-on: ubuntu-latest
steps:
- name: Greet first-time issue reporter
if: github.event_name == 'issues'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const creator = context.payload.issue.user.login;
// Check if this is their first issue in the repo
const { data: issues } = await github.rest.issues.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
creator: creator,
state: 'all',
});
// If only 1 issue exists, it's the one they just opened
if (issues.length <= 1) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.issue.number,
body: [
`👋 Welcome to the XRP Ledger Developer Portal, @${creator}! Thanks for opening your first issue.`,
'',
'Here are a few things to know:',
'- A maintainer will triage this issue and add appropriate labels',
'- If you\'d like to fix this yourself, check out our [Contributing Guide](https://xrpl.org/resources/contribute-documentation/)',
'- Join the conversation on [XRPL Discord](https://discord.gg/xrpl) if you have questions',
'',
'We appreciate your contribution to the XRP Ledger community! 🚀',
].join('\n'),
});
}
- name: Greet first-time PR contributor
if: github.event_name == 'pull_request_target'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const creator = context.payload.pull_request.user.login;
// Check previous merged PRs from this user
const { data: prs } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'all',
});
const userPRs = prs.filter(pr => pr.user.login === creator);
// If this is their first PR
if (userPRs.length <= 1) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: [
`🎉 Welcome, @${creator}! Thanks for submitting your first pull request to the XRP Ledger Developer Portal.`,
'',
'Here\'s what happens next:',
'1. 🔍 Automated checks will run on your PR',
'2. 👀 A maintainer will review your changes (this may take a few days)',
'3. 💬 You may receive feedback or requests for changes',
'4. ✅ Once approved by a maintainer, your PR will be merged',
'',
'Please make sure your PR:',
'- Has a clear description of what was changed and why',
'- Is linked to an open issue (e.g. `Fixes #123`)',
'- Follows our [style guide](https://xrpl.org/resources/contribute-documentation/)',
'',
'Thank you for contributing to the XRP Ledger community! 🙏',
].join('\n'),
});
}

97
.github/workflows/issue-triage.yml vendored Normal file
View File

@@ -0,0 +1,97 @@
name: Issue Triage
on:
issues:
types: [opened, reopened]
permissions:
issues: write
jobs:
triage:
runs-on: ubuntu-latest
steps:
- name: Auto-label based on issue title and body
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const issue = context.payload.issue;
const title = (issue.title || '').toLowerCase();
const body = (issue.body || '').toLowerCase();
const text = title + ' ' + body;
const labelsToAdd = new Set();
// --- keyword → label mapping ---
const rules = [
// Content areas
{ patterns: ['nft', 'nonfungible', 'non-fungible', 'token', 'mpt', 'fungible'], label: 'tokenization' },
{ patterns: ['amm', 'dex', 'offer', 'liquidity', 'pool'], label: 'defi' },
{ patterns: ['escrow', 'payment channel', 'check'], label: 'content updates' },
{ patterns: ['tutorial', 'how to', 'how-to', 'walkthrough', 'guide'], label: 'content updates' },
{ patterns: ['api', 'rpc', 'websocket', 'method', 'command', 'response field'], label: 'content updates' },
{ patterns: ['amendment', 'feature flag'], label: 'content updates' },
{ patterns: ['rippled', 'validator', 'node', 'server', 'peer'], label: 'infra' },
{ patterns: ['javascript', 'js ', 'node.js', 'typescript'], label: 'javascript' },
{ patterns: ['python'], label: 'python' },
{ patterns: ['java', 'xrpl4j'], label: 'java' },
{ patterns: ['navigate', 'menu', 'sidebar', 'landing page', 'homepage'], label: 'organization' },
{ patterns: ['style', 'css', 'layout', 'theme', 'mobile', 'responsive'], label: 'web dev' },
{ patterns: ['translate', 'translation', 'locali', 'japanese', 'spanish'], label: 'localization' },
{ patterns: ['broken link', 'dead link', '404 error', 'page not found', 'typo', 'grammar', 'spelling'], label: 'bug' },
{ patterns: ['redocly', 'build', 'ci ', 'ci/', 'workflow', 'lint', 'tooling'], label: 'docs-tooling' },
];
for (const rule of rules) {
if (rule.patterns.some(p => text.includes(p))) {
labelsToAdd.add(rule.label);
}
}
// If no labels matched, add 'needs triage' so maintainers notice it
if (labelsToAdd.size === 0) {
labelsToAdd.add('needs triage');
}
const existingLabels = (issue.labels || []).map(l => l.name);
const newLabels = [...labelsToAdd].filter(l => !existingLabels.includes(l));
if (newLabels.length > 0) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
labels: newLabels,
});
console.log(`Added labels: ${newLabels.join(', ')}`);
} else {
console.log('No new labels to add.');
}
- name: Request triage for unlabeled issues
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const issue = context.payload.issue;
const labels = (issue.labels || []).map(l => l.name);
// If the only label is 'needs triage', add a comment directing maintainers
if (labels.length === 1 && labels[0] === 'needs triage') {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: [
'👋 Thanks for opening this issue!',
'',
'This issue has been flagged for **maintainer triage** because it could not be automatically categorized.',
'A maintainer will review it shortly to add labels and assess priority.',
'',
'In the meantime, you can help by:',
'- Making sure the issue title clearly describes the problem',
'- Adding a link to the affected page (for documentation issues)',
'- Providing a reference to source code or specs (for technical accuracy issues)',
].join('\n'),
});
}

95
.github/workflows/pr-check.yml vendored Normal file
View File

@@ -0,0 +1,95 @@
name: PR Validation
on:
pull_request_target:
types: [opened, edited, synchronize, reopened]
permissions:
pull-requests: write
issues: read
jobs:
validate-pr:
runs-on: ubuntu-latest
steps:
- name: Validate PR description and linked issue
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const pr = context.payload.pull_request;
const body = pr.body || '';
const title = pr.title || '';
const warnings = [];
const errors = [];
// 1. PR must have a non-trivial description
const descriptionSection = body.replace(/<!--[\s\S]*?-->/g, '').trim();
if (descriptionSection.length < 30) {
errors.push('❌ **Missing description**: Please provide a clear description of what this PR changes and why.');
}
// 2. PR should reference an issue (Fixes/Closes/Resolves #N or mention #N)
const issueRef = /(?:fix(?:es|ed)?|close[sd]?|resolve[sd]?)\s+#\d+|#\d+/i.test(body);
if (!issueRef) {
warnings.push('⚠️ **No linked issue detected**: Consider linking this PR to an issue using `Fixes #<number>` so progress is tracked on the project board.');
}
// 3. RACI table must have at least Responsible checked
// Simple check: if the RACI section exists, at least one checkbox should be filled
if (body.includes('RACI') && !/- \[x\]/i.test(body)) {
warnings.push('⚠️ **RACI checklist incomplete**: Please tick the checkboxes in the RACI Confirmation table.');
}
// 4. Draft PRs skip hard errors
const isDraft = pr.draft;
// Post a review comment only if there are issues
if (errors.length > 0 || warnings.length > 0) {
const lines = [
'## 🤖 PR Validation Report',
'',
...errors,
...warnings,
'',
isDraft ? '_This is a draft PR — errors above will need to be resolved before requesting review._'
: '_Please address the items above before requesting a maintainer review._',
'',
'---',
'_This comment is generated automatically. See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines._',
];
// Check if we already posted a validation comment so we update rather than duplicate
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
});
const botComment = comments.find(c =>
c.user.type === 'Bot' && c.body.includes('PR Validation Report')
);
const commentBody = lines.join('\n');
if (botComment) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
body: commentBody,
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
body: commentBody,
});
}
// Fail the check if there are hard errors and this is not a draft
if (errors.length > 0 && !isDraft) {
core.setFailed(`PR validation failed: ${errors.join(' | ')}`);
}
}

73
.github/workflows/stale.yml vendored Normal file
View File

@@ -0,0 +1,73 @@
name: Stale Issue & PR Management
on:
schedule:
# Runs daily at 01:00 UTC
- cron: "0 1 * * *"
workflow_dispatch:
permissions:
issues: write
pull-requests: write
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
# ── Issues ────────────────────────────────────────────────────────
days-before-issue-stale: 90
days-before-issue-close: 14
stale-issue-label: "stale"
stale-issue-message: >
This issue has been open for 90 days with no recent activity.
It will be closed in 14 days unless someone comments or removes
the `stale` label.
If this issue is still relevant, please:
- Leave a comment with an update
- Remove the `stale` label if you plan to work on it
- Link it to an open PR if work is already in progress
close-issue-message: >
This issue was closed due to inactivity (90 + 14 days).
If you believe it is still relevant, please open a new issue
and reference this one.
# Issues with these labels are never marked stale
exempt-issue-labels: >
pinned,
security,
good first issue,
help wanted
# ── Pull Requests ─────────────────────────────────────────────────
days-before-pr-stale: 30
days-before-pr-close: 7
stale-pr-label: "stale"
stale-pr-message: >
This pull request has been open for 30 days with no recent activity.
It will be closed in 7 days unless there is new activity.
If this PR is still in progress:
- Push an update or leave a comment
- Remove the `stale` label to reset the timer
close-pr-message: >
This pull request was closed due to inactivity (30 + 7 days).
The branch has been preserved. Please open a new PR if you
wish to continue this work.
exempt-pr-labels: >
pinned,
security,
work in progress,
wip
# Keep the stale label when the issue/PR becomes active again
remove-stale-when-updated: true
# Only count non-bot comments as activity
operations-per-run: 100

View File

@@ -1,3 +1,32 @@
# Contributing
For information about how to contribute to this repository, see [Contribute Documentation (XRPL.org)](https://xrpl.org/resources/contribute-documentation/).
For information about how to contribute to this repository, see [Contribute Documentation (XRPL.org)](https://xrpl.org/resources/contribute-documentation/).
## Quick Start
1. **Report an issue** — Use one of the [issue templates](.github/ISSUE_TEMPLATE/) to report bugs, request content updates, or suggest new features.
2. **Work on an issue** — Browse [open issues](https://github.com/XRPLF/xrpl-dev-portal/issues) with the `good first issue` or `help wanted` labels.
3. **Submit a pull request** — Fill out the [PR template](.github/PULL_REQUEST_TEMPLATE.md) completely, including linking to the issue you are addressing.
## Review Process (RACI Model)
This project follows a [RACI model](.github/project-management/RACI.md) to manage contributions:
- **R Responsible**: The contributor who authors the change
- **A Accountable**: A maintainer from `@XRPLF/docs-maintainers` who approves and merges
- **C Consulted**: Subject-matter experts tagged as reviewers for technical accuracy
- **I Informed**: Stakeholders notified via linked issues and PR comments
**At least one maintainer approval is required before any PR can be merged.**
## Automated Workflows
The following GitHub Actions workflows run automatically:
| Workflow | Trigger | Purpose |
|---|---|---|
| Issue Triage | New issue opened | Applies labels based on content |
| PR Validation | PR opened/updated | Validates description and linked issue |
| Auto-Label | PR opened/updated | Labels PRs based on changed file paths |
| Stale Management | Daily | Marks and closes inactive issues/PRs |
| Greet Contributor | First issue/PR | Welcomes new contributors |

View File

@@ -40,11 +40,12 @@ Only the owner of the associated `LoanBroker` entry can initiate this transactio
In addition to the [common fields][], {% code-page-name /%} transactions use the following fields:
| Field Name | JSON Type | Internal Type | Required? | Description |
|:-------------- |:--------------------|:--------------|:----------|:------------|
| `LoanBrokerID` | String | Hash256 | Yes | The ID of the `LoanBroker` ledger entry to withdraw from. |
| `Amount` | [Currency Amount][] | Amount | Yes | The amount of first-loss capital to withdraw. |
| `Destination` | String | AccountID | No | An account to receive the assets. |
| Field Name | JSON Type | Internal Type | Required? | Description |
|:---------------- |:--------------------|:--------------|:----------|:------------|
| `LoanBrokerID` | String | Hash256 | Yes | The ID of the `LoanBroker` ledger entry to withdraw from. |
| `Amount` | [Currency Amount][] | Amount | Yes | The amount of first-loss capital to withdraw. |
| `Destination` | String | AccountID | No | An account to receive the assets. |
| `DestinationTag` | Number | UInt32 | No | An arbitrary tag identifying the reason for the transaction to the destination. |
## Error Cases

View File

@@ -20,7 +20,7 @@ A loan payment has four types, depending on the amount and timing of the payment
- **Early Full Payment**: A payment that covers the outstanding principal of the loan. A `CloseInterestRate` is charged on the outstanding principal.
- **Overpayment**: A payment that exceeds the required minimum payment amount.
To see how loan payment transactions are calculated, see [transaction pseudo-code](https://github.com/Tapanito/XRPL-Standards/tree/xls-66-lending-protocol/XLS-0066-lending-protocol#a-3-loanpay-implementation-reference).
To see how loan payment transactions are calculated, see [LoanPay Implementation Reference](https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0066-lending-protocol#a-3-loanpay-implementation-reference).
## Example {% $frontmatter.seo.title %} JSON

View File

@@ -1497,7 +1497,7 @@ This amendment adds several new invariants to protect the ledger against bugs in
The Lending Protocol enables on-chain, fixed-term, uncollateralized loans using pooled funds from a Single Asset Vault. This implementation relies on off-chain underwriting and risk management to assess the creditworthiness of borrowers, but offers configurable, peer-to-peer loans.
Specification: [XLS-66](https://github.com/Tapanito/XRPL-Standards/tree/xls-66-lending-protocol/XLS-0066-lending-protocol).
Specification: [XLS-66](https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0066-lending-protocol).
### MPTokensV1