# PRD — Webformulys

Evidence date: 2026-09-28.

Source: `git@bitbucket.org:overdrive/webformulys.git`, `main` at `b94306f` (2024-04-03).

There is no prior PRD in the source repository or in Silicon Ark. The repository has no README and no application. Requirements below are recovered from `.gitignore` and `bitbucket-pipelines.yml`. Provenance is labelled. Pipeline secret values are not in git.

## Product purpose

**Unknown.** Nothing in the repository states what Webformulys does, who uses it, or which problem it solves.

**Implemented.** The repository holds a default ignore file and a Bitbucket Pipelines definition. The pipeline comments describe a Node.js build template that validates code. The script builds with npm and FTP-pushes to a path ending in `pestelite.overdriveqa.co.za`.

**Unknown / Requires Confirmation:** whether Webformulys is an unstarted product, a placeholder repository, or a deploy hook for another product (the path names Pestelite).

## Users and roles

| Actor | Evidence | Status |
|---|---|---|
| Repository creator | Commit `71d3c3f`, Lloyd | **Implemented** as git history only |
| Pipeline author | Commit `b94306f`, Abdurahmaan Ismail | **Implemented** as git history only |
| Deploy operator | Pipeline variables `FTP_USERNAME_QA` / `FTP_PASSWORD_QA` | **Inferred** from the FTP step. No user interface |
| End user of a Webformulys product | No screen, API, or role in the tree | **Unknown** |

No login, session, permission, or role check exists.

## Systems the product talks to

The pipeline, if it ran, would talk to:

1. npm, via `npm install` and `npm run build`, inside image `node:16`.
2. An FTP server at `$FTP_HOST_QA`, path `public_html/pestelite.overdriveqa.co.za`, using `git ftp push`.

There is no database, identity provider, mail sender, queue, or HTTP API in this repository.

Whether Bitbucket has the three FTP variables configured is **Unknown / Requires Confirmation**.

## Major workflows

### WF-1 — Commit to the repository

**Implemented** as ordinary git history. Two commits exist, both on `main`. No pull-request pipeline, default pipeline, or tag pipeline is defined, so a commit to `main` does not start the file's steps.

### WF-2 — Build on `master`

**Implemented** in YAML. **Not exercisable** from the current branch set.

Trigger: a pipeline run for branch `master`.

Steps:

1. `npm install` (inline comment: "required to install zip").
2. `npm run build`.
3. Publish directory artifact `build/**`.

Inputs expected and missing from git: `package.json`, a `build` script, and any source the build would compile.

The comment above the pipeline says the workflow runs tests and linting. No test or lint command is in the script.

### WF-3 — FTP publish

**Implemented** in YAML as the second step. **Not exercisable** for the same reason as WF-2, and the script does not install `git-ftp`.

Trigger: step 1 of the `master` pipeline completed.

Command:

```text
git ftp push -u "$FTP_USERNAME_QA" -p "$FTP_PASSWORD_QA" ftp://$FTP_HOST_QA/public_html/pestelite.overdriveqa.co.za
```

Expected result, if the command were run on a tree that contained only the committed files: an FTP upload toward that path. What `git ftp` would upload, and whether the `build/**` artifact would be included, is **Inferred** and needs confirmation — `git ftp push` follows the git tree, and `build/**` is an uncommitted pipeline artifact. The destination path names Pestelite, not Webformulys.

Failure behaviour is not defined. There is no retry, notification, or deployment environment block.

## Functional requirements

### FR-001 — Keep a Bitbucket repository named Webformulys

**Implemented.**

Remote: `git@bitbucket.org:overdrive/webformulys.git`. Default branch: `main`. Tip: `b94306f`.

Evidence: `git remote`, `origin/HEAD`.

### FR-002 — Ignore common generated files

**Implemented** as Bitbucket's unmodified example `.gitignore`.

The header says the list should be customized for the project. Patterns cover `node_modules/`, `dist/`, `*.class`, `*.py[cod]`, `*.log`, `*.jar`, Maven `target/`, `.idea/`, `TEST*.xml`, `.DS_Store`, `Thumbs.db`, `*.app`, `*.exe`, `*.war`, and several video and TIFF extensions.

This file is not evidence that the product uses Node, Java, Python, and Maven together. Provenance of the patterns: **Implemented** template. Provenance of a chosen stack: **Unknown**.

Evidence: `.gitignore`, commit `71d3c3f`.

### FR-003 — Run the pipeline on the default branch

**Documented** in a comment. **Not implemented.**

The file comment says the workflow runs on the default branch. The key under `pipelines.branches` is `master`. `origin/HEAD` is `main`. There is no `default:` pipeline and no `pull-requests:` pipeline.

Evidence: `bitbucket-pipelines.yml` lines 4 and 10; branch list.

### FR-004 — Build a Node project and keep `build/**`

**Implemented** as script text. **Cannot succeed** on the current tree.

Image: `node:16`. Commands: `npm install`, then `npm run build`. Artifact: `build/**`.

There is no `package.json`. `npm install` has no project to install. The inline comment says npm install is required to install zip. The script never calls `zip`.

Evidence: `bitbucket-pipelines.yml`.

### FR-005 — Publish over FTP to the Pestelite QA path

**Implemented** as script text.

The second step runs `git ftp push` with username `FTP_USERNAME_QA`, password `FTP_PASSWORD_QA`, and URL `ftp://$FTP_HOST_QA/public_html/pestelite.overdriveqa.co.za`.

Protocol in the URL is FTP. The YAML does not install `git-ftp`. Variable values are not in the repository.

**Unknown / Requires Confirmation:** that this host and path are the Webformulys QA site.

Evidence: `bitbucket-pipelines.yml`.

### FR-006 — Validate code with tests and linting

**Documented** in the template comment. **Not implemented.**

The comment says the template validates Node.js code and allows tests and linting. The script has no test command, no linter, and no test files exist.

Evidence: `bitbucket-pipelines.yml` lines 1–4 versus the `script:` lists.

### FR-007 — SonarQube scan from the repository root

**Not in git.**

The task-creation scan named `sonar-project.properties` and `sonarqube_scan.bat`. Neither path exists in `71d3c3f` or `b94306f`. The pipeline does not call a scanner.

Provenance: **Unknown / Requires Confirmation.**

## Validation and errors

No application validation exists. No error contract, status code, or user-facing message is defined.

Pipeline failure modes visible from the file, without a successful run to observe:

- Push to `main` does not select the `master` pipeline.
- `npm install` / `npm run build` have no `package.json`.
- `git ftp` is not installed by the script.
- Missing `FTP_*` variables would expand empty in the command. Bitbucket's behaviour for unset variables is **Unknown** from this tree.

## Constraints

- Node image pin: `node:16`. Node 16 was already end-of-life when this file was committed (2024-04-03). Whether the image still resolves is **Unknown / Requires Confirmation**.
- Deploy transport in the URL is unencrypted FTP.
- Credentials are pipeline variables, not files in git. That is the only secret-handling pattern present.
- No application data model, retention rule, or privacy constraint is written down.

## Requirements that are assumptions

Treating Webformulys as a Node.js application because the pipeline image is `node:16` would be an assumption. The image is a template choice. The repository contains no Node source.

Treating the FTP path as a Webformulys environment would also be an assumption. The path string is `pestelite.overdriveqa.co.za`.

Both are **Unknown / Requires Confirmation**.
