Repository navigation
docs(testnet): data retention policy, breaking-change notice period, and scoped contribution guide - #754
Merged
phertyameen merged 1 commit intoSep 27, 2026
Conversation
…ontribution guide Three policies for the testnet/ documentation tree. testnet/policies/ contained only versioning-scheme.md, so this is most of the substance of that directory. Each follows the house structure of the tree's existing documents rather than the thinness of its one sibling. testnet/policies/data-retention.md No PII or production-equivalent data on a shared, public testnet. The argument that actually persuades is up front: once written, data is irretrievable and may be preserved by third parties - explorer indexing, RPC archival, mirrors - outside the project's control, so "delete it later" is not available. Everything else follows from that. The rules are concrete rather than categorical, since vague categories are what makes policies get ignored: real names, contact and government ID numbers, addresses, payment and bank details, seed phrases, customer or employee records, medical and financial data, and live credentials. "Synthetic" is defined precisely - generated for this purpose, mapping to no real entity, and not a transformation of real data - and the document says plainly that a lightly-anonymised real customer name is still a real customer name. The metadata angle is grounded rather than asserted: several EphemeralAccount events carry addresses and amounts, so on-chain metadata really is world-readable, with testnet/registry/event-topics.md as the mechanism. The relationship to the existing no-secrets rules is stated rather than duplicated - testnet/config/README.md and testnet/security/README.md permit public on-chain identifiers, while this policy says do not associate real people with them in the first place - and the no-secrets discipline is extended, not restated. A pre-flight checklist covers the specific Bridgelet touchpoints, and the wallet-key rule is stated hard: never a mainnet key or a key holding real funds, ever. If someone discovers they have violated it, they get a concrete recovery path rather than an implied obligation. There is also an honest incident path, given that on-chain data generally cannot be deleted. testnet/policies/breaking-change-notice.md A minimum advance-notice period, with a concrete number: 7 days default and a 14-day tier, justified against a realistic consumer integration loop rather than picked as a round number. 3 days cannot fit the integration-suite cycle the period exists to protect, and promising 14 before the project has ever sustained 7 would teach integrators the changelog is advisory. The 14-day tier covers changes that fail silently - error discriminants, enum ordering, and new preconditions on all calls - because those are the ones that do not announce themselves: indexers stop matching and clients misclassify. "What counts as breaking" is derived from the real code, using the changelog's own Unreleased entry as the worked example: initialize gains an authorized_signer argument, moving from five arguments to six, so existing five-argument calls fail after redeployment. The passphrase check is the second example, since a change that only rejects testnet calls at runtime is a spectacular way to surprise an integrator. The notification channel is testnet/docs/changelog.md, whose existing "How to update this file" section and five-field entry template are reused rather than replaced by a parallel process. A notice published after the fact is not notice, and the document says so. Exemptions are enumerated honestly - an SDF-initiated reset, a security fix where notice widens exposure, a platform change outside project control - each requiring maximum-possible notice plus a prominent retrospective entry, and naming them as the cases integrators will actually be bitten by. What Is Not Decided is a real section, following the precedent of testnet/tooling/decision-log.md; inventing false certainty there would be a defect. testnet/policies/contribution-guide.md A scoped mini-guide, which is the right size of answer here: there is no top-level CONTRIBUTING.md anywhere in the repository, and .github/ contains only two workflow files - no issue template, no PR template, no CODEOWNERS. A project-wide guide would be a separate, larger piece of work, and pretending otherwise would create the confusion this document exists to prevent. The most useful section maps what belongs in each testnet/ subdirectory, read from the existing files rather than assumed, and reuses the house distinction already drawn by decision-log.md between testnet/tooling/ specs and scripts/ build scripts. The non-negotiable rules are called out separately because violating them is harmful: never claim on-chain observation (nothing is deployed), never paste a secret, verify every fact against the source and prefer the source over another document, do not edit scripts/ or tools/, and keep changes inside testnet/. That third rule names the specific traps found while writing this batch: the changelog's error-namespacing claim is not implemented in the source, and SweepController's UnauthorizedDestination = 13 leaves a gap at 12. A contributor who trusts a document over the code gets both wrong. The workflow and a definition-of-done checklist follow, plus an honest not-decided section on the tree's future shape. All three state that these are documentation and process, not enforcement: nothing is deployed, initialize cannot distinguish a synthetic address from a real one, and compliance with the notice period has no automated check. Closes bridgelet-org#658 Closes bridgelet-org#659 Closes bridgelet-org#660
|
@Fahmedo Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits. You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Three policies for the
testnet/documentation tree.testnet/policies/contained onlyversioning-scheme.md, so this is most of the substance of that directory. Each follows the house structure of the tree's existing documents rather than the thinness of its one sibling.testnet/policies/data-retention.mdtestnet/policies/breaking-change-notice.mdtestnet/policies/contribution-guide.mdversioning-scheme.mdis unmodified.scripts/,tools/,contracts/anddeployments/are untouched.data-retention.md— no PII on a shared testnetThe argument that actually persuades is up front, because a policy without it gets ignored: once written, data is irretrievable and may be preserved by third parties — explorer indexing, RPC archival, mirrors — outside the project's control. So "delete it later" is not available, and everything else follows.
The rules are concrete rather than categorical: real names, contact and government ID numbers, addresses, payment and bank details, seed phrases, customer or employee records, medical and financial data, live credentials. "Synthetic" is defined precisely — generated for this purpose, mapping to no real entity, and not a transformation of real data — with the note that a lightly-anonymised real customer name is still a real customer name.
The metadata angle is grounded rather than asserted: several
EphemeralAccountevents carry addresses and amounts, so on-chain metadata really is world-readable, withtestnet/registry/event-topics.mdas the mechanism.The relationship to the existing no-secrets rules is stated rather than duplicated —
testnet/config/README.mdandtestnet/security/README.mdpermit public on-chain identifiers, while this policy says do not associate real people with them in the first place. The no-secrets discipline is extended, not restated.A pre-flight checklist covers the specific Bridgelet touchpoints, including
recovery_address(the fallback wallet funds return to on expiry, so putting a real personal wallet there is a concrete risk). The wallet-key rule is stated hard: never a mainnet key or a key holding real funds, on testnet, ever — and if someone discovers they violated it, they get a concrete recovery path rather than an implied obligation.breaking-change-notice.md— 7 days, with a 14-day tierA concrete number, justified against a realistic consumer integration loop rather than picked as a round number. 3 days cannot fit the integration-suite cycle the period exists to protect. And promising 14 before the project has ever sustained 7 would teach integrators the changelog is advisory.
The 14-day tier covers changes that fail silently — error discriminants, enum ordering, new preconditions on all calls — because those are the ones that don't announce themselves: indexers stop matching and clients misclassify.
"What counts as breaking" is derived from the real code, using the changelog's own Unreleased entry as the worked example:
initializegains anauthorized_signerargument, moving from five arguments to six, so existing five-argument calls fail after redeployment. The passphrase check is the second example — a change that only rejects testnet calls at runtime is a spectacular way to surprise an integrator.The notification channel is
testnet/docs/changelog.md, whose existing "How to update this file" section and five-field entry template are reused rather than replaced by a parallel process. A notice published after the fact is not notice, and the document says so.Exemptions are enumerated honestly — an SDF-initiated reset, a security fix where notice widens exposure, a platform change outside project control — each requiring maximum-possible notice plus a prominent retrospective entry, and naming them as the cases integrators will actually be bitten by.
What Is Not Decidedis a real section, following the precedent oftestnet/tooling/decision-log.md; inventing false certainty there would be a defect.contribution-guide.md— scoped, because the repo needs itThere is no top-level
CONTRIBUTING.mdanywhere in the repository, and.github/contains only two workflow files — no issue template, no PR template, noCODEOWNERS. A project-wide guide would be a separate, larger piece of work, and pretending otherwise would create the exact confusion this document exists to prevent.The most useful section maps what belongs in each
testnet/subdirectory, read from the existing files rather than assumed, and reuses the distinctiondecision-log.mdalready draws betweentestnet/tooling/specs andscripts/build scripts.The non-negotiable rules are separated out because violating them is harmful: never claim on-chain observation, never paste a secret, verify every fact against the source, don't edit
scripts/ortools/, keep changes insidetestnet/.Workflow and a definition-of-done checklist follow, plus an honest not-decided section on the tree's future shape.
Repository defects found, documented rather than papered over
Beyond the two I already knew (the error-namespacing claim, the
= 13gap):#1007passphrase check andis_initialized() -> boolare not in the source. A repo-wide grep for1007|Standalone|passphraseovercontracts/andtools/returns nothing; the onlyis_initializedis an internal helper instorage.rs, not a#[contractimpl]function. Same failure mode as the namespacing claim.bridgelet_shared::passphrase::TESTNET_PASSPHRASEdoes not exist.network-config.md:97-98cites it;contracts/shared/src/contains onlylib.rsandtypes.rs.network-config.md:63saysdeployments/testnet.json"still containsnullplaceholders" — it contains four populated contract IDs and six config values. The registry conflict is real, but this characterisation of it is wrong.testnet/docs/support.mdbakes in the unimplemented namespacing — its issue template tells reporters to expectError(Contract, #2003).testnet/tooling/decision-log.md:11referencestestnet/tooling/README.mdas "the index for this directory" — the file did not exist until Ogunmepon's PR docs(testnet): tooling directory index, sweep-signer usage notes, and two tooling specs #753. Same fortestnet/config/friendbot.mdat line 93.testnet/reset/communication-template.mdpoints integrators atconfig/testnet_contracts.json— that path does not exist.cargo_descriptionand anotesfield do not exist in this repository at all.AccountInitRequestis exactly{ expiry_ledger: u32, recovery_address: Address }. The policies name these as phantom touchpoints explicitly, on the reasoning that a contributor reading a sibling document could otherwise believecargo_descriptionexists and try to document it — a policy naming non-existent arguments would be worse than one that doesn't.Verification
git statusshows exactly three new files.versioning-scheme.md,scripts/,tools/,contracts/anddeployments/are all unmodified.ls-verified.testnet/policies/has noREADME.md, so the additive-index-line allowance had nothing to apply to. I did not create one, since a fourth file is a scope decision; it is flagged as an open question instead.Closes #658
Closes #659
Closes #660