This is an automated email from the ASF dual-hosted git repository.

sbp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-releases.git


The following commit(s) were added to refs/heads/main by this push:
     new f6ed9bd  Add a note about trivial changes to test PRs and remove HTML 
note files
f6ed9bd is described below

commit f6ed9bd48093a6db3559c924ada1a360282f2c6b
Author: Sean B. Palmer <[email protected]>
AuthorDate: Tue Oct 21 14:39:41 2025 +0100

    Add a note about trivial changes to test PRs and remove HTML note files
---
 Makefile                           |   6 +-
 notes/api-security.html            |  22 ----
 notes/development.html             |  15 ---
 notes/outcome-design-patterns.html |  26 ----
 notes/plan.html                    | 239 -------------------------------------
 notes/test-user-flows.html         |  45 -------
 notes/trivial-changes.md           |   9 ++
 7 files changed, 12 insertions(+), 350 deletions(-)

diff --git a/Makefile b/Makefile
index 1462618..9203f4f 100644
--- a/Makefile
+++ b/Makefile
@@ -49,13 +49,13 @@ commit:
 
 docs:
        uv run python3 scripts/docs_check.py
-       rm -f atr/docs/*.html notes/*.html
+       rm -f atr/docs/*.html
        uv run python3 scripts/docs_build.py
-       for fn in atr/docs/*.md notes/*.md; \
+       for fn in atr/docs/*.md; \
        do \
          cmark "$$fn" > "$${fn%.md}.html"; \
        done
-       uv run python3 scripts/docs_post_process.py atr/docs/*.html notes/*.html
+       uv run python3 scripts/docs_post_process.py atr/docs/*.html
        uv run python3 scripts/docs_check.py
 
 generate-version:
diff --git a/notes/api-security.html b/notes/api-security.html
deleted file mode 100644
index c545921..0000000
--- a/notes/api-security.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<h1 id="atr-api-security-model">ATR API security model</h1>
-<p>All ATR routes, on both the website and the API, require HTTPS using TLS 
1.2 or newer for their transport.</p>
-<p>There are two access levels to the ATR API: public and committer. Public 
API endpoints are accessible to everybody. Committer endpoints have the 
following accessibility criteria instead.</p>
-<h2 id="pats">PATs</h2>
-<p>Committers must obtain a <a 
href="https://en.wikipedia.org/wiki/Personal_access_token";>Personal Access 
Token</a> (PAT) from the ATR website at the route <code>/tokens</code>. Only 
committers, signed in through <a href="https://oauth.apache.org/api.html";>ASF 
OAuth</a> to ATR, can obtain PATs. Each PAT expires in 180 days, and can be 
revoked at any time by the user at the same route. ATR does not store PATs, 
only the hashes of PATs.</p>
-<h2 id="jwts">JWTs</h2>
-<p>To make a request to a committer protected endpoint on the API, committers 
must first obtain a <a 
href="https://en.wikipedia.org/wiki/JSON_Web_Token";>JWT</a>. They can do this 
in one of two ways:</p>
-<ol>
-<li>For debugging, obtaining a JWT from the <code>/tokens</code> page.</li>
-<li>For script use, obtaining a JWT by POSTing their PAT in a JSON payload to 
the API endpoint <code>/api/jwt</code>. This is a public route, and requires a 
payload such as <code>{"asfuid": "${ASF_UID}", "pat": "${PAT_TOKEN}"}</code>. 
The response will be <code>{"asfuid": "${ASF_UID}", "jwt": 
"${JWT_TOKEN}"}</code>.</li>
-</ol>
-<p>Every JWT issued by the ATR expires in 90 minutes, uses the HS256 
(HMAC-SHA256) algorithm, and makes <code>sub</code> (ASF UID), <code>iat</code> 
(issue time), <code>exp</code> (expires at), and <code>jti</code> (token 
payload) claims. JWTs are stateless, so there is no analogue stored by the ATR, 
except for the secret symmetric key of the server which is initialised on 
startup. If the ATR server is restarted, all JWTs are expired immediately.</p>
-<p>The JWT can be used to access protected endpoints by using it in the 
<code>Authorization</code> header as a bearer token, i.e. <code>Authorization: 
Bearer ${JWT_TOKEN}</code>. PATs and JWTs must never appear in URLs. They must 
be protected by the user at all times. Accidental sharing of a PAT or a JWT 
must be reported to ASF security.</p>
-<p>Note that PATs cannot be used to access protected endpoints. They can only 
be used to issue a JWT, which is then used to access protected endpoints.</p>
-<p>Endpoints which mutate state, require significant computation, or have 
large or sensitive payloads use POST. All other endpoints use GET.</p>
-<h2 id="limitations">Limitations</h2>
-<p>We do not currently support scopes in either PATs or JWTs, but are 
considering this.</p>
-<p>Admins are able to revoke any PAT, and users are able to revoke any of 
their own PATs, but neither admins nor users are able to revoke JWTs on an 
individual basis. Restarting the server resets the server secret symmetric key, 
which has the side effect of expiring all JWTs, and can be used in an 
emergency.</p>
-<p>We do not have refresh tokens, and do not plan to implement refresh tokens. 
PATs must be used to issue a new JWT through the API.</p>
-<p>We do not presently have logging or auditing of the logging for the API. 
Once we implement logging, we must ensure that tokens and other sensitive data 
are not stored.</p>
-<p>We do not use all available JWT fields, such as <code>iss</code> 
(issuer).</p>
-<p>We do not rate limit PAT or JWT issuance.</p>
diff --git a/notes/development.html b/notes/development.html
deleted file mode 100644
index 1f6fb53..0000000
--- a/notes/development.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<h1 id="development">Development</h1>
-<p>You will need to have a working <a 
href="https://www.python.org/downloads/release/python-3132/";>Python 3.13</a> 
installation, <a href="https://docs.astral.sh/uv/";>uv</a>, <a 
href="https://github.com/FiloSottile/mkcert";>mkcert</a>, and a POSIX compliant 
<code>make</code>. To optionally build the HTML documentation files you will 
also need <a href="https://github.com/commonmark/cmark";>cmark</a>.</p>
-<p>Ensure that you have the pre-commit hook installed:</p>
-<pre><code class="language-shell">make sync PYTHON="$(which python3)"
-poetry run pre-commit install
-</code></pre>
-<p>To run the project, use the following commands, which will add a local CA 
root to your OS and browser certificate qstore if using Firefox:</p>
-<pre><code class="language-shell">uv sync --all-groups
-make certs-local
-make serve
-</code></pre>
-<p>And add the following line to your <code>/etc/hosts</code>:</p>
-<pre><code>127.0.0.1  localhost.apache.org
-</code></pre>
-<p>The website will be available at <a 
href="https://localhost.apache.org:8080/";>https://localhost.apache.org:8080/</a>
 using a self-signed certificate.</p>
diff --git a/notes/outcome-design-patterns.html 
b/notes/outcome-design-patterns.html
deleted file mode 100644
index e52a676..0000000
--- a/notes/outcome-design-patterns.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<h1 id="outcome-design-patterns">Outcome design patterns</h1>
-<p>One common pattern when designing outcome types is about how to handle an 
<strong>exception after a success</strong>, and how to handle a <strong>warning 
during success</strong>:</p>
-<ul>
-<li>An <strong>exception after a success</strong> is when an object is 
processed in multiple stages, and the first few stages succeed but then 
subsequently there is an exception.</li>
-<li>A <strong>warning during success</strong> is when an object is processed 
in multiple stages, an exception is raised, but we determine that we can 
proceed to subsequent stages as long as we keep a note of the exception.</li>
-</ul>
-<p>Both of these workflows appear incompatible with outcomes. In outcomes, we 
can record <em>either</em> a successful result, <em>or</em> an exception. But 
in exception after success we want to record the successes up to the exception; 
and in a warning during a success we want to record the exception even though 
we return a success result.</p>
-<p>The solution is similar in both cases: create a wrapper of the <em>primary 
type</em> which can hold an instance of the <em>secondary type</em>.</p>
-<p>In <em>exception after a success</em> the primary type is an exception, and 
the secondary type is the result which was obtained up to that exception. The 
type will look like this:</p>
-<pre><code class="language-python">class AfterSuccessError(Exception):
-    def __init__(self, result_before_error: Result):
-        self.result_before_error = result_before_error
-</code></pre>
-<p>In <em>warning during success</em>, the primary type is the result, and the 
secondary type is the exception raised during successful processing which we 
consider a warning. This is the inverse of the above, and the types are 
therefore inverted too.</p>
-<pre><code class="language-python">@dataclasses.dataclass
-class Result:
-    value: Value
-    warning: Exception | None
-</code></pre>
-<p>This could just as easily be a Pydantic class or whatever is appropriate in 
the situation, as long as it can hold the warning. If the warning is generated 
during an additional or side task, we can use <code>Outcome[SideValue]</code> 
instead. We do this, for example, in the type representing a linked 
committee:</p>
-<pre><code class="language-python">@dataclasses.dataclass
-class LinkedCommittee:
-    name: str
-    autogenerated_keys_file: Outcome[str]
-</code></pre>
-<p>In this case, if the autogenerated keys file call succeeded without an 
error, the <code>Outcome</code> will be an <code>OutcomeResult[str]</code> 
where the <code>str</code> represents the full path to the autogenerated 
file.</p>
diff --git a/notes/plan.html b/notes/plan.html
deleted file mode 100644
index 2f58ce7..0000000
--- a/notes/plan.html
+++ /dev/null
@@ -1,239 +0,0 @@
-<h1 id="implementation-plan">Implementation plan</h1>
-<p>This is a rough plan of immediate tasks. The priority of these tasks may 
change, and we may add or drop tasks as appropriate using a reactive 
development style.</p>
-<h2 id="ux-improvements">UX improvements</h2>
-<ol>
-<li>
-<p>Improve RC workflow</p>
-<ul>
-<li>[DONE] Allow upload of checksum file alongside artifacts and 
signatures</li>
-<li>[DONE] Add a form field to choose the RC artifact type</li>
-<li>[DONE] Allow extra types of artifact, such as reproducible binary and 
convenience binary</li>
-<li>[DONE] Differentiate between podling PPMCs and top level PMCs</li>
-<li>[DONE] Allow package deletion</li>
-<li>[DONE] Allow RCs to be deleted</li>
-<li>[DONE] Move signature verification to a task runner</li>
-<li>[DONE] Add a method to allow the bulk addition of RC artifacts</li>
-<li>Improve the existing method to allow the bulk addition of RC artifacts</li>
-<li>Add further methods to allow the bulk addition of RC artifacts</li>
-</ul>
-</li>
-<li>
-<p>Enhance RC display</p>
-<ul>
-<li>[DONE] Augment raw file hashes with the original filenames in the UI</li>
-<li>[DONE] Add file size and upload timestamp</li>
-<li>[DONE] Improve the layout of file listings</li>
-<li>[DONE] Show KB, MB, or GB units for file sizes</li>
-<li>[DONE] Add a standard artifact naming pattern based on the committee and 
project</li>
-<li>[DONE] Potentially add the option to upload package artifacts without 
signatures</li>
-<li>[DONE] Show validation status indicators</li>
-<li>[DONE] Add developer RC download buttons with clear verification 
instructions</li>
-<li>Make developer RC download buttons public for external developers</li>
-<li>Improve validation status indicators</li>
-</ul>
-</li>
-<li>
-<p>Improve key management interface</p>
-<ul>
-<li>[DONE] Display which PMCs are using each key</li>
-<li>[DONE] Add key expiration warnings</li>
-<li>[DONE] Fix reported problem with adding keys</li>
-<li>[DONE] Add debugging output error messages for when key addition fails</li>
-<li>Allow adding keys from a KEYS file</li>
-<li>Allow +1 binding voters to have their signatures added to the release</li>
-</ul>
-</li>
-<li>
-<p>Release status dashboard</p>
-<ul>
-<li>Add progress indicators for release phases</li>
-<li>Show current blockers and required actions</li>
-<li>Add quick actions for release managers</li>
-</ul>
-</li>
-<li>
-<p>General website improvements</p>
-<ul>
-<li>Add orienting style or features to improve navigability</li>
-</ul>
-</li>
-</ol>
-<p>Advanced tasks, possibly deferred</p>
-<ul>
-<li>Implement a key revocation workflow</li>
-<li>Check RC file naming conventions</li>
-<li>Add ability to sign artifact hashes on the platform using JS</li>
-</ul>
-<h2 id="task-scheduler">Task scheduler</h2>
-<p>We aim to work on the task scheduler in parallel with the UX improvements 
above. Artifact validation and the release status dashboard are dependent on 
tasks, which are managed by the task scheduler.</p>
-<ol>
-<li>
-<p>Task runner workers</p>
-<ul>
-<li>[DONE] Implement worker process with RLIMIT controls for CPU and RAM</li>
-<li>[DONE] Implement safe handling for compressed asset expansion</li>
-<li>[DONE] Test external tool use</li>
-<li>Track the duration of tasks in milliseconds</li>
-<li>Add disk usage tracking through API and psutil polling</li>
-<li>Add rollback or reporting for failed tasks</li>
-<li>Ensure idempotent operations where possible</li>
-<li>Consider distinguishing between issue and error states</li>
-<li>Use consistent task status values (pending, running, passed, issue, 
error?)</li>
-<li>Add a warning task result status</li>
-<li>Allow dependencies between tasks to reduce duplication of effort</li>
-<li>Add UI to restart all waiting workers</li>
-</ul>
-</li>
-<li>
-<p>Orchestrating manager and resource management</p>
-<ul>
-<li>[DONE] Implement process-based task isolation</li>
-<li>[DONE] Create task table in sqlite database</li>
-<li>[DONE] Add task queue management</li>
-<li>Track and limit disk usage per task in the manager</li>
-</ul>
-</li>
-<li>
-<p>Improve the task UI</p>
-<ul>
-<li>[DONE] Allow restarting all tasks when inactive</li>
-<li>Test that tasks are deleted when a package is deleted</li>
-</ul>
-</li>
-</ol>
-<p>Advanced tasks, possibly deferred</p>
-<ul>
-<li>Check fair scheduling across cores</li>
-<li>Add task monitoring and reporting</li>
-</ul>
-<h2 id="site-improvements">Site improvements</h2>
-<ol>
-<li>
-<p>Fix bugs and improve workflow</p>
-<ul>
-<li>[DONE] Add ATR commit or version number to the UI</li>
-<li>[DONE] Fix and improve the package checks summary count</li>
-<li>[DONE] Improve the proprietary platform patch in ASFQuart</li>
-<li>[DONE] Ensure that all errors are caught and logged or displayed</li>
-<li>Add further tests</li>
-<li>Decide whether to use Alembic and, if not, remove 
<code>alembic.cfg</code></li>
-</ul>
-</li>
-<li>
-<p>Ensure that performance is optimal</p>
-<ul>
-<li>[DONE] Add page load timing metrics to a log</li>
-<li>[DONE] Add a basic metrics dashboard</li>
-</ul>
-</li>
-<li>
-<p>Increase the linting, type checking, and other QA</p>
-<ul>
-<li>[DONE] Potentially add blockbuster</li>
-<li>Create website UX integration tests using a browser driver</li>
-</ul>
-</li>
-</ol>
-<p>Advanced tasks, possibly deferred</p>
-<ul>
-<li>Patch the synchronous behaviour in Jinja and submit upstream</li>
-</ul>
-<h2 id="basic-rc-validation">Basic RC validation</h2>
-<p>These tasks are dependent on the task scheduler above.</p>
-<ol>
-<li>
-<p>Basic artifact validation</p>
-<ul>
-<li>[DONE] Implement basic archive verification</li>
-<li>[DONE] Implement basic signature verification</li>
-</ul>
-</li>
-<li>
-<p>License compliance</p>
-<ul>
-<li>[DONE] Verify LICENSE and NOTICE files exist and are placed correctly</li>
-<li>[DONE] Check for Apache License headers in source files</li>
-<li>[DONE] Basic RAT integration for license header validation</li>
-</ul>
-</li>
-<li>
-<p>SBOM integration</p>
-<ul>
-<li>[DONE] Generate a basic SBOM for release artifacts</li>
-<li>Store SBOMs with release metadata</li>
-<li>Add SBOM management options to UI</li>
-<li>Ensure that release managers are made aware of SBOM quality and contents 
in the UI</li>
-<li>Add ability to upload existing SBOMs</li>
-<li>Add ability to validate uploaded SBOMs</li>
-<li><a 
href="https://github.com/apache/tooling-trusted-releases/issues/8";>Export data 
through the Transparency Exchange API</a></li>
-</ul>
-</li>
-</ol>
-<h2 id="advanced-rc-validation">Advanced RC validation</h2>
-<ol>
-<li>
-<p>Reproducible build verification</p>
-<ul>
-<li>[DONE] Accept upload of binary packages</li>
-<li>Compare built artifacts with any existing provided binary artifacts</li>
-<li>Give a detailed report of differences between user provided builds</li>
-</ul>
-</li>
-<li>
-<p>Dependency analysis</p>
-<ul>
-<li>Parse and validate dependency licenses</li>
-<li>Check for prohibited licenses</li>
-<li>Generate dependency reports</li>
-<li>Flag dependency vulnerabilities</li>
-</ul>
-</li>
-<li>
-<p>Distribution channel integration</p>
-<ul>
-<li>Add PyPI distribution support</li>
-<li>Implement Maven Central publishing</li>
-<li>Add Docker Hub integration</li>
-<li>Support test distribution channels</li>
-</ul>
-</li>
-</ol>
-<h2 id="process-automation">Process automation</h2>
-<p>These are long term implementation requirements.</p>
-<ol>
-<li>
-<p>Vote management</p>
-<ul>
-<li>Automate vote thread creation</li>
-<li>Track votes and calculate results</li>
-<li>Generate vote summaries</li>
-<li>Handle binding vs non-binding votes</li>
-<li>Display vote status and timeline</li>
-</ul>
-</li>
-<li>
-<p>Release announcement</p>
-<ul>
-<li>Template-based announcement generation with all required metadata</li>
-<li>Support customisation by PMCs</li>
-<li>Automate mailing list distribution</li>
-</ul>
-</li>
-<li>
-<p>GitHub integration</p>
-<ul>
-<li>Support GHA-based release uploads</li>
-<li>Add release tagging integration</li>
-<li>Support automated PR creation</li>
-<li>Implement security checks for GHA workflows</li>
-</ul>
-</li>
-</ol>
-<h2 id="success-metrics">Success metrics</h2>
-<ul>
-<li>Increased number of PMCs using the platform</li>
-<li>Reduction in release process duration</li>
-<li>Decreased number of failed release votes</li>
-<li>Improved compliance with ASF release policies</li>
-<li>Reduced manual intervention in release process</li>
-</ul>
diff --git a/notes/test-user-flows.html b/notes/test-user-flows.html
deleted file mode 100644
index 660e59e..0000000
--- a/notes/test-user-flows.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<h1 id="test-user-flows">Test user flows</h1>
-<p>To test the ATR, here are some example command line and GitHub user 
flows.</p>
-<h2 id="command-line">Command line</h2>
-<p>To install the <code>atr</code> command, use the <a 
href="https://github.com/apache/tooling-releases-client/tree/main?tab=readme-ov-file#quick-start";>instructions
 in the client <code>README.md</code></a>, or simply use <code>uv run 
atr</code> instead of <code>atr</code>.</p>
-<p><a href="https://release-test.apache.org/tokens";>Create a PAT</a> using the 
UI, then store the value in <code>atr</code> configuration.</p>
-<pre><code>atr set tokens.pat "$PAT_FROM_UI"
-</code></pre>
-<p>You can view the configuration file to check that the value is set. 
<strong>This will write secret values to stdout.</strong></p>
-<pre><code>atr config file
-</code></pre>
-<p>The following commands constitute roughly an entire flow, which will be 
reflected in the UI. We are using <code>tooling-test-example</code> as the 
project name. Don't forget to <a 
href="https://release-test.apache.org/project/add/tooling";>create this or 
another project</a>, or <a 
href="https://release-test.apache.org/committees";>use an existing project</a> 
as applicable. Use your ASF UID <code>@apache.org</code> instead of 
<code>example</code>.</p>
-<pre><code>atr release start tooling-test-example 0.1+demo
-
-atr upload tooling-test-example 0.1+demo example.txt ../example.txt
-
-atr check wait tooling-test-example 0.1+demo -i 25
-
-atr check status tooling-test-example 0.1+demo
-
-atr release info tooling-test-example 0.1+demo
-
-atr vote start tooling-test-example 0.1+demo 00002 -m [email protected]
-
-atr vote resolve tooling-test-example 0.1+demo passed
-
-atr distribution record tooling-test-example 0.1+demo NPM None react 18.2.0 
False False
-
-atr release info tooling-test-example 0.1+demo
-
-atr announce tooling-test-example 0.1+demo 00003 -m [email protected] -s 
Subject -b Body
-</code></pre>
-<p>When finished with an example flow, it is recommended that you delete the 
version.</p>
-<pre><code>atr dev delete tooling-test-example 0.1+demo
-</code></pre>
-<p>If there is ever a problem with a JWT verification, try refreshing your 
JWT.</p>
-<pre><code>atr jwt refresh | wc
-</code></pre>
-<h2 id="github-actions">GitHub actions</h2>
-<p>We use <a href="https://github.com/apache/tooling-asf-example";>the 
<code>tooling-asf-example</code></a> repository to check our GitHub actions.</p>
-<p>First, <a href="https://release-test.apache.org/";>start a new release in 
the ATR web UI</a>.</p>
-<p>You can then use the <a 
href="https://github.com/apache/tooling-asf-example/actions/workflows/build-and-rsync-to-atr.yaml";><code>build-and-rsync-to-atr.yaml</code></a>
 workflow to build Python wheel files and upload them to the ATR.</p>
-<p>Then, start a vote in the ATR web UI. This cannot be linked here because 
the URL will depend on which project and version you use.</p>
-<p>Use the <a 
href="https://github.com/apache/tooling-asf-example/actions/workflows/resolve-vote-on-atr.yaml";><code>resolve-vote-on-atr.yaml</code></a>
 workflow to resolve the vote.</p>
-<p>Use the <a 
href="https://github.com/apache/tooling-asf-example/actions/workflows/record-distribution-on-atr.yaml";><code>record-distribution-on-atr.yaml</code></a>
 workflow to record an external distribution. The external distribution 
<em>must exist</em> on the distribution platform, because the ATR fetches real 
metadata.</p>
-<p>Use the <a 
href="https://github.com/apache/tooling-asf-example/actions/workflows/announce-release-on-atr.yaml";><code>announce-release-on-atr.yaml</code></a>
 workflow to announce the release and copy the files into the download area.</p>
diff --git a/notes/trivial-changes.md b/notes/trivial-changes.md
new file mode 100644
index 0000000..532efcd
--- /dev/null
+++ b/notes/trivial-changes.md
@@ -0,0 +1,9 @@
+# How to make a trivial change in ATR
+
+Sometimes it is necessary to make a trivial change in ATR to e.g. test pull 
request workflows or lints.
+
+The recommended approach for doing so is to update the following timestamp:
+
+1761155762
+
+By changing the timestamp in this file, it makes it clear that the intent of 
your change was to make a trivial change. Please also describe the wider intent 
of the change in your comment message subject.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to