Repository navigation
Releases: Open-Factory-Digital/openfactory-core
Release list
v0.6.0
Install
curl -fsSL https://openfactory.digital/install.sh | shRe-running the installer with --force is the upgrade path: every value in .env.compose is kept, credentials included, and only the pinned version moves.
Images published for this tag (linux/amd64, linux/arm64):
ghcr.io/open-factory-digital/openfactory-worker:v0.6.0ghcr.io/open-factory-digital/openfactory-sandbox:v0.6.0ghcr.io/open-factory-digital/openfactory-cli:v0.6.0
Verify the assets below with sha256sum -c SHA256SUMS --ignore-missing.
Highlights
- One release a week. The cut and the first candidate on Monday, the final on Wednesday. What is merged by Monday's cut ships that Wednesday; what is not ships the week after (#530).
openfactory certify: a deployment's evidence pack.openfactory certify deploymentwrites the pack a deployment submits to the implementation partner program: its controls computed from the deployment and its diagnostics, redacted so the practitioner is the only name it carries, and re-read before it is written; nothing is written without--yes.openfactory doctor --jsonandopenfactory box status --jsonare the versioned documents it carries. The pack is not signed yet, and says so (#549).
New behaviour
- The PyPI page describes the project. It says what OpenFactory is and is not, how to run it on one machine or as a team deployment with Docker, where each coding agent stands and what the extras add, and the suite holds every claim on it true (#368).
- A release's notes are in
CHANGELOG.md, and on its page. Each pull request carries the line the notes will read for it, as a fragment inchanges/. The final release assembles them intoCHANGELOG.md, and its GitHub page carries them under the install block. A candidate's page carries the notes so far (#517). - Installing a given version, and backing up before a candidate. (#530)
- The README says how to install a specific version or a release candidate: by name, with
--version. A candidate is installed only that way. - docs/RELEASING.md says how to back up an installation before trying a candidate, and how to go back: the two files, the Docker volumes and the two host directories the stack writes, with the commands.
- The README says how to install a specific version or a release candidate: by name, with
openfactory doctorsees a container filling up with processes. The new checkpid_headroomreads what the container it runs in and the panel hold against theirpids.max. It fails at half of it, at a hundred zombies, or when a running container is asked and does not answer, and it gives the repair. Each line names the container as its service declares it, with the newOPENFACTORY_ROLEthat the compose file sets toworkerandpanel(#532).- Autonomy has a number.
openfactory autonomyand the dashboard's metrics read from each card's record how many merged cards reached the merge untouched, the rework per merged card, the repair depth, and why cards parked, classified from the recorded note. Cards whose record does not hold their start are counted apart and enter no rate, and a store that cannot be read is said, never shown as zero (#545). openfactory explainshows where every instruction a ticket's passes receive comes from. For a checkout, it lists in the order a job inlines them the role prompts, the constraints, each framework guideline with what the project's profile did to it, the operator's and the project's guidelines and the document index, read from the job's own context building so it cannot disagree with what a job receives;--fullprints each block. The developer guide that teaches it is run by the suite (#548).- The evidence pack reads the forge. What protects the branch the platform merges into, what the credential a job holds is granted and which releases of the platform are published are read from each project's forge, read-only; what the forge cannot answer is
unknown, never a pass (#553). openfactory certify verifychecks a pack offline, and the pack measures its outcomes.verifychecks a pack the way the submissions bot does, its files, schema, checksums, signature and every threshold, each reported by id. The pack's outcomes over its window, from jobs and how they ended to cost per merged ticket, are read from the journals and the metrics store: a measure that cannot be read is null with its reason, never zero (#554).- The panel's page can be turned off.
OPENFACTORY_DEFAULT_FRONT_END=offserves the API, its two streams, the sign-in and the previews, and no page, for a deployment with screens of its own built on the same API. It isonby default, so an upgrade keeps the panel, andopenfactory initwrites the line (#611). - The API a screen of your own can rely on is documented.
docs/reference/the-front-end-api.mdlists every route with the area a credential must hold, the three ways to present a credential, the refusals and the streams. A test keeps it equal to the code, and the panel uses nothing outside it (#612). - A credential for the board, and the product owner reads the board.
OPENFACTORY_BOARD_TOKENS/OPENFACTORY_BOARD_TOKENandopenfactory people invite --boardissue a credential for the board and the rest of the floor, which is refused the product owner's area by name. The panel token stays the administrator's and reaches both, and inviting somebody stays the administrator's. A product credential now reads the board of a project with a product role, read only (#613). - The address decides which page opens, not the credential.
/p/<project>/boardis the board and/product/<project>is the product owner's page, whoever opens them. The product owner reaches the board read only, from their page's Board tab. A board credential that opens the product owner's page is told it is refused, and given the way to its board. A page whose credential changes under it in another tab opens again as the page that credential may see (#614). - The product owner can put a card in the queue from their own page. A card nobody has started, opened on the product owner's page (from its Board tab, or from the board they read since #562), offers Queue it, in the board's own name for the queue. The page asks first, because from the queue the factory picks the card up and starts spending. The press is the row a yes to a queue proposal already reached (
product_promote), with the same gate: only a person listed among the product's admins may start work. Anyone else sees, in place of the button, that starting is an approver's yes (#637).
Fixes
- A confirmed queue runs in the order a person approved. The factory did not necessarily start with the first card of a confirmed queue: the local board served the queue by card number, and on Jira moving a card into the queue left its rank where it was. The cards are now ranked on the board in the approved order, and the reply says when a board cannot rank or refused a rank (#512).
- Every answer to the product role's writes speaks the conversation's language. Refining, closing, removing, correcting or aligning a card, a capability, a breakdown, a queue and the release's refusals answered in Portuguese only, and some named a Jira card
#KEY; they now answer in the conversation's language and name a card as its tracker does (#513). - On Jira, a backlog order is stated by the cards' keys. The order a person confirmed in the conversation was read as digits only, so an order of Jira keys could not be stated; it is now read by the tracker's own keys (#515).
- A card in a column no stage is is refused with the line that maps it. On an Azure DevOps board with a stock process every new work item lands in
New, which maps to no stage, and the first card's queueing was refused in English with no fix named. The refusal now speaks the conversation's language and gives the tracker option line that maps the column, quoted as the registry takes it, andopenfactory doctornames every unmapped column and a board with no backlog (#521). - The installer's preflight reaches Docker Desktop's daemon. On macOS with Docker Desktop the preflight said the daemon did not answer, one step after the installer had pulled every image through it, and skipped the two checks that need it: the preflight's container was given the host socket's group, while Docker Desktop hands a container a socket owned by group 0. The installer now gives it the group a container sees, and a refused socket is named as a refusal, not as a daemon that gave no answer (#529).
- A release candidate's page installs the candidate. It printed the one-line install, which installs the latest final release, so the page of v0.5.0-rc.1 told its testers to install v0.4.2. A candidate's page now gives its own installer with
--version, the upgrade of an existing installation with--force, and the way back. A final's page gives the one-line install (#531). - The worker and the panel reap the processes they inherit. Their PID 1 was our Python process, which reaps no orphan, so every child git's detached maintenance left behind stayed a zombie for the container's life: a panel ran out of processes after 39 hours of use and read the engine as unreachable until it was restarted. Every container whose PID 1 is ours now starts an init:
init: trueindocker-compose.yml,docker run --initfor the box, andtinias the worker and sandbox images' entrypoint, for a runtime that adds none (#532). - Forgetting a project closes the engine runs that still held what was said. After
project forgetorproject forget-conversations, the product's conversation runs in the durable engine stayed open, holding the forgotten messages and replies where the engine's retention never reaches them. Both commands now close the product's conversation runs that no turn is at work in, andproject forgetthe project's tech-lead run too; the report says when their history expires, ...
v0.6.0-rc.2
Install this release candidate
This is a pre-release, for testing. The one-line install keeps installing the latest final release. To install this candidate, name it:
curl -fsSL https://github.com/Open-Factory-Digital/openfactory-core/releases/download/v0.6.0-rc.2/install.sh -o install.sh
sh install.sh --version v0.6.0-rc.2To upgrade an existing installation to it (every value in .env.compose is kept; only the pinned version moves):
sh install.sh --version v0.6.0-rc.2 --dir <the installation's directory> --forceGoing back to the last final release is the same command with its tag, and it is not rehearsed: take a backup of the installation first.
What to test, and where to report it: the tracking issue Release 0.6.0 in this repository's issues.
The wheel: pip install openfactory==0.6.0rc2.
Images published for this tag (linux/amd64, linux/arm64):
ghcr.io/open-factory-digital/openfactory-worker:v0.6.0-rc.2ghcr.io/open-factory-digital/openfactory-sandbox:v0.6.0-rc.2ghcr.io/open-factory-digital/openfactory-cli:v0.6.0-rc.2
Verify the assets below with sha256sum -c SHA256SUMS --ignore-missing.
The notes of 0.6.0 so far, from the pull requests this candidate carries. The final release's page carries them as they are published.
Highlights
- One release a week. The cut and the first candidate on Monday, the final on Wednesday. What is merged by Monday's cut ships that Wednesday; what is not ships the week after (#530).
openfactory certify: a deployment's evidence pack.openfactory certify deploymentwrites the pack a deployment submits to the implementation partner program: its controls computed from the deployment and its diagnostics, redacted so the practitioner is the only name it carries, and re-read before it is written; nothing is written without--yes.openfactory doctor --jsonandopenfactory box status --jsonare the versioned documents it carries. The pack is not signed yet, and says so (#549).
New behaviour
- The PyPI page describes the project. It says what OpenFactory is and is not, how to run it on one machine or as a team deployment with Docker, where each coding agent stands and what the extras add, and the suite holds every claim on it true (#368).
- A release's notes are in
CHANGELOG.md, and on its page. Each pull request carries the line the notes will read for it, as a fragment inchanges/. The final release assembles them intoCHANGELOG.md, and its GitHub page carries them under the install block. A candidate's page carries the notes so far (#517). - Installing a given version, and backing up before a candidate. (#530)
- The README says how to install a specific version or a release candidate: by name, with
--version. A candidate is installed only that way. - docs/RELEASING.md says how to back up an installation before trying a candidate, and how to go back: the two files, the Docker volumes and the two host directories the stack writes, with the commands.
- The README says how to install a specific version or a release candidate: by name, with
openfactory doctorsees a container filling up with processes. The new checkpid_headroomreads what the container it runs in and the panel hold against theirpids.max. It fails at half of it, at a hundred zombies, or when a running container is asked and does not answer, and it gives the repair. Each line names the container as its service declares it, with the newOPENFACTORY_ROLEthat the compose file sets toworkerandpanel(#532).- Autonomy has a number.
openfactory autonomyand the dashboard's metrics read from each card's record how many merged cards reached the merge untouched, the rework per merged card, the repair depth, and why cards parked, classified from the recorded note. Cards whose record does not hold their start are counted apart and enter no rate, and a store that cannot be read is said, never shown as zero (#545). openfactory explainshows where every instruction a ticket's passes receive comes from. For a checkout, it lists in the order a job inlines them the role prompts, the constraints, each framework guideline with what the project's profile did to it, the operator's and the project's guidelines and the document index, read from the job's own context building so it cannot disagree with what a job receives;--fullprints each block. The developer guide that teaches it is run by the suite (#548).- The evidence pack reads the forge. What protects the branch the platform merges into, what the credential a job holds is granted and which releases of the platform are published are read from each project's forge, read-only; what the forge cannot answer is
unknown, never a pass (#553). openfactory certify verifychecks a pack offline, and the pack measures its outcomes.verifychecks a pack the way the submissions bot does, its files, schema, checksums, signature and every threshold, each reported by id. The pack's outcomes over its window, from jobs and how they ended to cost per merged ticket, are read from the journals and the metrics store: a measure that cannot be read is null with its reason, never zero (#554).- The panel's page can be turned off.
OPENFACTORY_DEFAULT_FRONT_END=offserves the API, its two streams, the sign-in and the previews, and no page, for a deployment with screens of its own built on the same API. It isonby default, so an upgrade keeps the panel, andopenfactory initwrites the line (#611). - The API a screen of your own can rely on is documented.
docs/reference/the-front-end-api.mdlists every route with the area a credential must hold, the three ways to present a credential, the refusals and the streams. A test keeps it equal to the code, and the panel uses nothing outside it (#612). - A credential for the board, and the product owner reads the board.
OPENFACTORY_BOARD_TOKENS/OPENFACTORY_BOARD_TOKENandopenfactory people invite --boardissue a credential for the board and the rest of the floor, which is refused the product owner's area by name. The panel token stays the administrator's and reaches both, and inviting somebody stays the administrator's. A product credential now reads the board of a project with a product role, read only (#613). - The address decides which page opens, not the credential.
/p/<project>/boardis the board and/product/<project>is the product owner's page, whoever opens them. The product owner reaches the board read only, from their page's Board tab. A board credential that opens the product owner's page is told it is refused, and given the way to its board. A page whose credential changes under it in another tab opens again as the page that credential may see (#614). - The product owner can put a card in the queue from their own page. A card nobody has started, opened on the product owner's page (from its Board tab, or from the board they read since #562), offers Queue it, in the board's own name for the queue. The page asks first, because from the queue the factory picks the card up and starts spending. The press is the row a yes to a queue proposal already reached (
product_promote), with the same gate: only a person listed among the product's admins may start work. Anyone else sees, in place of the button, that starting is an approver's yes (#637).
Fixes
- A confirmed queue runs in the order a person approved. The factory did not necessarily start with the first card of a confirmed queue: the local board served the queue by card number, and on Jira moving a card into the queue left its rank where it was. The cards are now ranked on the board in the approved order, and the reply says when a board cannot rank or refused a rank (#512).
- Every answer to the product role's writes speaks the conversation's language. Refining, closing, removing, correcting or aligning a card, a capability, a breakdown, a queue and the release's refusals answered in Portuguese only, and some named a Jira card
#KEY; they now answer in the conversation's language and name a card as its tracker does (#513). - On Jira, a backlog order is stated by the cards' keys. The order a person confirmed in the conversation was read as digits only, so an order of Jira keys could not be stated; it is now read by the tracker's own keys (#515).
- A card in a column no stage is is refused with the line that maps it. On an Azure DevOps board with a stock process every new work item lands in
New, which maps to no stage, and the first card's queueing was refused in English with no fix named. The refusal now speaks the conversation's language and gives the tracker option line that maps the column, quoted as the registry takes it, andopenfactory doctornames every unmapped column and a board with no backlog (#521). - The installer's preflight reaches Docker Desktop's daemon. On macOS with Docker Desktop the preflight said the daemon did not answer, one step after the installer had pulled every image through it, and skipped the two checks that need it: the preflight's container was given the host socket's group, while Docker Desktop hands a container a socket owned by group 0. The installer now gives it the group a container sees, and a refused socket is named as a refusal, not as a daemon that gave no answer (#529).
- A release candidate's page installs the candidate. It printed the one-line install, which installs the latest final release, so the page of v0.5.0-rc.1 told its testers to install v0.4.2. A candidate's page now gives its own installer with
--version, the upgrade of an existing installation with--force, and the way back. A final's page gives the one-line install (#531). - The worker and the panel reap the processes they inherit. Their PID 1 was our Python process, which reaps no orphan, so every child git's detached ...
v0.6.0-rc.1
Install this release candidate
This is a pre-release, for testing. The one-line install keeps installing the latest final release. To install this candidate, name it:
curl -fsSL https://github.com/Open-Factory-Digital/openfactory-core/releases/download/v0.6.0-rc.1/install.sh -o install.sh
sh install.sh --version v0.6.0-rc.1To upgrade an existing installation to it (every value in .env.compose is kept; only the pinned version moves):
sh install.sh --version v0.6.0-rc.1 --dir <the installation's directory> --forceGoing back to the last final release is the same command with its tag, and it is not rehearsed: take a backup of the installation first.
What to test, and where to report it: the tracking issue Release 0.6.0 in this repository's issues.
The wheel: pip install openfactory==0.6.0rc1.
Images published for this tag (linux/amd64, linux/arm64):
ghcr.io/open-factory-digital/openfactory-worker:v0.6.0-rc.1ghcr.io/open-factory-digital/openfactory-sandbox:v0.6.0-rc.1ghcr.io/open-factory-digital/openfactory-cli:v0.6.0-rc.1
Verify the assets below with sha256sum -c SHA256SUMS --ignore-missing.
The notes of 0.6.0 so far, from the pull requests this candidate carries. The final release's page carries them as they are published.
Highlights
- One release a week. The cut and the first candidate on Monday, the final on Wednesday. What is merged by Monday's cut ships that Wednesday; what is not ships the week after (#530).
openfactory certify: a deployment's evidence pack.openfactory certify deploymentwrites the pack a deployment submits to the implementation partner program: its controls computed from the deployment and its diagnostics, redacted so the practitioner is the only name it carries, and re-read before it is written; nothing is written without--yes.openfactory doctor --jsonandopenfactory box status --jsonare the versioned documents it carries. The pack is not signed yet, and says so (#549).
New behaviour
- The PyPI page describes the project. It says what OpenFactory is and is not, how to run it on one machine or as a team deployment with Docker, where each coding agent stands and what the extras add, and the suite holds every claim on it true (#368).
- A release's notes are in
CHANGELOG.md, and on its page. Each pull request carries the line the notes will read for it, as a fragment inchanges/. The final release assembles them intoCHANGELOG.md, and its GitHub page carries them under the install block. A candidate's page carries the notes so far (#517). - Installing a given version, and backing up before a candidate. (#530)
- The README says how to install a specific version or a release candidate: by name, with
--version. A candidate is installed only that way. - docs/RELEASING.md says how to back up an installation before trying a candidate, and how to go back: the two files, the Docker volumes and the two host directories the stack writes, with the commands.
- The README says how to install a specific version or a release candidate: by name, with
openfactory doctorsees a container filling up with processes. The new checkpid_headroomreads what the container it runs in and the panel hold against theirpids.max. It fails at half of it, at a hundred zombies, or when a running container is asked and does not answer, and it gives the repair. Each line names the container as its service declares it, with the newOPENFACTORY_ROLEthat the compose file sets toworkerandpanel(#532).- Autonomy has a number.
openfactory autonomyand the dashboard's metrics read from each card's record how many merged cards reached the merge untouched, the rework per merged card, the repair depth, and why cards parked, classified from the recorded note. Cards whose record does not hold their start are counted apart and enter no rate, and a store that cannot be read is said, never shown as zero (#545). openfactory explainshows where every instruction a ticket's passes receive comes from. For a checkout, it lists in the order a job inlines them the role prompts, the constraints, each framework guideline with what the project's profile did to it, the operator's and the project's guidelines and the document index, read from the job's own context building so it cannot disagree with what a job receives;--fullprints each block. The developer guide that teaches it is run by the suite (#548).- The evidence pack reads the forge. What protects the branch the platform merges into, what the credential a job holds is granted and which releases of the platform are published are read from each project's forge, read-only; what the forge cannot answer is
unknown, never a pass (#553). openfactory certify verifychecks a pack offline, and the pack measures its outcomes.verifychecks a pack the way the submissions bot does, its files, schema, checksums, signature and every threshold, each reported by id. The pack's outcomes over its window, from jobs and how they ended to cost per merged ticket, are read from the journals and the metrics store: a measure that cannot be read is null with its reason, never zero (#554).- The panel's page can be turned off.
OPENFACTORY_DEFAULT_FRONT_END=offserves the API, its two streams, the sign-in and the previews, and no page, for a deployment with screens of its own built on the same API. It isonby default, so an upgrade keeps the panel, andopenfactory initwrites the line (#611). - The API a screen of your own can rely on is documented.
docs/reference/the-front-end-api.mdlists every route with the area a credential must hold, the three ways to present a credential, the refusals and the streams. A test keeps it equal to the code, and the panel uses nothing outside it (#612). - A credential for the board, and the product owner reads the board.
OPENFACTORY_BOARD_TOKENS/OPENFACTORY_BOARD_TOKENandopenfactory people invite --boardissue a credential for the board and the rest of the floor, which is refused the product owner's area by name. The panel token stays the administrator's and reaches both, and inviting somebody stays the administrator's. A product credential now reads the board of a project with a product role, read only (#613). - The address decides which page opens, not the credential.
/p/<project>/boardis the board and/product/<project>is the product owner's page, whoever opens them. The product owner reaches the board read only, from their page's Board tab. A board credential that opens the product owner's page is told it is refused, and given the way to its board. A page whose credential changes under it in another tab opens again as the page that credential may see (#614). - The product owner can put a card in the queue from their own page. A card nobody has started, opened on the product owner's page (from its Board tab, or from the board they read since #562), offers Queue it, in the board's own name for the queue. The page asks first, because from the queue the factory picks the card up and starts spending. The press is the row a yes to a queue proposal already reached (
product_promote), with the same gate: only a person listed among the product's admins may start work. Anyone else sees, in place of the button, that starting is an approver's yes (#637).
Fixes
- A confirmed queue runs in the order a person approved. The factory did not necessarily start with the first card of a confirmed queue: the local board served the queue by card number, and on Jira moving a card into the queue left its rank where it was. The cards are now ranked on the board in the approved order, and the reply says when a board cannot rank or refused a rank (#512).
- Every answer to the product role's writes speaks the conversation's language. Refining, closing, removing, correcting or aligning a card, a capability, a breakdown, a queue and the release's refusals answered in Portuguese only, and some named a Jira card
#KEY; they now answer in the conversation's language and name a card as its tracker does (#513). - On Jira, a backlog order is stated by the cards' keys. The order a person confirmed in the conversation was read as digits only, so an order of Jira keys could not be stated; it is now read by the tracker's own keys (#515).
- A card in a column no stage is is refused with the line that maps it. On an Azure DevOps board with a stock process every new work item lands in
New, which maps to no stage, and the first card's queueing was refused in English with no fix named. The refusal now speaks the conversation's language and gives the tracker option line that maps the column, quoted as the registry takes it, andopenfactory doctornames every unmapped column and a board with no backlog (#521). - The installer's preflight reaches Docker Desktop's daemon. On macOS with Docker Desktop the preflight said the daemon did not answer, one step after the installer had pulled every image through it, and skipped the two checks that need it: the preflight's container was given the host socket's group, while Docker Desktop hands a container a socket owned by group 0. The installer now gives it the group a container sees, and a refused socket is named as a refusal, not as a daemon that gave no answer (#529).
- A release candidate's page installs the candidate. It printed the one-line install, which installs the latest final release, so the page of v0.5.0-rc.1 told its testers to install v0.4.2. A candidate's page now gives its own installer with
--version, the upgrade of an existing installation with--force, and the way back. A final's page gives the one-line install (#531). - The worker and the panel reap the processes they inherit. Their PID 1 was our Python process, which reaps no orphan, so every child git's detached ...
v0.5.0
Install
curl -fsSL https://openfactory.digital/install.sh | shImages published for this tag (linux/amd64, linux/arm64):
ghcr.io/open-factory-digital/openfactory-worker:v0.5.0ghcr.io/open-factory-digital/openfactory-sandbox:v0.5.0ghcr.io/open-factory-digital/openfactory-cli:v0.5.0
Verify the assets below with sha256sum -c SHA256SUMS --ignore-missing.
OpenFactory 0.5.0
Highlights
- The requester can say "not yet" and "that's it" where they asked.
- From the conversation, or from the card on the product page, they send their change back for another pass, with corrected acceptance criteria.
- Each pass runs the project's gates before anything is pushed.
- Their "that's it" is recorded against the head they tried in the preview, and shown to whoever merges. When the preview look is the only thing holding the merge, it lets the factory merge (#474, #471, #483).
- A review approves only what something executed. The review's stance is computed from the gates that ran, not from the reviewer's decision word.
- A change whose acceptance criteria nothing executed reads NOT VERIFIED.
- The requester is told to check it themselves.
- It is never auto-merged (#451).
- A card has one lifecycle.
- ADR-0055 gives a card one door, one table of what follows each change, and one record (#415).
- The endings a person causes now go through that door, so every place that depends on the card hears the same thing (#455).
- A job's endings, filing and edits, the box's outcomes, a requirement's promise and the requester's whole loop follow. No card is written outside the door any more (#524: #458, #504, #509, #523, slice 6).
- Boards are spoken to in their own words.
- Previews open where they should.
openfactory project forgetforgets a project in one command, layer by layer through each store's own API, after taking a backup (#472).
The product role and the requester's loop
- Another pass, from the conversation or the card.
- When a requester says what is still wrong with a change that waits on them, the role stages a proposal (
[[AJUSTE: #N]]) with the criteria the next pass must meet. - Their yes corrects the card first, then sends the pass on the same pull request.
- The card on the product page offers Send back for another pass for the same act.
- It may be done by the card's requester, a product admin, or an operator the row vouches for (#474).
- When a requester says what is still wrong with a change that waits on them, the role stages a proposal (
- The number of passes is the project's. It is
adjust_passesin the project's registry entry: 2 when unset, clamped to 0–10. Past it, a person decides, and the requester is told so when they ask (#474). - Every pass runs the project's gates before it is pushed. If a gate stays red, the pass is held and nothing is pushed: the pull request and its preview stay as they were (#471).
- "That's it" is recorded (#483).
- The role stages the acceptance (
[[ACEITE: #N]]) against the head the requester tried in the preview. If the preview was rebuilt from another head since, the yes is refused. - The person merging sees "accepted by on " on the floor bar, in the inbox and in the tech-lead's view.
- With
merge_policy: autoand a required preview, the yes lets the factory merge when the look was the only hold. - The requester is told when the change goes in, whoever merged it.
- The role stages the acceptance (
- Comments on the pull request reach the adjust pass.
- A new
addressverb (floor, admin) reads the comments that still stand: unresolved GitHub threads and a standing changes-requested review, or active and pending Azure DevOps threads. - It sends them into an adjust pass, from the same budget.
- The local forge is refused by name (#473).
- A new
- The review's stance is computed from executed evidence (#451).
- A failed criterion rejects.
- Criteria checked only by reading the code give NOT VERIFIED, and the requester is told to check before approving.
- When the reviewer names a check no gate runs, that becomes the suggested next step: wire it into a gate.
- A plain card the role files opens its delivery loop, so the person who asked for it is told when it is ready (#486).
- A card is written in the language of the conversation, and so is everything said around it.
- The shipped card layouts are English by default, with a pt-BR layout beside them.
- A product's own
cards/template.<language>.mdorcards/template.mdstill takes precedence (#432).
- A staged defect and the role's prose agree on the next step. The defect's frame claims a broken promise only when the defect names a requirement (#431).
- (#524: #508) Staging belongs to the requester.
- They hear in their own conversation that the change is staged, and are asked there.
- By default their "it works" is recorded, and a product admin releases, seeing that they tried it. With
release_by_requester: truein the registry, their word releases it. - A "not yet" at the last gate becomes another pass, as a new change.
- (#524: #503, #522) Delivered means delivered.
- "It is ready, did it work?" is said when the change reaches the last stage the project declares, not at the merge.
- With a watched
post_merge_deploy, the card waits In review until the deploy is green. A red deploy, or one never seen to finish, holds the card in Needs Action. - "It didn't work" stages a defect linked to the delivered card.
--promoteon a manifest that declares only a watchedpost_merge_deploywaits for the deploy, instead of ending at an empty promotion.
- (#524: slice 6) The requester's whole loop is recorded on the card. Their "not yet" before and after the merge, their "that's it", the merge, staging, their verdict at the last gate, the release and the delivery are each one transition in the card's record. The requester is told each one once.
The card's lifecycle
- ADR-0055: a card has one lifecycle (#415).
- One door, over a closed set of events.
- A pure table of what is allowed and what follows.
- One ordered record per card.
- The door's comment, the same on every tracker row.
- Slice 1: the endings a person causes go through the door (#455).
- The endings are discard, skip, stop, close, withdraw, remove and reopen.
- Each is recorded once. What follows is applied from the table through the tracker, the promises ledger, the requester's conversation, the preview and the board snapshot, and what failed is applied again on the hourly round.
- A card that is gone cancels the promises that waited on it alone. Discard, skip and stop keep the promise open.
- The requester is told once per transition.
- The Pending tab shows only what waits on the person. What the role owes is one line on the card.
- A run that is no longer live stops asking for a person, in the inbox and in the tech-lead's chat (#465).
- (#524: #458) Slice 2 and part A of slice 3.
- The sweeps ask the door before they act:
- an answered question never puts a gone card back in the queue;
- a card closed as not planned is never filed as delivered;
- a stopped job's journal says how it ended.
- A job's park and settle go through the door.
- An adjust pass tells the requester "pass N is ready", numbered.
- Filing, queueing and edits go through the door, and every tracker row leaves only the door's comment.
- A change made on the vendor's own screen is observed and its consequences follow, where the row can report it.
- The sweeps ask the door before they act:
- (#524: #504, #509, #523) Part B of slice 3.
- The box writes only progress marks and hands its outcomes back. The worker applies them through the door.
- A split, a question, the ready-for-you telling and the delivery are door transitions, with one announcer for deliveries.
- A requirement's promise is recorded on each card of its breakdown, and opens its delivery loop once. No writer of a card is left outside the door, and the test that guards it allows no exception.
- (#524: slice 6) The requester's loop goes through the door (ADR-0055 amended 2026-10-05). The rows added are resumed, accepted, merged, staged, stage_rejected, released, and delivered from a merged or staged card. The box's production gate is a staged card, no longer a parked one.
Boards and trackers (Jira, Azure DevOps, GitHub, local)
- The board's own column names. The product role queues and files cards in the board's own columns, where every such move used to be refused (#505). That covers:
- Jira's
status_map; - GitHub's
columns:; - Azure DevOps' stock
To Do; - a renamed local board.
- Jira's
- Jira:
- A product over several repositories: a requirement's delivery is followed on qualified refs (#493), and a card in another repository of the product is seen delivered (#499).
- A backlog reorder confirmed in the conversation reaches the board. It used to be refused on every board, including the three that rank (#516).
- The local board: Done means delivered (#506).
- A card the factory finishes is closed as delivered at Done, and announced.
- Moving it out of Done reopens it. A card closed as not delivered stays that way through any...
v0.5.0-rc.1
Install this release candidate
This is a pre-release, for testing. The usual one-line install keeps installing the latest final release (v0.4.2). To install this candidate, name it:
curl -fsSL https://github.com/Open-Factory-Digital/openfactory-core/releases/download/v0.5.0-rc.1/install.sh -o install.sh
sh install.sh --version v0.5.0-rc.1To upgrade an existing installation to it (keeps every value in .env.compose, moves only the pinned version):
sh install.sh --version v0.5.0-rc.1 --dir <the installation's directory> --forceThe wheel: pip install openfactory==0.5.0rc1. Going back to v0.4.2 (--version v0.4.2 --force) is not rehearsed: take a backup of the installation first. What to test and how to report it: the release tracking issue, #525.
Images published for this tag (linux/amd64, linux/arm64):
ghcr.io/open-factory-digital/openfactory-worker:v0.5.0-rc.1ghcr.io/open-factory-digital/openfactory-sandbox:v0.5.0-rc.1ghcr.io/open-factory-digital/openfactory-cli:v0.5.0-rc.1
Verify the assets below with sha256sum -c SHA256SUMS --ignore-missing.
What's Changed
- A staged defect's frame and the model's prose agree on the next step (#430) by @robertocsp in #431
- A card is written in the conversation's language, and so is everything said around it (#429) by @robertocsp in #432
- An Azure DevOps description is measured in the vendor's unit, UTF-16 code units (#433) by @robertocsp in #434
- A sentence the product role writes on its own reads right without its signature (#436) by @robertocsp in #438
- The product page's Board is read again when the role speaks and when it is opened (#440) by @robertocsp in #441
- A preview lands on the service the repository builds, or the one the shape declares (#435) by @robertocsp in #442
- A recreated panel is put back on every live preview's edge network (#446) by @robertocsp in #449
- The product page shows buttons only for the proposal the server says is waiting (#443) by @robertocsp in #450
- The review's stance is computed from executed evidence, not the reviewer's decision word (#447) by @robertocsp in #451
- ADR-0055: a card has one lifecycle — one door, one table of what follows, one record (#411) by @robertocsp in #415
- The suite must not read the operator's own ~/.openfactory/ by @hermesfelipe in #454
- A private key is read one way whatever its case: a variant spelling is private and nobody's (#347) by @robertocsp in #461
- A second answer to a proposal whose first answer is still running waits for it and reads its outcome (#456) by @robertocsp in #459
- preflight names a declared work directory compose cannot bind, rather than blaming $HOME (#367) by @robertocsp in #460
- No harness hands its prompt to the command line, at any door, on any platform (#326) by @robertocsp in #462
- The ready-for-you message carries the preview's link while one is up by @robertocsp in #470
- A terminated run stops asking for a person once a later run of its ticket ended it (#339) by @robertocsp in #465
- The doctor sees a guideline committed as a link out of the repository (#350) by @robertocsp in #466
- The suite's installer guard finds a driver by what it does, written the way this repository writes one (#334) by @robertocsp in #468
- A card proposal's confirmation button approves that card and no other (#475) by @robertocsp in #478
- The inlined documents are measured as the pass measures them: box prove's profile, a component's guidelines, the note's line (#416, #417, #418) by @robertocsp in #467
- A person's adjust pass runs the project's gates before it is pushed, and a red one is held (#448) by @robertocsp in #471
- A card the product role files as a plain card opens its delivery loop where it was asked (#481) by @robertocsp in #486
- The ready-for-you message waits for a preview that starts itself, instead of asking for it (#437) by @robertocsp in #439
- The preview and card links the product role sends open for the person they are sent to (#444) by @robertocsp in #445
- A project is forgotten in one command, every layer through its own store (#453) by @robertocsp in #472
- No gh call acts on a repository it was not given, and the suite has no gh login to act with (#488) by @robertocsp in #489
- On Jira, a card the product role files is placed and a reported defect is followed (#479) by @robertocsp in #487
- What the product role waits for from a person is read from the store by whichever process the answer reaches (#452) by @robertocsp in #476
- A change to the product's shape is previewed with its own shape once a product admin allows it (#348) by @robertocsp in #477
- What people wrote on the pull request reaches the adjust pass without being retyped (#330) by @robertocsp in #473
- A card's endings that a person causes go through one door, with one table of what follows and one record (#412) by @robertocsp in #455
- The requester sends their change back for another pass from the conversation and the card, and the number of passes is the project's (#448) by @robertocsp in #474
- Only a conversation that said something becomes a distillate by @hermesfelipe in #494
- A backlog reorder confirmed in the conversation reaches the board through the watched writes by @robertocsp in #516
- A forgotten project forgets who let its changes preview with their own shape by @robertocsp in #495
- Three review follow-ups: the bounded-tail tests on a loaded runner, the sentence and the start agree, no gh flag is guessed by @robertocsp in #490
- A requirement's delivery is followed on the tracker's own refs, not on the ones that are numbers (#485) by @robertocsp in #493
- A card the factory finished on the local board is announced as delivered, and the panel shows it in Done by @robertocsp in #506
- The requester's yes is recorded against the head they tried, the person merging sees it, and it lets the factory merge when the look is all that holds it (#448) by @robertocsp in #483
- A card in another repository of the product is seen delivered by @robertocsp in #499
- A queue confirmed on Jira says which cards it queued by @robertocsp in #498
- The product role queues and files a card by the board's own name for the column by @robertocsp in #505
- A forgotten project forgets who accepted its changes, and main is green again by @robertocsp in #519
- The release process is written down, a candidate is published as a pre-release, and an agent runs it by @robertocsp in #510
- On Jira, every sentence names a card as Jira does, and the board's refusals speak the conversation's language by @robertocsp in #514
- A stage counts as reached only on what was observed, and a manifest whose stages nothing would observe is refused by @robertocsp in #520
- The queue's readers and the role's sentences read the board's own column names by @robertocsp in #507
- The rest of 0.5.0 in one: the card's lifecycle has one door and no exception, and the requester's whole loop walks through it by @robertocsp in #524
- Th...
v0.4.2
Install
curl -fsSL https://openfactory.digital/install.sh | shImages published for this tag (linux/amd64, linux/arm64):
ghcr.io/open-factory-digital/openfactory-worker:v0.4.2ghcr.io/open-factory-digital/openfactory-sandbox:v0.4.2ghcr.io/open-factory-digital/openfactory-cli:v0.4.2
Verify the assets below with sha256sum -c SHA256SUMS --ignore-missing.
Upgrade now if you run the compose stack
This release fixes GHSA-px5j-qmj9-37gc
(high). On every compose install up to 0.4.1, the durable engine and its UI were published on all
interfaces with no authentication. Anyone who reached them, from the network or from code running
in the stack's own boxes, could read every workflow's history, cancel any run, and approve a
production release or answer a merge gate. An install whose firewall admits nothing inbound was
exposed from inside its own boxes too.
Re-run the installer with --force to upgrade. Every value in .env.compose is kept, and only the
pinned version moves. Until you do, the advisory's Workarounds close the ports without upgrading.
What 0.4.2 carries
Security
- The engine, its UI and the panel are published on loopback only, and a human gate acts only on a sealed answer (GHSA-px5j-qmj9-37gc). On every compose install up to 0.4.1, the unauthenticated engine was reachable from the network, and from code running in the stack's own boxes: anyone who reached it could approve a production release or answer a merge gate. Upgrade notes: a panel served to other machines needs
PANEL_BINDand a TLS proxy or VPN in front of it. A deployment whose panel and worker share no disk (a hosted worker) must set the sameOPENFACTORY_GATE_SECRETon both, or every approval and merge answer is refused;openfactory doctorchecks that the two agree.
The factory runs on a hosted machine
- A project registered by URL is cloned with the credential its adapter mints (#378, in #379).
- The worktree box holds the Path it declares, so a judging role can stage its prompt (#380, in #382). On 0.4.1 every product and tech-lead turn died on this.
The product role writes cards a developer can act on
- Every card the product role creates is drafted from the conversation, checked by a floor, judged against a rubric, and shown whole before the yes (#383 and #392, in #390; ADR-0054). This covers requested cards, defects and a requirement's cards. The template and rubric are overridable per product in its context repository.
- A malfunction is a defect whether or not a requirement names it (#399, in #400).
- A file sent in a conversation is handed to every later turn of that conversation (#381, in #391).
The person is told what is happening
- A turn says what it is doing while the person waits (#395, in #398).
- The product role tells the requester when the change is theirs to try, and the agenda speaks their language (#401, in #406).
- A clicked yes is answered once, however many times the page catches up (#402, in #407).
- A turn retried after a worker loss records the person's message once (#394, in #397).
The board stays true
- A card nobody has started is closed or removed from the card itself, on both surfaces (#384, in #389).
- A board whose whole read is cheap is read whole on every call, so the product role sees a change another process made (#393, in #396).
- A discarded pull request sends its card back to the backlog (#409, in #410).
Previews (in #408)
- A preview starts itself when the pull request opens, and its link is posted on the card and in the requester's conversation (#405).
- A card's pull request is recorded in the forge's repository, not the tracker's namespace (#403).
- A failed preview is said on the card (#404).
Diagnostics
- Doctor and box prove say how many bytes a project's documents would inline (#370).
The suite
- Five intermittent tests had their causes found and fixed. In each, the test waited on or counted the wrong thing; none was a product race (#419 in #420; #421, #422, #423, #425 in #424).
- Every test leaves the environment as it found it (#426, in #427).
What's Changed
- The worktree box holds the Path it declares, so a judging role can stage its prompt by @robertocsp in #382
- A project registered by URL is cloned with the credential its adapter mints by @robertocsp in #379
- A file sent in a product conversation is handed to every later turn of that conversation (#381) by @robertocsp in #391
- A board whose whole read is cheap is read whole on every call, so a change another process made is seen on the next read (#393) by @robertocsp in #396
- A turn retried after a worker loss records the person's message once, and keeps the answer the person was shown (#394) by @robertocsp in #397
- A malfunction is a defect whether or not a requirement names it (#399) by @robertocsp in #400
- A clicked yes is answered once, however many times the page catches up (#402) by @robertocsp in #407
- Doctor and box prove say how many bytes a project's documents would inline by @hermesfelipe in #370
- A card nobody has started is closed, or removed, from the card itself on both surfaces (#384) by @robertocsp in #389
- A turn says what it is doing while the person waits, and a turn past its bound is still at work (#395) by @robertocsp in #398
- The product role tells the requester when the change is theirs to try, and its agenda speaks their language (#401) by @robertocsp in #406
- A discarded pull request sends its card back to the backlog, saying who decided (#409) by @robertocsp in #410
- The proxy-refusal test's server never stops listening, so the probe cannot lose a request to it (#419) by @robertocsp in #420
- Four tests waited on the wrong event and now wait on the one they mean (#421, #422, #423, #425) by @robertocsp in #424
- A card the product role opens is drafted from the conversation, judged against a rubric, and shown whole before the yes (#383) by @robertocsp in #390
- Every test leaves os.environ as it found it, whatever the code under test wrote (#426) by @robertocsp in #427
- A preview starts itself, names the forge's repository, and says why it failed by @robertocsp in #408
- The package declares 0.4.2 by @robertocsp in #428
Full Changelog: v0.4.1...v0.4.2
v0.4.1
Install
curl -fsSL https://openfactory.digital/install.sh | shImages published for this tag (linux/amd64, linux/arm64):
ghcr.io/open-factory-digital/openfactory-worker:v0.4.1ghcr.io/open-factory-digital/openfactory-sandbox:v0.4.1ghcr.io/open-factory-digital/openfactory-cli:v0.4.1
Verify the assets below with sha256sum -c SHA256SUMS --ignore-missing.
What's Changed
- A mutation row's label says what its cut does, and the row the label meant is added (review of #351) by @robertocsp in #352
- A declared work directory is checked like a kept one, and refused by name (#367) by @robertocsp in #371
- What a turn leaves on the worker is bounded, and an unmoved source costs one question (#369) by @robertocsp in #372
- A hosted worker uses the identity its host has, and the doctor reports the source the adapter uses (#373) by @robertocsp in #374
- A box reaches the metadata endpoint only when the endpoint answers as itself (#376) by @robertocsp in #377
- The package declares 0.4.1, the three changes since 0.4.0 by @robertocsp in #375
Full Changelog: v0.4.0...v0.4.1
v0.4.0
Install
curl -fsSL https://openfactory.digital/install.sh | shImages published for this tag (linux/amd64, linux/arm64):
ghcr.io/open-factory-digital/openfactory-worker:v0.4.0ghcr.io/open-factory-digital/openfactory-sandbox:v0.4.0ghcr.io/open-factory-digital/openfactory-cli:v0.4.0
Verify the assets below with sha256sum -c SHA256SUMS --ignore-missing.
What this release is about
Forty changes. They close the twenty-eight issues of the 0.4.0 milestone and nine older ones,
among them all seven that 0.3.0 listed as known and not in that release. Most of them are one idea:
nothing becomes the product's until a person who may say yes has seen it.
A change was judged on its diff, and the merge was the last point the factory controlled: after it,
the client's own pipeline takes the change where nothing can take it back. A request typed in a
shared room could be confirmed by any admin's typed yes. A card closed when a merge was asked for, not
when one happened. Each of those now waits: for a person to look, for the requester's own yes, for
the forge to say the merge happened.
A preview before the merge
- A card can be opened as the whole product, with its change in it, before its pull request
merges (#265, ADR-0050). The project says how the product runs in apreview:block of its
manifest. Everything that grants something is the operator's, set withopenfactory project set-preview:
whether a preview is required, how long it lives, which values reach it. A person starts it from
the card, and one click opens every exposed service at a host of its own. - Only what the change touched is built from the change, and everything else runs from the base.
Every service runs with all capabilities dropped, with limits, and with none of the factory's
credentials. - The compose files are read from the base branch, never from the change. A compose file is
written in the repository the agent edits, and running the change's own would run whatever it
declared: a privileged service, the host's network, the daemon's socket. The base's is admitted
key by key, and what no preview needs is refused. A change that edits the compose file is
previewed with the base's version, and the preview says so. It never merges by itself, and its
pull request lists every file a preview will read once it merges, with a hash of each, for the
person who merges it. The next preview after the merge runs the new shape. - A product that spans repositories is previewed as one requirement, each changed service built
from its own repository's pull request, and nothing outside the product's declared sources reaches
it. - A repository that cannot say how it runs gets its shape drafted from its own files, each line
cited, on a pull request of its own (openfactory preview propose) that nothing builds before a
person merges it. - With
required: true, the factory never merges that project by itself: the person who merges
is the acknowledgement. A preview ends when its time is up or when every pull request of its change
has merged or closed. On one machine previews are off by default.
The product role, rebuilt
- Every surface talks to one turn engine through one door (#266, ADR-0051). The panel, the CLI
and a chat add-on reached four partial copies of the conversation, and a yes typed on the panel
confirmed nothing. Conversations now run side by side, one turn at a time inside each. Two registry
projects that point at one context repository are one product, with one memory. - What becomes work passes one lock per product. A requirement number is minted once, and the
same request from two conversations is one card; the second person is pointed to it and never
told who asked. In a room, what a person stages waits for their own yes (#266). - The panel is a chat on every page, filtered per person, and a message carries the page it was
written on, so "why did this stop?" asked on a card is answered about that card. The core names no
chat vendor: a chat add-on maps its users to people of the platform (#266). - The role knows what the panel shows of the product, except what an exclusion list names,
starting with spend (#267, ADR-0052). Every answer carries a briefing with a source and an age on
each line, and a delivered card is announced in its requester's conversation when it is delivered. - The role opens every repository the product declares, read-only and sparse, and names the one
it could not open. A map of components, APIs, events, databases and queues is derived without a
model, each entry cited to its file and commit, and checked against the code on every turn (#268). - Every document in the context repository is read once per version, and one that cannot be read
says why (#269, ADR-0053). One index per product finds it by words, meaning and date, and a
superseded decision is shown only under what replaced it. What a quiet conversation agreed,
refused and left open is distilled into the context repository, naming nobody. - Found while pinning the old conversation, and fixed: a typed no was recorded as an approval
(#272), a refused "it works" still closed the release question (#273), an expiry notice repeated
(#274), and two intake cases opened in one millisecond shared an id (#280).
The product owner's page
- The page is a full-screen chat with sessions (#335). One's own conversations sit beside the
project's room, and their owner can rename or delete them; delete erases, and what a conversation
already became in the product stays. The role is called Nina unless the registry names it
(openfactory product name). - The role knows what day it is. Every line carries when it was said, and the prompt carries
today's date and how long it has been since the previous message. It used to answer "as we agreed
yesterday" after five days (#335). - A file can be handed to the role in the conversation: a screenshot, a PDF, a Word, Excel or
PowerPoint file. The turn reads it as quoted material, and it stays in its conversation. "File into
the product" commits it tofrom-chat/in the context repository, recording who brought it, when
and from where; that is a write, so it is a product admin's. "Discard" takes a file out of a
conversation after a confirmation. The Documents tab follows the context repository's folders,
with search, download and "Ask" (#336). - Whoever talks to the product role reads every document the product exposes. This is the
product owner's decision of 2026-09-25, and it removes the restriction by audience label that
ADR-0053 had put on what the role reads. A person's conversation stays private, and only the
product's admins can make anything be recorded (#336). - The published worker image searches by meaning and reads scanned PDFs, with a pinned,
checksum-verified embedding model and OCR in Portuguese and English.openfactory doctorsays, per
product, whether search is by meaning or by words and how documents are read, and a slow search is
logged (#337).
Cards, merges and cost
-
A card closes only after its work merges: the workflow waits for the forge to report the pull
request merged (#180). -
Only a failing blocking build is broken code. An advisory check no longer starts a CI repair,
and a pull request whose checks never ran is kept off the automatic merge; after a grace period the
decision goes to a person (#184). -
A ticket with an open pull request is never restarted from base (#302), and a later attempt
rewrites the pull request's title and body to describe its current head (#304). -
A ticket costs one number, and every surface says it. The review, a pass that paused and a CI
repair reach the pull request's Cost line, the journal and/api/jobs; a cost nobody reported
stays unknown, never $0.00 (#257, #262, #310). -
A card is named in the forge only where the forge owns it (#167), and accepting an entry read
from the code files no work, while a person's request does (#182). -
A deployment has one home for an organisation's guidelines,
OPENFACTORY_GUIDELINES_DIR,
inlined into every job between the framework's baseline and the project's own (#318). -
CONTRIBUTING says how to get a green suite, and the suite can no longer write into a
contributor's registry (#260). -
A card that names its base starts from that base. A ticket's
base_branch, the way to stack
work on a predecessor still in review, is read from the forge when the worker's clone does not
hold it, and a base the forge does not have is refused by name instead of failing on git's own
sentence. With a forge, both boxes read the base from the forge first, and the job's diff is
measured from the commit it started from. Once a predecessor merges and its branch is deleted,
the next card's repair is refused by name until the card is moved to the new base (#354). -
A large prompt reaches the box off the command line. Claude, Codex, OpenCode and the reviewer
now hand their prompt to the box through a file it stages, so a project's own documents no longer
make a job die with "argument list too long". A prompt nothing can carry, such as a Kimi prompt
past Linux's 128 KiB per-argument limit, is refused by name before the job starts (#349, #360).
What 0.3.0 left known
Four places where a failed read still passed for an answer are closed, among them an Azure DevOps
answer with no collection in it, which could end in a policy-bypassing merge (#249–#252). A card can
be closed on a deployment with no durable engine (#243), and a vendor's remedy is said by its own row
(#232). In the same family, a failed read no longer paints the floor empty (#298), and a
manifest_path outside the repository is refused before anything is written (#259).
Hardening
- **The panel's credential cook...
v0.3.0
Install
curl -fsSL https://openfactory.digital/install.sh | shImages published for this tag (linux/amd64, linux/arm64):
ghcr.io/open-factory-digital/openfactory-worker:v0.3.0ghcr.io/open-factory-digital/openfactory-sandbox:v0.3.0ghcr.io/open-factory-digital/openfactory-cli:v0.3.0
Verify the assets below with sha256sum -c SHA256SUMS --ignore-missing.
Upgrade first if you are on 0.2.0 or older
v0.2.1 carried a single change: the fix for GHSA-fcvg-j4mw-5qv6 (high, CVSS 8.3), where an
unreadable people store answered "nobody is registered" and the panel served every /api/ route,
every mutating action and both streams unauthenticated. Everything in 0.3.0 sits on top of
that fix. A deployment on 0.2.0 or older is in the affected range until it upgrades.
What this release is about
Thirty-five changes, twenty-seven issues. Almost all of them are one idea applied in twenty
places: an answer this factory cannot give is said out loud, instead of being rounded down to
"no".
A store that will not answer is not an empty store. A board that could not be read is not a board
with nothing on it. A branch whose gates the doctor could not see is not a branch that needs no
human. Every one of those used to be a quiet, confident, wrong sentence — and a few of them
opened gates.
A read that failed says so
- The doctor never says "no gate needs a person" about a branch whose gates it could not see
(#206), and it judgesmerge_policy: autofrom the gates the forge actually listed, in one
finding instead of two contradicting each other (#225). It also names the merge gates only a
person can settle, before the first card meets them (#184) — the contradiction an enterprise
hits, which otherwise surfaces as a job parked on a timeout. - An approver store that cannot be read authorizes nobody, and says which file and what to do
about it (#236). The approver verbs ask which store the deployment actually reads, and
approver addrefuses to write to a file nothing will read (#202). - A declined read is said where it is read — on the budget's hover text and in the tech-lead
chat (#223) — rather than rendered as a zero.
Cards close for what they are
- A card in Done closes as delivered; everything else closes as withdrawn, and only a card a
job may actually be on is told to stop one (#162). - A withdrawn card on Jira lands in the status that site uses for it and reads back as not
delivered (#203, #219). A card that was split counts as delivered only when its children are
(#229). - On GitHub, a card delivered through a pull request in another repository is closed by its
tracker row (#180). The board row says which neutral stage its own column is, so a card on a
Jira board can be edited and closed (#231).
The panel
- It serves without the engine's client library installed, and what genuinely needs the engine
says so in a sentence instead of failing to import (#178). - It never reads a refusal as an answer, and a session finally has a way out of the page (#181).
- A project nobody registered is a 404 in one sentence from every route, never a 500 (#204).
- A stream ends when the credential that opened it stops being good (#208).
- The floor's budget read left the panel's event loop: once for everybody waiting, and bounded
(#240).
One client, not one per question
The tech-lead asks the engine on a loop that outlives the question, so N questions hold one client
(#147); a process delivering production approvals keeps one (#201); an activity uses the client
its worker already holds (#217); and readers of the intake memo arriving together share one read,
each handed its own copy (#165).
The words an agent is given
One author writes the close of a repair brief — the caller, who knows what the words are (#205) —
and the same is now true of the order of a recovery and of a resume, with what the stopped run
said kept inside a data fence (#221). A hold the factory made says what it is, instead of having
its cause read back out of its own prose (#234).
Starting a deployment
A deployment's addresses have one owner, and openfactory up tells you what it started and where
it put it (#183). A worker started beside its engine waits for the engine to listen, and says so
when it never does (#135). A name nobody registered is refused a removal, by the registry and by
the verb (#138).
Eleven of these are not closed yet, on purpose
#167, #168, #169, #170, #171, #172, #180, #181, #182, #183 and #184 were found on a running
deployment, so they are closed when somebody confirms them on one — not when the pull request
lands. Each one now carries its own "How to verify" steps as a comment on the issue. This
release is what makes running them possible.
Known, and not in this release
- #227 — the socket's handshake is still its own copy of the auth gate.
- #232 — the doctor,
product declareand the panel still choose a vendor's sentence in
generic code. - #243 — a card in a running column cannot be closed on a deployment that runs no durable
engine. - #249–#252 — four places found after this release was cut where a failed read is still
answered as an ordinary "nothing", including one that can end in a policy-bypassing merge on
Azure DevOps (#249). None is a regression; all predate this release.
What's Changed
- Accepting what the code already does records the promise and files nothing by @robertocsp in #187
- What the card shows inside a bullet is what the factory reads, wrapped with or without an indent by @robertocsp in #190
- A project nobody registered is a 404 in one sentence from every route, never a 500 by @robertocsp in #212
- An activity uses the engine client its worker already holds by @robertocsp in #218
- Readers of the intake memo arriving together share one read, and each is handed its own copy by @robertocsp in #185
- The tech-lead asks the engine on a loop that outlives the question, so N questions hold one client by @robertocsp in #186
- A deployment's addresses have one owner, and openfactory up tells what it starts where it put it by @robertocsp in #188
- A name nobody registered is refused a removal, by the registry and by the verb by @robertocsp in #189
- A card in Done is closed as delivered, and only a card a job may be on is told to stop one by @robertocsp in #191
- The panel never reads a refusal as an answer, and a session has a way out of the page by @robertocsp in #192
- The panel serves without the engine's client library, and what is the engine's says so in a sentence by @robertocsp in #193
- A delivered GitHub card is closed by its tracker row, whatever repository the pull request opened in by @robertocsp in #195
- The doctor names the merge gates only a person settles, before the first card meets them by @robertocsp in #200
- A worker started beside its engine waits for the engine to listen, and says so when it never does by @robertocsp in #196
- A review verdict nobody answers is said so inside the read deadline, and the inbox asks only the jobs it shows by @robertocsp in #239
- A process that delivers production approvals keeps one engine client, not one per approval by @robertocsp in #209
- On GitHub the doctor never says "no gate needs a person" about a branch whose gates it could not see by @robertocsp in #210
- The approver verbs ask which store the deployment reads, and
approver addrefuses a file nothing reads by @robertocsp in #211 - A withdrawn card is closed on Jira as not delivered, and generic code closes through one seam by @robertocsp in #213
- A CI is called what its own row says, and the view keeps no table of provider names by @robertocsp in #216
- A stream ends when the credential that opened it stops being good by @robertocsp in #214
- The attended half reaches the sink without the engine's client, and a sweep holds every other reach by @robertocsp in #194
- An approver store that cannot be read authorizes nobody, and says which file and what to do about it by @robertocsp in #237
- A withdrawn card on Jira lands in the status the site uses for it, and reads back as not delivered by @robertocsp in #220
- A declined read is said where it is read: the budget's hover text and the tech-lead chat by @robertocsp in #224
- The doctor judges
merge_policy: autofrom the gates its forge listed, in one finding by @rob...
v0.2.1
Install
curl -fsSL https://openfactory.digital/install.sh | shImages published for this tag (linux/amd64, linux/arm64):
ghcr.io/open-factory-digital/openfactory-worker:v0.2.1ghcr.io/open-factory-digital/openfactory-sandbox:v0.2.1ghcr.io/open-factory-digital/openfactory-cli:v0.2.1
Verify the assets below with sha256sum -c SHA256SUMS --ignore-missing.
What's Changed
- The box proof's remedy names the binary the shell could not find, not the wrapper by @robertocsp in #116
- A scripted init is refused once, naming every answer it still owes by @robertocsp in #117
- The poller can be held, and the hold says what it does not do by @robertocsp in #118
- Every block of the brief says who wrote it, and whether it binds by @robertocsp in #108
- The board keeps your place — a tick that changed nothing repaints nothing by @robertocsp in #111
- installer: state the runtime, so an install with no terminal completes by @hermesfelipe in #120
- The first hour on one machine, walked again — five things it still got wrong by @robertocsp in #109
- A manifest can be measured on its branch, before it is merged by @robertocsp in #119
- The extra-CA no-op is actually a no-op, so the agent can reach the API by @robertocsp in #124
- fix(panel): show requirement diagnostics and findings by @mikemikimike in #127
- The installer's own guards can run on the machine a maintainer sits at by @robertocsp in #128
- The release assembly runs on both seds by @robertocsp in #132
- The proof reads the trust file it is told to load, instead of its name by @robertocsp in #130
- Something finally asks the agent, and reads the reply by @robertocsp in #133
- A pull request on the local forge is read and merged where it is by @robertocsp in #141
- A baseline the old pull-request row stranded can be proposed again by @robertocsp in #143
- A proposal whose base moved still lands on the local forge by @robertocsp in #144
- The panel holds one engine client instead of opening one per request by @hermesfelipe in #145
- A proposal into a base that does not exist yet lands again, and Merge says only what is true by @robertocsp in #148
- A reverse-engineered candidate's Why says what its evidence found by @robertocsp in #151
- A card can be corrected, taken off the board, and put back by @robertocsp in #153
- One scenario is one criterion, and the queue asks the parser what the gate asks by @robertocsp in #154
- The page writes a card the gate takes, and says so before it is saved by @robertocsp in #155
- The product owner corrects a card the product role opened by @robertocsp in #157
- A fresh install's metrics store reads as empty, not as unreadable by @robertocsp in #158
- The processes openfactory up starts end together, however the supervisor ends by @robertocsp in #160
- An engine that does not answer is said so quickly, instead of holding the panel by @robertocsp in #161
- The floor's schedule read is paid on a clock, not on every engine frame by @hermesfelipe in #152
- product init writes a sources: list its own check accepts, however the forge spells a repository by @robertocsp in #173
- The engine starts only beside the library its worker runs on by @robertocsp in #174
- A promotion chain the box cannot walk is refused before the first card by @robertocsp in #175
- The doctor asks the vendor's row whether a forge credential exists by @robertocsp in #177
- A job on the worktree box starts from the base the forge holds, not the copy last fetched by @robertocsp in #176
- A card is named in the forge's own terms only where the forge owns the card by @robertocsp in #179
- The notes from the reviews of #158, #160 and #161 by @robertocsp in #164
- A failing check is read for what it is: only a blocking check about the code, with its log, is repaired by @robertocsp in #197
New Contributors
- @mikemikimike made their first contribution in #127
Full Changelog: v0.2.0...v0.2.1